在Docker合成中自动创建网络

wlsrxk51  于 2023-01-12  发布在  Docker
关注(0)|答案(5)|浏览(182)

在Docker中使用自定义网络时,例如

networks:
  default:
    external:
      name: service-tier

试着运行它,我得到了错误
错误:网络服务层声明为外部,但找不到。请使用docker network create service-tier手动创建网络,然后重试。
是否可以使用docker-compose自动创建网络,或者除了先手动创建之外没有其他方法?

mepcadol

mepcadol1#

external是使用现有网络。如果要合成以创建网络,只需执行以下操作:

networks:
  network1:
  network2:

..以指示compose创建网络。它们将被命名为<compose-dir>-<network name>使用docker network ls验证创建。
也可以替代默认网络或指定更多特性。

networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1450

..将覆盖默认网络设置MTU为1450(方便当主机有低于1500 mtu和路径mtu发现不正常工作).
当您希望两个合成设置中的服务相互通信或您有一个手动创建的网络时,external更有意义。

jdgnovmf

jdgnovmf2#

正如@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

合成文件2

version: '2'
services:

  svc-using-svc-name:

    ...

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

    ...

networks:
  specific-network-name:
    external: true
sqougxex

sqougxex3#

我也有这个错误:

Network "NETWORK_NAME" needs to be recreated - option "driver" has changed
docker network ls
   docker network rm NETWORK_NAME
   docker-compose up

在删除问题网络并重新创建之后,一切正常。

vhmi4jdf

vhmi4jdf4#

不要将external: trueinternal: false合并。要允许单独的合成项目共享网络连接并自动创建该网络,只需在每个合成文件中指定匹配的网络name

内部

设置为true时,允许创建外部隔离网络
默认情况下,网络不是内部网络,因此已经提供了 * 外部连接 *。

外部

如果设置为true,external指定此网络的生命周期在应用程序的生命周期之外进行维护。
external属性指的是如何管理网络,但不描述其连接性或缺乏连接性。
external: false

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

姓名

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

示例

project1

services:
  db:
    networks:
      service_tier:
        aliases:
          - remotedb

networks:
  service_tier:
    name: service_tier

project2

services:
  web:
    networks:
      service_tier:

networks:
  service_tier:
    name: service_tier

结果

$ docker network ls

NETWORK ID     NAME                  DRIVER    SCOPE
ca564d4e76e6   bridge                bridge    local
6b4d2866afa8   host                  host      local
15fa57f54e0b   project1_default      bridge    local
a5eb24fc02b0   project2_default      bridge    local
d4b0a10c1385   service_tier          bridge    local
614c5864df80   none                  null      local

在此配置中,project2中的web服务可以使用共享service_tier网络上的主机别名remotedb访问project1中的db服务。
如果networks部分中没有name,您将看到单独的project1_service_tierproject2_service_tier,并且无法进行通信。

vbopmzt1

vbopmzt15#

运行以下命令:Docker网络创建ddev_default

相关问题