如何在Docker-Compose中同时使用宿主网络和其他用户自定义网络?

53
我想将在Docker-Compose文件中定义的两个Docker容器(`app`和`db`)相互连接起来。其中一个容器(`app`)还应连接到主机网络 (`host`)。为了使用 Docker 网络中的嵌入式 DNS 功能,这些容器应该连接到一个共同的用户定义网络 (`appnet` 或 `default`)。
`app`还需要直接连接到主机网络以接收 Docker 主机的物理网络中的以太网广播(网络层2)。在compose中同时使用 `network_mode: host` 和 `networks` 指令会导致以下错误:
`ERROR:'network_mode' and 'networks' cannot be combined`
如果在服务中指定网络名称 `host` 而未在 networks 中定义它(因为它已经存在),则会导致以下错误:
`ERROR: Service "app" uses an undefined network "host"`
下一个尝试:显式定义两个网络,并在服务级别不使用 `network_mode: host` 属性。
version: '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: null
  hostnet:
    external:
      name: host

上述docker-compose文件产生了一个错误:

ERROR: for app network-scoped alias is supported only for containers in user defined networks

如何在Docker-Compose中同时使用host网络、任意其他用户定义网络(或默认网络)?

3个回答

17

简要来说,你做不到。主机网络会关闭该容器的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"

1
这是一个非常棒的回答,但很容易被忽视。发布端口提供了最佳的两个世界,本地主机可以观察到可观性,同时在容器互联服务之间可以使用容器名称进行私有网络解析。不幸的现实是,你不能从主机操作系统将数据包路由到Docker for Mac中,但是你可以使用发布的端口将容器连接到彼此和主机操作系统。 - Kingdon
这个回答让我受益匪浅。我正在使用Docker Swarm,所以借鉴了这个答案来做类似的事情。我将容器放在主机网络上,还添加了extra_hosts: 0.0.0.0:portNumber:PortNumber。 - Martin

0

仅限于Windows和macOS,对于Linux来说,这取决于https://github.com/docker/for-linux/issues/264。 - alex
4
现在这个也已经在Linux上实现了。 - Thomas

0

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


“app”需要OSI第二层对主机网络的访问权限。我不是要求UDP/TCP端口绑定。 - Simon Schürg
1
抱歉,我的错。我在最新版本的Windows Docker上重现了这个问题 - 同样的问题。类似的问题在Moby Github上也有 - https://github.com/moby/moby/issues/32957 - 看起来这是一个更大问题的一部分。 - Miq
1
是的,我认为在当前版本的Docker Compose(2018年1月)中,使用host-networking和docker compose一起使用多容器应用的唯一方法是,在compose文件中为所有容器使用host-network。 - Simon Schürg
这个答案帮助了我,因为我移除了需要使用桥接网络的容器中的桥接网络,并在该容器中使用了“ports”指令,与其他容器相关的内部网络,并且还为那些其他容器使用了“expose” - 它完美地工作。 - tymik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接