Docker compose:服务无法相互连接

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服务和蜂群。但我在不同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
下面是我的
我的应用程序的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服务。因此,我尝试了以下方法:

  • 我尝试单独运行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秒后发生超时
    
  • 简言之,IP的分配是正确的。但是,
    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地址不起作用,也许其他人可以提供更好的见解。干杯。