首页 > 代码库 > (七)Docker网络

(七)Docker网络

容器和宿主机、容器之间以及夸主机容器如何通讯呢?这就需要使用到Docker网络。

在前面的介绍中我们在Dockerfile中通过EXPOSE参数来设置容器暴露的端口,让在docker run中使用-p来设置宿主机端口到容器端口的映射,这只是最简单的宿主机和容器通讯,同样使用宿主机IP:PORT方式可以让其他容器和该容器通讯,但是这样有个问题,首先应用程序需要对IP进行硬编码,其次容器每次重启IP都会变化,显然在生产环节中应该做到的尽可能的解耦,下面我们先看一下Docker网络的构成。

技术分享

查看网络设置

技术分享启动docker服务就会产生一个docker0的虚拟网桥设备。veth*这个是启动一个容器就会产生一个这样的设备该设备与容器内的etho虚拟网卡对应,这个veth*你可以理解为虚拟网卡,这个虚拟网卡插在docker0这个虚拟网桥上。veth*就是容器eth0在宿主机上的映射。

技术分享

下面看一下docker run命令中和网络有关的参数:

--dns=IP  #指定DNS服务器
--dns-search=DOMAIN  #指定搜索域
-h HOSTNAME  #设置容器的主机名称
--link=容器名:别名  #启动该容器时与指定的容器进行链接,这样容器间可以通过名称来访问
-p  #映射主机端口
--net=bridge  #默认配置,为容器创建独立的网络命名空间,分配网卡、IP地址并通过veth接口
              #将容器挂到docker0虚拟网桥上。
--net=none    #为容器创建独立的网络命名空间,但不进行网络设置,容器没有网卡和IP
--net=host    #容器和宿主机共享网络设置,在容器中看到的网络信息都与宿主机一样,也就是
              #不为容器创建独立的网络命名空间。
--net=user_defined_network  #用户自行使用network创建一个网络,同一个网络内的容器彼
                            #此可见。类似于vmware中你可以创建多个网络通道比如vmnet1
                            #、vmnet2等。
--net=container:容器名称或者ID  #表示该容器共享指定容器的网络命名空间。

容器的DNS配置:

容器中的主机名和DNS设置是通过/etc/resolv.conf、/etc/hostname和/etc/hosts三个文件来维护的,如下图:

技术分享/etc/resolv.conf文件在创建容器时,默认和宿主机上的一样;/etc/hosts文件默认只有一条容器自己的记录;/etc/hostname记录了容器自己的主机名。你可以直接修改容器的这三个文件,但是容器一旦重启就失效了。

所以在运行docker run的时候使用--dns=IP来在容器中的/etc/rsovle.conf文件之后添加额外的DNS服务器地址。

本文出自 “小恶魔的家” 博客,请务必保留此出处http://littledevil.blog.51cto.com/9445436/1922922

(七)Docker网络