Docker高级网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang731227/article/details/83998749

title: Docker高级网络
tags: Docker


本文搬运的《Docker技术入门与实战》,有兴趣的同学可以看看。

网络启动与配置参数

基本过程

        Docker启动时会在主机上自动创建一个 docker0虚拟网桥,实际上是一个 Linux网桥,可以理解为一个软件交换机。它会在挂载其上的接- 之间进行转发。
        同时, Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给 docker0接- 。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网- 也会自动分配一个同一网段(172.17.0.0/16)的地址。
        当创建一个 Docker容器的时候,同时会创建了一对 veth pair接- (当数据包发送到一个接- 时,另外一个接- 也可以收到相同的数据包)。这对接- 一端在容器内,即eth0;另一端在本地并被挂载到 docker0网桥,名称以veth开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。如此一来, Docker就创建了在主机和所有容器之间一个虚拟共享网络。

网络相关参数

        下面是跟 Docker网络相关的命令参数。其中有些命令选项只有在 Docker服务启动的时候才能配置,而且不能马上生效.

    • b BRIDGE or --bridge=BRIDGE 指定容器挂载的网桥。
  • –bip=CIDR 定制 docker0的掩码。
    • H SOCKET… or --host= SOCKET… Docker服务端接收命令的通道。
  • –icc= true|false 是否支持容器之间进行通信。
  • –ip- forward=true|false 启用 net. ipv4. ip forward,即打开转发功能。
  • – iptables=true|false 禁止 Docker添加 iptables规则。
  • –mtu= BYTES 容器网络中的MTU。

        下面两个命令选项既可以在启动服务时指定,也可以 Docker容器启动( docker run)时候指定。在 Docker服务启动的时候指定则会成为默认值,后续执行 docker run时可以覆盖设置的默认值:

  • –dns= IP_ADDRESS … 使用指定的DNS服务器
  • –dns- search= DOMAIN… 指定DNS搜索域。

        最后这些选项只能在 docker run执行时使用,因为它是针对容器的特性内容:

    • h HOSTNAME or-- hostname= HOSTNAME 配置容器主机名。
  • –link=CONTAINER NAME: ALIAS 添加到另一个容器的连接。
  • –net= bridge I none I container: NAME or ID|host 配置容器的桥接模式。
    • p SPEC or --publish=SPEC 映射容器端- 到宿主主机
  • -P or – publish-all=true|false 映射容器所有端- 到宿主主机。

配置容器DNS 和主机名

相关配置文件

        实际上,容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:/etc/resolv.conf、/etc/ hostname和/etc/ hosts 。其中, /etc/ resolv.conf文件在创建容器时候,默认会与宿主机/etc/resolv.conf文件内容保持一致。

        etc/ hosts文件中默认只记录了容器自身的一些地址和名称:

root@7 5dbd6685305: / cat /etc/hosts
172.17.0.2 75dbd6685305
localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1  localhost

/etc/ hostname文件则记录了容器的主机名

root@75dbd6685305: / cat /etc/hostname 75dbd6685305

容器内修改配置文件

        Docker1.2.0开始支持在运行中的容器里直接编辑/etc/ hosts,/etc/ hostname和/etc/ resolve.conf文件。

        但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被 docker commit提交。

通过产生指定

        如果用户想要自定义容器的配置,可以在创建或启动容器时利用下面的参数指定:

  • 指定主机名- h HOSTNAME or-- hostname= HOSTNAME。设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/ hosts。但这个主机名只有容器内能看到,在容器外部则看不到,既不会在 docker ps中显示,也不会在其他的容器的/etc/ hosts看到。

  • 记录其他容器主机名–link= CONTAINER NAME: ALLAS。选项会在创建容器的时候,添加一个所连接容器的主机名到容器内/etc/ hosts文件中。这样,新创建容器可以直接使用主机名来与所连接容器通信。

  • 指定DNS服务器–dns= IP_ADDRESS。添加DNS服务器到容器的/etc/ resolvconf中,容器会用指定的服务器来解析所有不在/etc/ hosts中的主机名。

  • 指定DNS搜索域–dns-search=DOMAIN。设定容器的搜索域,当设定搜索域为. example,com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com

容器访问控制

容器访问外部网络

        在宿主机 Linux系统中,检查转发是否打开:
sysctl net.ipv4.ip_forward net.ipv4.ip_forward=1

        如果为0,说明没有开启转发,则需要手动打开:
sysctl -w net.ipv4.ip_forward=1

        更简单的,在启动 Docker服务的时候设定-ip- forward=true, Docker服务会自动打开宿主机系统的转发服务。

容器之间访问

访问所有端口

        当启动 Docker服务时候,默认会添加一条“允许”转发策略到 iptables的FORWARD链上。通过配置--icc= true|false(默认值为true)参数可以控制默认的策略。

        为了安全考虑,可以在/etc/default/docker文件中配置 DOCKER OPTS=--icc=fase来默认禁止容器之间的相互访问。

        同时,如果启动 Docker服务时手动指定-- iptables= false参数则不会修改宿主机系统上的 iptables规则。

访问指定端口
        在通过-icc= false禁止容器间相互访问后,仍可以通过--link=CONTAINER_NAME:ALIAS选项来允许访问指定容器的开放端口。

自定义网桥

        除了默认的 docker0网桥,用户也可以指定网桥来连接各个容器。
        在启动 Docker服务的时候,使用- b BRIdge或-- bridge=BRIDGE来指定使用的网桥。

        如果服务已经运行,那需要先停止服务,并删除旧的网桥:

service docker stop
ip link set dev docker0 down
 brctl delbr docker0 

        然后创建一个网桥 bridge0:

sudo brctl addr bridge0
sudo ip addr add 192 168.5.1/24 dev bridge0
ip link set dev bridge0 up

        查看确认网桥创建并启动:

ip addr show bridge0

        配置 Docker服务,默认桥接到创建的网桥上:

echo 'DOCKER OPTS="-b=bridgeo"1>>/etc/default/docker

service docker start

        启动 Docker服务。新建一个容器,可以看到它已经桥接到了 bridge0上。

        可以继续用 brctl show命令查看桥接的信息。另外,在容器中可以使用 ip addr和 ip route命令来查看IP地址配置和路由信息。

猜你喜欢

转载自blog.csdn.net/yang731227/article/details/83998749