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

问题描述 投票:0回答:2

我有两个项目(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,但码头工人将其称为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文件?

我有两个项目(a和b),它们都有一个docker-compose.yml文件。我现在希望其中一个项目能够调用另一个项目的服务,据我所知,我需要创建一个...

docker networking docker-compose docker-networking docker-network
2个回答
0
投票

您可以使用-p或--project-name标志或COMPOSE_PROJECT_NAME环境变量来更改网络名称。

并且可能在这里看到:https://docs.docker.com/compose/networking/#use-a-pre-existing-network


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.