在docker-compose中使用主机网络

时间:2018-07-07 15:08:18

标签: docker networking docker-compose

我正在尝试使用docker-compose建立一个具有两个网络的容器。我希望其中一个网络是host网络(即:好像我在运行docker run --net=host),另一个是用户定义的网络。

我尝试过:

version: '3'

networks:
  test:
    driver: bridge
  host:
    external: true

services:
  helloworld:
    image: python:3.6-alpine
    networks:
      - test
      - host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    ports:
      - 0.0.0.0:8080:8080
    command: sh -c "cd /tmp && python -m http.server 8080"

我收到此错误:

$ docker-compose up
Removing blah_helloworld_1
Starting 8743618e8af4_blah_helloworld_1 ... error

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

ERROR: for helloworld  network-scoped alias is supported only for containers in user defined networks
ERROR: Encountered errors while bringing up the project.

2 个答案:

答案 0 :(得分:1)

虽然 host 列在 docker network ls 中,但它的工作方式与其他网络非常不同。

默认情况下,每个容器都被隔离在自己独立的网络命名空间中。当一个容器被放入“主机”网络时(使用 network_mode: host 和 compose),容器只是停留在主机的网络命名空间中。

容器不能在桥接网络(如 test)中,也不能同时在 host 网络中,因为这将要求该容器同时位于主机的网络命名空间和有自己独立的网络命名空间。

答案 1 :(得分:0)

根据docs

  • 目标:容器内的端口
  • 已发布:公开端口
  • 协议:端口协议(tcp或udp)
  • 模式:用于在每个节点上发布主机端口的主机,或用于输入群集模式端口以平衡负载的主机。

示例:

 ports:
   - target: 8080
     published: 8080
     protocol: tcp
     mode: host