gpt4 book ai didi

docker 组成 : services cannot connect to each other

转载 作者:行者123 更新时间:2023-12-02 18:45:00 31 4
gpt4 key购买 nike

我一直在关注 this tutorial在 docker 服务和 swarms 上。但是我在不同 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 服务之前创建应用程序服务,所以我在 docker-compose depends_on 部分文件。
  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 服务。有什么理由吗?我在撰写文件中遗漏了什么吗?

任何帮助将不胜感激。

最佳答案

尝试将 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/ 下获取详细信息

关于 docker 组成 : services cannot connect to each other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57899204/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com