在Docker Compose中自动创建网络

Mar*_*ies 10 networking automation docker docker-compose

在Docker中使用自定义网络时

networks:
  default:
    external:
      name: service-tier
Run Code Online (Sandbox Code Playgroud)

并尝试运行它,我得到错误

错误:网络服务层声明为外部,但无法找到.请手动创建网络,docker network create service-tier然后重试.

是否可以使用docker-compose自动创建网络,或者除了先手动创建网络之外没有别的办法吗?

Gri*_*mmy 10

external是使用现有的网络.如果你想创建网络,你只需:

networks:
  network1:
  network2:
Run Code Online (Sandbox Code Playgroud)

..指示撰写网络.它们将被命名为使用<compose-dir>-<network name>验证创建docker network ls.

您还可以覆盖默认网络或指定更多属性.

networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1450
Run Code Online (Sandbox Code Playgroud)

..将覆盖默认网络设置MTU为1450(当主机低于1500 mtu并且路径mtu发现无法正常工作时很方便).还有其他桥驱动程序选项.

external 当您希望两个组合设置中的服务相互通信或者您有一个手动创建的网络时,更有意义.

  • @Grimmy 可以在 docker compose up 上创建持久网络吗?因为我身上发生的事情是,当我关闭容器时,docker compose 也会删除网络。 (3认同)

rym*_*ymo 9

不要external: true与混为一谈internal: false。要允许单独的撰写项目共享网络连接并自动创建该网络,只需name在每个撰写文件中指定匹配的网络即可。

\n

内部的

\n
\n

设置为 true 时允许创建外部隔离网络

\n
\n

默认情况下,网络不是内部的,因此已经提供外部连接

\n

外部的

\n
\n

如果设置为 true,则 external 指定此网络\xe2\x80\x99s 生命周期在应用程序之外进行维护。

\n
\n

external属性指的是网络的管理方式,并不描述其连接性或缺乏连接性。

\n

external: false

\n
    \n
  • 是默认值,可以省略
  • \n
  • 允许根据需要自动创建网络
  • \n
  • 如果网络之前是由另一个正在运行的堆栈自动创建的,则不会抛出错误
  • \n
\n

姓名

\n

如果没有指定的name属性,自动创建的网络将使用以项目名称为前缀的密钥。显式设置名称可以防止项目范围界定并允许共享使用。

\n

例子

\n

project1

\n
services:\n  db:\n    networks:\n      service_tier:\n        aliases:\n          - remotedb\n\nnetworks:\n  service_tier:\n    name: service_tier\n
Run Code Online (Sandbox Code Playgroud)\n

project2

\n
services:\n  web:\n    networks:\n      service_tier:\n\nnetworks:\n  service_tier:\n    name: service_tier\n
Run Code Online (Sandbox Code Playgroud)\n

结果

\n
$ docker network ls\n\nNETWORK ID     NAME                  DRIVER    SCOPE\nca564d4e76e6   bridge                bridge    local\n6b4d2866afa8   host                  host      local\n15fa57f54e0b   project1_default      bridge    local\na5eb24fc02b0   project2_default      bridge    local\nd4b0a10c1385   service_tier          bridge    local\n614c5864df80   none                  null      local\n
Run Code Online (Sandbox Code Playgroud)\n

在此配置中,web服务 in可以通过使用共享网络上的主机别名来project2访问db服务 in 。project1remotedbservice_tier

\n

如果没有name这些networks部分,您将看到单独的内容project1_service_tierproject2_service_tier并且无法进行交流。

\n


hel*_*ete 8

正如@Grimmy正确指出的那样,docker创建了所有提及的网络,因此以后可以通过运行另一个撰写文件来引用这些网络。

但是,默认生成的网络名称几乎不实用或不可靠。结果可能会很长,或者docker团队会改变他们对命名策略的看法。

但是由于撰写文件的版本3.5(意味着docker-compose版本1.18.0)可以随意命名网络,因此总体解决方案更加强大。

请查看以下片段,演示如何实现此目的:

撰写档案1

version: '3.5'
services:
  svc-name:

    ...                          

    networks:
      - specific-network-name
    container_name: "exact-container-reference"

    ...

networks:
  specific-network-name:
    external: false
    name: specific-network-name
Run Code Online (Sandbox Code Playgroud)

撰写档案2

version: '2'
services:

  svc-using-svc-name:

    ...

    networks:
      - default
      - specific-network-name
    external_links:
      - exact-container-reference

    ...

networks:
  specific-network-name:
    external: true
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,“external”属性是 false 吗? (2认同)
  • @Stephane:是的,`docker-compose`假设您将默认配置特定于项目的网络。通过指定外部`docker-compose`不会尝试创建它,仅用于连接(在调用`down`的情况下也不会触摸它) (2认同)

Rob*_*ans 7

我也有这个错误:

Network "NETWORK_NAME" needs to be recreated - option "driver" has changed
Run Code Online (Sandbox Code Playgroud)
   docker network ls
   docker network rm NETWORK_NAME
   docker-compose up
Run Code Online (Sandbox Code Playgroud)

删除问题网络并重新创建后,一切都很好。