Docker compose:服务无法相互连接
我一直在关注docker服务和蜂群。但我在不同docker容器之间的网络连接方面遇到了一些问题 下面是我的Docker compose:服务无法相互连接,docker,docker-compose,Docker,Docker Compose,我一直在关注docker服务和蜂群。但我在不同docker容器之间的网络连接方面遇到了一些问题 下面是我的docker compose.yml文件,它基本上包含两个服务。一个只是一个连接到两个网络的redis图像(尽管第二个现在没有用)。另一个是我的应用程序,它需要连接到redis。出于这个原因,我选择给redis服务一个静态IP version: "3" services: my_redis: image: redis ports: - "6379:6379"
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
下面是我的我的应用程序的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服务。因此,我尝试了以下方法:
sudocker run-p 6379:6379 redis
,然后我用来确保localhost:6379
已启动并正在运行docker-stack-deploy
可能在redis服务之前创建了应用程序服务,因此我在docker-compose
文件中添加了dependens\u on
部分也取决于(没有准备好,即在继续下一个图像之前没有运行所有命令),我必须找到。基于此,我还将我的应用程序的Dockerfile\u更改为运行等待它
,然后再实际运行我的应用程序。没用
ipa
,查看我的应用程序
服务是否获得了正确的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
my_test_我的_app.1。jydyydckzyfh@snode-01 | 1:lo:mtu 65536 qdisc noqueue状态未知组默认qlen 1000
我的测试我的应用。1。jydyydckzyfh@snode-01 |链接/环回00:00:00:00:00 brd 00:00:00:00:00:00:00
我的测试我的应用。1。jydyydckzyfh@snode-01 | inet 127.0.0.1/8示波器主机lo
我的测试我的应用。1。jydyydckzyfh@snode-01 |永久有效_lft优先_lft永久有效
我的测试我的应用。1。jydyydckzyfh@snode-01 | 1010: eth0@if1011:mtu 1450 qdisc noqueue state UP组默认值
我的测试我的应用。1。jydyydckzyfh@snode-01 |链路/以太02:42:ac:14:01:03 brd ff:ff:ff:ff:ff:ff:ff链路网络ID 0
我的测试我的应用。1。jydyydckzyfh@snode-01 | inet 172.20.1.3/24 brd 172.20.1.255范围全局eth0
我的测试我的应用。1。jydyydckzyfh@snode-01 |永久有效_lft优先_lft永久有效
我的测试我的应用。1。jydyydckzyfh@snode-01 | 1012: eth1@if1013:mtu 1500 qdisc noqueue state UP组默认值
我的测试我的应用。1。jydyydckzyfh@snode-01 |链路/以太02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff:ff链路网络ID 1
我的测试我的应用。1。jydyydckzyfh@snode-01 | inet 172.18.0.3/16 brd 172.18.255.255范围全局eth1
我的测试我的应用。1。jydyydckzyfh@snode-01 |永久有效_lft优先_lft永久有效
我的测试我的应用。1。jydyydckzyfh@snode-01 | wait-for-it.sh:等待15秒172.20.1.1:6379
我的测试我的应用。1。jydyydckzyfh@snode-01 | wait-for-it.sh:在172.20.1.1:6379等待15秒后发生超时
myu应用程序
服务无法连接到redis
服务。有什么原因吗?我在撰写文件中遗漏了什么吗
任何帮助都将不胜感激。尝试将Dockerfile\u my\u应用程序中的
wait-it.sh 172.20.1.1:6379
更改为:
wait-for-it.sh my_redis:6379
看看这是否有效
说明:
如果我没有错的话,一旦容器是同一网络的一部分,它们就能够通过docker compose文件中声明的服务名称相互通信
请参见“网络”下的,有关详细信息,我已添加了解释。我不是这方面的专家,但我以前用过,这是我的理解(:是的,但我的意思是为什么使用IP不起作用?如果它可以解析名称,那么理论上它应该可以直接使用IP连接,对吗?不管怎样,你的回答的一个很好的副作用是,我真的不需要分配静态IP。是的,让docker compose在内部为你处理IP地址的分配。关于为什么直接使用ip地址不起作用,也许其他人可以提供更好的见解。干杯。