为什么我需要一个默认 docker 网络来为两个 docker-compose 项目启动一个公共 docker 网络?
Why do I need a default docker network to start a common docker network for two docker-compose projects?
我有两个项目(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
:一个简单的客户端,每 10 秒调用一次 common_server
像这样效果很好。我使用以下方法快速检查了 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
这也行。它可以从第一个 docker-compose 文件中调用 common_server
。
我的第一个问题:虽然我在第一个文件中定义网络为my_network
,但它被docker称为a_my_network
。有没有办法定义网络,以便我可以在两个 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 文件?
您可以使用 -p 或 --project-name 标志或 COMPOSE_PROJECT_NAME 环境变量更改网络名称。
也许看到这里:https://docs.docker.com/compose/networking/#use-a-pre-existing-network
当您在第二个文件中声明网络时,您可以明确指定其 name:
。
version: '3.7' # minimum of 3.5
networks:
my_network:
external: true
name: a_my_network
不过,正如您在开头所说的那样,Compose creates a default
network for you, and if you don't explicitly declare networks:
for a container it will attach to default
. You can reconfigure the default
network随心所欲。
所以我在这里做的可能根本不是在第一个 docker-compose.yml
文件中声明 networks:
。在第二个中,我将 default
网络指向第一个文件的 default
网络,并且也不为容器配置 networks:
。
networks:
default:
external: true
name: a_default
Compose 主要通过在对象上使用标签来跟踪正在发生的事情。这些通常对您是隐藏的,但它们是非常详细的 docker inspect
输出中包含的内容之一。在您的最后一个示例中,如果您从 Compose 下手动 docker network prune
一个网络,它就会开始变得混乱。另一方面,如果您只是注释掉您手动创建的网络并重新 运行 docker-compose up
,Compose 应该注意到它创建了一个不再需要的网络并为您清理它。
我有两个项目(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
:一个简单的客户端,每 10 秒调用一次common_server
像这样效果很好。我使用以下方法快速检查了 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
这也行。它可以从第一个 docker-compose 文件中调用 common_server
。
我的第一个问题:虽然我在第一个文件中定义网络为my_network
,但它被docker称为a_my_network
。有没有办法定义网络,以便我可以在两个 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 文件?
您可以使用 -p 或 --project-name 标志或 COMPOSE_PROJECT_NAME 环境变量更改网络名称。
也许看到这里:https://docs.docker.com/compose/networking/#use-a-pre-existing-network
当您在第二个文件中声明网络时,您可以明确指定其 name:
。
version: '3.7' # minimum of 3.5
networks:
my_network:
external: true
name: a_my_network
不过,正如您在开头所说的那样,Compose creates a default
network for you, and if you don't explicitly declare networks:
for a container it will attach to default
. You can reconfigure the default
network随心所欲。
所以我在这里做的可能根本不是在第一个 docker-compose.yml
文件中声明 networks:
。在第二个中,我将 default
网络指向第一个文件的 default
网络,并且也不为容器配置 networks:
。
networks:
default:
external: true
name: a_default
Compose 主要通过在对象上使用标签来跟踪正在发生的事情。这些通常对您是隐藏的,但它们是非常详细的 docker inspect
输出中包含的内容之一。在您的最后一个示例中,如果您从 Compose 下手动 docker network prune
一个网络,它就会开始变得混乱。另一方面,如果您只是注释掉您手动创建的网络并重新 运行 docker-compose up
,Compose 应该注意到它创建了一个不再需要的网络并为您清理它。