gpt4 book ai didi

docker - 为什么我需要一个默认的 docker 网络来为两个 docker-compose 项目启动一个公共(public)的 docker 网络?

转载 作者:行者123 更新时间:2023-12-02 21:01:07 24 4
gpt4 key购买 nike

我有两个项目(a 和 b),它们都有一个 docker-compose.yml 文件。我现在希望其中一个项目能够调用另一个项目的服务,据我所知,我需要为此创建一个通用的 docker 网络。因此,为了创建一个最小的示例,我创建了两个文件夹( a/b/ ),它们都包含一个 docker-compose.yml文件。

这是文件夹中的一个 a/ :

version: '3'

services:
common_server:
image: ubuntu
ports:
- 4444:4444
command: >
bash -c '
apt update && apt install netcat -y &&
while true; do echo -e "HTTP/1.1 200 OK\n\npong" | nc -k -l -p 4444 -q 1; done'
# networks:
# - my_network

project_a:
image: ubuntu
depends_on:
- common_server
# networks:
# - my_network
command: >
bash -c '
apt update && apt install curl -y &&
while true; do echo "Calling the container"; echo "AAAAAAAA"; curl common_server:4444; sleep 10; done'

#networks:
# my_network:
# driver: bridge

这设置了两件事:
  • common_server : 一个简单的 ping/pong 服务器,它响应“pong”到它收到的每个请求
  • project_a : 一个调用 common_server 的简单客户端每 10 秒

  • 像这样很好用。我使用以下命令快速检查了 docker 网络:
    $ docker network ls
    NETWORK ID NAME DRIVER SCOPE
    5ac503033848 a_default bridge local <== THIS NETWORK WAS CREATED
    1f65f9c91441 bridge bridge local
    72fcb38f2060 host host local
    b76cd7ef1ac9 none null local

    我在文件夹 b/ 中有第二个 docker-compose.yml 文件我也想从中调用 common_server在上面的文件中定义。所以我取消了上面文件中带有网络的行的注释以启用 my_network .运行也很有效。

    当我查看 docker network ls我又看到了它创建的第二个网络:
    $ docker network ls
    NETWORK ID NAME DRIVER SCOPE
    5ac503033848 a_default bridge local <== CREATED BY THE FIRST RUN
    f0a42e17007b a_my_network bridge local <== CREATED BY THE SECOND RUN
    1f65f9c91441 bridge bridge local
    72fcb38f2060 host host local
    b76cd7ef1ac9 none null local

    然后我启动了第二个 docker-compose 文件:
    version: '3'

    services:
    project_b:
    image: ubuntu
    command: >
    bash -c '
    apt update && apt install curl -y &&
    while true; do echo "Calling the container"; echo "BBBBBBB"; curl common_server:4444; sleep 10; done'
    networks:
    - a_my_network
    networks:
    a_my_network:
    external: true

    这也有效。可调用 common_server从第一个 docker-compose 文件中。

    我的第一个问题:虽然我将网络定义为 my_network在第一个文件中,它被称为 a_my_network由 docker 。有没有办法定义网络,以便我可以在两个 docker-compose 文件中调用它?

    然后我决定使用 docker network prune 删除这两个网络。 ,然后重新开始。不幸的是,当我现在再次运行第一个文件时,我现在收到以下错误:
    $ docker-compose up
    Creating network "a_my_network" with driver "bridge"
    Starting a_common_server_1 ... error

    ERROR: for a_common_server_1 Cannot start service common_server: network f0a42e17007bc0f352042f5394aef65be18bb12c7836e8864ecb734f83a421d7 not found

    ERROR: for common_server Cannot start service common_server: network f0a42e17007bc0f352042f5394aef65be18bb12c7836e8864ecb734f83a421d7 not found
    ERROR: Encountered errors while bringing up the project.

    所以我的第二个问题:如果我首先创建 a_default,为什么我只能启动第一个 docker-compose 文件?通过不明确定义网络来建立网络?

    最佳答案

    当您在第二个文件中声明网络时,您可以显式指定其 name: .

    version: '3.7'  # minimum of 3.5
    networks:
    my_network:
    external: true
    name: a_my_network

    不过,正如您在开头提到的那样, Compose creates a default network for you , 如果你没有明确声明 networks:对于容器,它将附加到 default .您可以 reconfigure the default network但是你喜欢。

    所以我在这里做的可能不是声明 networks:在第一个 docker-compose.yml文件。在第二个我会做 default第一个文件的 default 上的网络点网络,也没有配置 networks:用于容器。

    networks:
    default:
    external: true
    name: a_default

    Compose 主要通过在对象上使用标签来跟踪正在发生的事情。这些通常对您隐藏,但它们是非常详细的 docker inspect 中包含的内容之一输出。在上一个示例中,如果您手动 docker network prune从 Compose 下的一个网络,它开始变得困惑。另一方面,如果您只是注释掉您手动创建的网络并重新运行 docker-compose up , Compose 应该注意到它创建了一个不再需要的网络并为您清理它。

    关于docker - 为什么我需要一个默认的 docker 网络来为两个 docker-compose 项目启动一个公共(public)的 docker 网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308516/

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