Docker撰写:服务无法相互连接

时间:2019-09-12 03:10:26

标签: docker docker-compose

我一直在关注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服务。所以我尝试了以下方法:

  1. 我尝试使用以下命令单独运行redis容器:sudo docker run -p 6379:6379 redis,然后使用wait-for-it确保localhost:6379已启动并正在运行。
  2. 我认为然后docker stack deploy会在redis服务之前创建应用程序服务,因此我在depends_on文件中添加了docker-compose部分。
  3. 我发现,即使depends_on only guarantees order of starting(尚未准备就绪,即在继续下一个图像之前未运行所有命令),我也必须找到a different solution。基于此,我还更改了Dockerfile_my_app使其在实际运行我的应用之前运行wait-for-it。没用。
  4. 最后,我不知道该怎么办,我运行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服务。有什么原因吗?我在撰写文件中缺少什么吗?

任何帮助将不胜感激。

1 个答案:

答案 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/