Docker 网络

docker的通信方式

默认情况下,docker使用网桥(bridge)+NAT的通信模式

docker在启动时默认会自动创建网桥设备Docker0,并配置ip:

Host内容容器之间网络:

  docker创建容器的时候,会创建一堆veth虚拟网络设备,并将其中一个veth网络设备附加到网桥docker0,另一个加入容器的网络名字空间(network namespace),并改名为eth0.这样同一个Host的容器与容器之间就可以通过docker0通信了。

 

容器于外部网络:

  NAT

  1.容器访问外部网络

    docker创建如下MASQUERADE规则:

    -tnat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

    这条规则将所有从容器(172.17.0.0/16)发出的、目的地址为Host外部网络的包的IP都修改成Host的IP,并由Host发送出去。

  2.外部网络访问容器

    如果容器提供的服务需要暴露给外部网络,Docker在启动容器时,就会创建SNAT规则。比如,我们启动一个apache容器:

    #docker run -d -p 80:80 apache

    这会创建下面的SNAT规则:

    iptables -t nat-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

    iptables -t nat-A DOCKER ! -i docker0 -p tcp -m tcp --dport80 -j DNAT --to-destination 172.17.0.2:80

    第一条规则是Docker进程启动时默认创建的,第二条规则是在启动容器时创建的。

 

网络配置

  网络配置参数

  docker有很多与网络配置相关的参数,一些是docker进程本身的,这会影响所有容器,另外一些是配置容器的,这些配置只会影响某个具体的容器。

 

  1.docker进程的网络配置

  -b/--bridge:指定docker使用网桥设置。默认情况下docker会使用docker0网桥设备,通过该参数可以指定docker使用已经存在的网桥设备。

  --bip:指定网桥设备docker0的IP和掩码,使用标准的CIDR形式,如192.168.1.5/24

  --dns/--dns-search:配置容器的DNS,该参数既可以在启动docker进程时指定成为所有容器默认值,也可以在启动容器时指定覆盖默认值。

 

  2.容器的网络配置

  --net 用于指定容器使用的网络通信方式,它可以取下面四个值:

  bridge:这个docker中的容器默认的方式

  none:容器没有网络栈,无法与外部通信

  container:<name|id>:使用其他容器(name或者id指定)的网络栈。实际上,docker会将该容器加入指定容器的network namespace,这是一种非常有用的方式。

  host:表示容器使用Host的网络,没有自己独立的网络栈。实际在这种情况下,docker不会给容器创建单独的网络空间。由于容器可以完全访问Host的网络,所以此方式是不安全的。

 

  配置DNS

  一般来说,每个容器的hostname和DNS配置信息是不同的,我们不可能为每个容器都构建一个镜像,并在镜像中指定这些信息。那么如何解决这个问题呢?

  实际上,docker在启动容器时,会使用bind mount动态挂载、/etc/hostname、/etc/hosts、/etc/resolv.conf几个文件,覆盖镜像中原来的文件,我们可以在容器内部看到这个信息:

 

$$ mount
...
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ..

  

  使用可参考:https://zhuanlan.zhihu.com/fangtalk/20480923

posted @ 2017-10-18 17:52  YatHo  Views(360)  Comments(0Edit  收藏  举报