[英]Docker compose: services cannot connect to each other
我一直在關注有關docker服務和集群的本教程 。 但是我在不同的Docker容器之間建立網絡時遇到了一些麻煩。
以下是我docker-compose.yml
文件,它基本上包含兩個服務。 一個只是連接到兩個網絡的redis映像(盡管第二個目前尚無用)。 另一個是我的應用程序,需要連接到Redis。 因此,我選擇為redis服務提供一個靜態IP。
version: "3"
services:
my_redis:
image: redis
ports:
- "6379:6379"
networks:
first_network:
ipv4_address: 172.20.1.1
second_network:
ipv4_address: 172.30.1.1
my_app:
build:
context: .
dockerfile: Dockerfile_my_app
image: my_app_image
depends_on:
- my_redis
deploy:
replicas: 1 # 4
networks:
- first_network
networks:
first_network:
ipam:
config:
- subnet: 172.20.1.0/24
second_network:
ipam:
config:
- subnet: 172.30.1.0/24
以下是my_app
Dockerfile:
FROM python:3.7
WORKDIR /app
COPY . /app
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt
CMD ip a && wait-for-it.sh 172.20.1.1:6379 && PYTHONPATH=. python3 my_app.py
現在我遇到的問題是由於某種原因,我的應用程序無法連接到redis服務。 所以我嘗試了以下方法:
sudo docker run -p 6379:6379 redis
,然后使用wait-for-it來確保localhost:6379
已啟動並正在運行。 docker stack deploy
在redis服務之前創建了app服務,所以我在depends_on
docker-compose
文件中添加了depends_on
部分。 depends_on
只能保證啟動的順序 (未准備好,即在繼續處理下一個圖像之前未運行所有命令),並且我必須找到其他解決方案 。 基於此,我還更改了Dockerfile_my_app
以在它實際運行我的應用程序之前運行wait-for-it
。 沒用 最后,我不知道該怎么辦,我運行ip a
來查看my_app
服務是否獲得了正確的IP。 並且它獲得了正確范圍內的IP:
my_test_my_app.1.jydyydckzyfh@snode-01 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 my_test_my_app.1.jydyydckzyfh@snode-01 | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 127.0.0.1/8 scope host lo my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | 1010: eth0@if1011: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default my_test_my_app.1.jydyydckzyfh@snode-01 | link/ether 02:42:ac:14:01:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 172.20.1.3/24 brd 172.20.1.255 scope global eth0 my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | 1012: eth1@if1013: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default my_test_my_app.1.jydyydckzyfh@snode-01 | link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1 my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | wait-for-it.sh: waiting 15 seconds for 172.20.1.1:6379 my_test_my_app.1.jydyydckzyfh@snode-01 | wait-for-it.sh: timeout occurred after waiting 15 seconds for 172.20.1.1:6379
簡而言之,IP已正確分配。 但是, my_app
服務無法連接到redis
服務。 有什么原因嗎? 我在撰寫文件中缺少什么嗎?
任何幫助,將不勝感激。
嘗試將wait-for-it.sh 172.20.1.1:6379
更改為:
wait-for-it.sh my_redis:6379
看看是否可行。
說明:如果我沒記錯,那么一旦容器成為同一網絡的一部分,它們便能夠通過docker-compose文件中聲明的服務名稱相互通信。
有關詳細信息,請參見``網絡''下的https://docs.docker.com/compose/compose-file/和https://docs.docker.com/compose/networking/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.