Docker run参考(6) – 网络设置

  1. --dns=[]           : Set custom dns servers for the container
  2. --network="bridge" : Connect a container to a network
  3.                       'bridge': create a network stack on the default Docker bridge
  4.                       'none': no networking
  5.                       'container:<name|id>': reuse another container's network stack
  6.                       'host': use the Docker host network stack
  7.                       '<network-name>|<network-id>': connect to a user-defined network
  8. --network-alias=[] : Add network-scoped alias for the container
  9. --add-host=""      : Add a line to /etc/hosts (host:IP)
  10. --mac-address=""   : Sets the container's Ethernet device's MAC address
  11. --ip=""            : Sets the container's Ethernet device's IPv4 address
  12. --ip6=""           : Sets the container's Ethernet device's IPv6 address
  13. --link-local-ip=[] : Sets one or more container's Ethernet device's link local IPv4/IPv6 addresses

默认下,所有容器都启用了网络并且能够访问外部网络。使用docker run –network none能够完全地禁用网络,这将禁止所有的入站和出站连接。在这个情况下,你只能能够文件或STDIN和STDOUT完成I/O通信。
发布端口和链接到其它容器只在默认的bridge工作。链接功能是一个旧的功能。你应该始终首选Docker网络驱动的链接功能。
容器默认使用与主机相同的DNS服务器,不过可以使用–dns覆盖它。
默认情况下,使用分配给容器的IP地址生成MAC地址。你可以通过–mac-address参数[格式:12:34:56:78:9a:bc]设置一个指定的容器MAC地址。要注意如果你手动指定MAC地址,docker不会检查地址是否唯一。

支持的网络

  • none – 不使用网络
  • bridge[默认] – 通过veth接口连接容器到bridge
  • host – 在容器内使用主机的网络堆栈
  • container: – 使用其它容器的网络堆栈,通过name或id指定
  • NETWORK – 连接容器到一个用户创建的网络 [使用docker network create命令]
  • Network: none

    设置网络为none容器将无法与外部通信。容器仍然会有一个loopback接口,不过没有外部流量的路由。

    Network: bridge

    设置网络为bridge,容器将使用docker默认的网络设置。主机创建有一个bridge,名为docker0,并为容器创建一对veth接口。其中一个vetch在主机上附着到bridge,而另一个将设置到容器的命名空间内,除了loopback接口。容器在bridge网络分配到一个IP地址,且流量通过这个bridge路由到容器。
    容器默认能够通过它们的IP地址通信。如果要通过名称通信,并且使用链接功能。

    Network: host

    设置网络为host,容器将共享主机的网络堆栈,主机的所有接口将对容器可用。容器的主机名将与主机系统上的主机名匹配。注意–mac-address在host模式时无效。即使在host网络模式下容器默认有它自己的UTS命名空间。因此–hostname在host网络中是允许的,且只更改容器内的hostname。与–hostname类似的–add-host,–dns,–dns-search和–dns-opt选项可用于host网络模式中。这些选项将更新容器内的/etc/hosts或/etc/resolv.conff。不会更改主机中的/etc/hosts和/etc/resolv.conf。
    与默认的bridge模式对比,host模式有更好的网络性能,因为它使用了主机的本地网络堆栈,而bridge必须通过docker deamon进行一级虚拟化。当网络性能要求非常高时,推荐使用这个模式运行容器,例如,生产环境的负载均衡或高性能web server。

    注意:–network=”host”给了容器对本地系统服务全部的访问权限,如D-bus,因此此模式认为是不安全的。

    Network: container

    设置网络为container时,容器将共享另一个容器的网络堆栈。需要以–network container:的格式提供另一个容器的名称。–add-host –hostname –dns –dns-search –dns-opt和–mac-address 在container网络模式中是无效的,–publish –publish-all –expose在container网络模式同样无效。
    如下示例,启动了一个redis容器,绑定在localhost,然后运行另一个容器执行redis-cli命令通过localhost接口连接redis服务器。

    1. $ docker run -d --name redis example/redis --bind 127.0.0.1
    2. $ # use the redis container's network stack to access localhost
    3. $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1

    User-defined network

    使用docker网络驱动或外部网络驱动插件可以创建一个自己的网络。之后可以连接多个容器到这个网络。一旦连接到用户自定义网络,容器将可以只使用另一个容器的IP地址或名称来通信。
    对于支持多主机网络通信的overlay网络或自定义插件,连接到相同的多主机网络但是从不同主机启动的容器能以这种方式互相通信。
    如下示例使用docker内置的bridge网络驱动创建了一个网络,并在这个网络运行一个容器。

    1. $ docker network create -d bridge my-net
    2. $ docker run --network=my-net -itd --name=container3 busybox

    管理/etc/hosts

    容器将会在/etc/hosts添加容器自身主机名条目,localhost和其它一些常见的条目。–add-host参数可以用来在/etc/hosts添加额外的条目。

    1. $ docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
    2. 172.17.0.22     09d03f76bf2c
    3. fe00::0         ip6-localnet
    4. ff00::0         ip6-mcastprefix
    5. ff02::1         ip6-allnodes
    6. ff02::2         ip6-allrouters
    7. 127.0.0.1       localhost
    8. ::1             localhost ip6-localhost ip6-loopback
    9. 86.75.30.9      db-static

    如果一个容器连接到默认的bridge网络且链接到其它容器,那么这个容器的/etc/hosts文件将添加被链接容器的名称条目。
    如果容器连接到用户定义的网络,容器的/etc/hosts文件将添加在这个网络的所有其它容器的名称条目。

    注意:因此docker会实时更新容器的/etc/hosts文件,可能会出现当容器内的进程读取到空的或不完整的/etc/hosts文件。大多数情况下,重新读取应该能解决这个问题。

    标签:Docker 发布于:2019-11-19 18:19:02