我一直在关注this tutorial,了解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服务之前创建应用程序服务,因此我在depends_on
文件中添加了docker-compose
部分。depends_on
only guarantees order of starting(尚未准备就绪,即在继续下一个图像之前未运行所有命令),我也必须找到a different solution。基于此,我还更改了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
服务。有什么原因吗?我在撰写文件中缺少什么吗?
任何帮助将不胜感激。
答案 0 :(得分:6)
尝试将Dockerfile_my_app中的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/