【问题标题】:Create networks automatically in Docker Compose在 Docker Compose 中自动创建网络
【发布时间】:2017-12-28 12:47:24
【问题描述】:

在 Docker 中使用自定义网络时

networks:
  default:
    external:
      name: service-tier

然后尝试运行它,我得到了错误

错误:网络服务层声明为外部,但不能 成立。请使用docker network create service-tier手动创建网络,然后重试。

是否可以使用 docker-compose 自动创建网络,还是只有先手动创建网络?

【问题讨论】:

    标签: docker networking automation docker-compose


    【解决方案1】:

    external 是使用现有网络。如果您想通过 compose 制作网络,您只需执行以下操作:

    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(当主机的 mtu 低于 1500 并且路径 mtu 发现无法正常工作时非常方便)。有other bridge driver options

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

    【讨论】:

    • 如何检查除网桥以外的驱动程序选项?指定 com.docker.network.driver.mtu 适用于网桥驱动程序,但不适用于 macvlan 驱动程序
    • @ealeon 我猜唯一要查找的地方是驱动程序文档
    • @Grimmy 可以在 docker compose up 上创建持久网络吗?因为发生在我身上的是,当我关闭容器时,docker compose 也在删除网络。
    • 最后一句话值得一百个赞。人们经常遗漏重要的“并且通常在 X 场景中使用”,所以我们知道它是否是我们在不熟悉某些东西时正在寻找的东西。这完美地证实了用例。
    【解决方案2】:

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

    但是,默认生成的网络名称既不实用也不可靠。因为它可能会很长,或者docker 团队改变了他们对命名策略的看法。

    但是由于编写文件版本3.5(意味着docker-compose版本1.18.0)可以随意命名网络,所以整体解决方案更加健壮。

    请参阅以下 sn-ps 演示如何实现此目的:

    编写文件 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
    

    【讨论】:

    • external 属性是否默认为假?
    • @Stephane:是的,docker-compose 假设您将默认配置项目特定的网络。通过指定外部docker-compose 不会尝试创建它,只是为了连接(并且不会在调用down 的情况下触摸它)
    • 这对我不起作用:第一个文件运行正确,但是当运行第二个文件时,docker 响应声明为外部但找不到的“特定网络名称”。 [已解决]:Docker-compose 将目录名称添加到命名卷和网络,因此在第二个文件中我必须将项目前缀添加到网络名称
    • @DomenicoMonaco:那么你可能做错了什么——检查你的 docker 版本,列出 docker 网络,检查正确的 compose 文件版本,你会看到网络名称没有前缀 w/任何目录名称。我还可以假设否决票来自您吗?为什么——也许是因为你的误解?祝你今天过得愉快。 [编辑:] 附带说明一下,此设置是我们用于多个应用程序的生产模型,未经测试就发布任何内容...
    【解决方案3】:

    我也有这个错误:

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

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

    【讨论】:

    • 正是我想要的!谢谢!
    • 您还可以使用docker network prune -f 删除任何未连接容器的网络。我有时会使用docker rm -f $(docker ps -a) 来移除所有容器。后跟docker network prune -f 删除未使用的网络
    【解决方案4】:

    运行以下命令:docker network create ddev_default

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多