如何在Docker Compose中使用主机网络和任何其他用户定义的网络?

如何在Docker Compose中使用主机网络和任何其他用户定义的网络?,docker,networking,service,docker-compose,ethernet,Docker,Networking,Service,Docker Compose,Ethernet,我想将Docker Compose文件中定义的两个Docker容器相互连接(app和db)。其中一个(app)也应该连接到主机网络 容器应连接到通用用户定义网络(appnet或default),以使用docker networking的嵌入式DNS功能 app还需要直接连接到主机网络,以便在docker主机的物理网络中接收以太网广播(网络层2) 如果我在compose中同时使用两个指令network\u mode:host和networks,我会得到以下错误 错误:“网络模式”和“网络”无法组合

我想将Docker Compose文件中定义的两个Docker容器相互连接(
app
db
)。其中一个(
app
)也应该连接到
主机
网络

容器应连接到通用用户定义网络(
appnet
default
),以使用docker networking的嵌入式DNS功能

app
还需要直接连接到主机网络,以便在docker主机的物理网络中接收以太网广播(网络层2)

如果我在compose中同时使用两个指令
network\u mode:host
networks
,我会得到以下错误

错误:“网络模式”和“网络”无法组合

所以我只能用
网络
来做这件事

version: "3.3"

services:

  app:
    build: .
    image: app
    container_name: app
    environment:
      - MONGODB_HOST=db
    depends_on:
      - db
    networks:
      - appnet
      - hostnet

  db:
    image: mongo:latest
    container_name: db
    networks:
      - appnet

networks:
  appnet:
  hostnet:
    external:
      name: host
前面的合成文件产生错误。
错误:对于应用程序网络范围的别名,仅支持用户定义网络中的容器

如果我在服务中使用网络名
host
,而没有在网络中定义它(因为它已经存在),它会说。
错误:服务“应用程序”使用未定义的网络“主机”

如何在Docker Compose中同时使用
主机
网络和任何其他用户定义的网络(或默认网络)


我正在使用
Docker版本17.11.0-ce-rc3,构建5b4af4f
Docker compose版本1.17.1,构建6d101fb

来使用主机网络,您不需要定义它。只需使用“ports”关键字定义要在主机网络中公开的服务端口。

TL;博士,你不能。主机网络关闭该容器的docker网络命名空间。你不能同时打开和关闭它

相反,请使用发布的端口或unix套接字连接到数据库,您可以将其作为卷共享。例如,以下是如何发布端口:

version: "3.3"

services:

  app:
    build: .
    image: app
    container_name: app
    environment:
      - MONGODB_HOST=127.0.0.1

  db:
    image: mongo:latest
    container_name: db
    ports:
      - 127.0.0.1:27017:27017

由于Docker 18.03+可以使用
host.Docker.internal
从容器中访问主机。无需添加
主机
网络或将其与用户定义的网络混合使用


来源:

应用程序
需要OSI第2层访问主机网络。我没有要求UDP/TCP端口绑定。对不起,我的错。我确实在最新的docker for windows上复制了它-同一期。moby github上也有类似的问题——似乎这是一个更大问题的一部分是的,我认为使用docker compose和主机网络的多容器应用程序的唯一方法是,对compose文件中的所有容器使用主机网络。至少在2018年1月的Docker Compose的当前版本中。这个答案在某种程度上帮助了我,我从必须使用它的容器中移除了网桥网络,用于此容器的
ports
指令以及与其他容器相关的内部网络,也用于那些其他容器的
expose
——它在Windows和macOS上的工作非常出色,在Linux上这取决于这是一个非常好的答案,并且主要被忽略了。发布的端口提供了这两个方面的最佳效果,在本地主机上具有可观察性,并且在私有网络中,容器服务可以通过容器名称相互解析。不幸的是,您无法将数据包从主机操作系统路由到Docker for Mac,但您可以使用已发布的端口将容器彼此连接到主机操作系统。