【云原生】Docker网络原理及数据卷、书卷容器、容器互联

 docker网络模式的特性 

docker初始状态下有三种默认的网络模式 ,bridg(桥接),host(主机),none(无网络设置)

docker network ls
网络模式 配置 说明
host//主机模式 –network host 容器和宿主机共享网络命名空间
container//容器模式 –network container:容器的id或者名字 容器与指定的容器共享网络命名空间
none//无网络模式 –network none 容器拥有独自的网络命名空间,但是没有任何设置
bridge//桥接模式 –network bridge 容器拥有独自的网络命名空间,且拥有独立的IP,端口,路由等,使用veth pair 连接docker0 网桥,并以docker0网桥为网关

1.1 host主机模式


相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离 文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespacel隔离。一个Docker容器一 般会分配一个独立的Network. Namespace。

但如果启动容器的时候使用host模式, 那么这个容器将不会获得一 个独立的Network Namespace,而是和宿主机共用一个Network Namespace。 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

容器和宿主机共享网络命名空间,但没有独立IP地址,使用宿主机的IP地址,和宿主机共享端口范围,例如宿主机使用了80端口,那么容器不能使用80端口。这种模式比较方便,但不安全。 

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第1张图片


#创建容器web1,指定网络模式为 host
 #容器和宿主机共享网络命名空间,但没有独立IP地址。使用宿主机的IP,和宿主机共享端口范围。
 docker run -d --name web1 --net=host nginx
 ​
 #访问宿主机的ip和80端口,则可以访问到tt1的nginx服务
 curl http://192.168.255.133:80

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第2张图片

1.2  container模式


在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 新创建的容器不会创建自己的网卡,配置自己的Ie,而是和一个指定的容器共享re、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

新创建的B容器和A容器共享命名空间。假如A容器使用了80端口,B容器就不能使用80端口。 
【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第3张图片

#基于镜像centos:7 创建一个名为web2的容器
docker run -itd --name web2 centos:7 /bin/bash
#查看容器web2的pid号
docker inspect -f '{{.State.Pid}}' web2
ls -l /proc/web2的pid/ns
 
#创建web3容器,使用container网络模式,和web2共享网络命名空间
docker run -itd --name web3 --net=container:web2 centos:7 bash
#查看web3容器的pid
docker inspect -f '{{.State.Pid}}' web3
ls -l /proc/web3的pid/ns/
#可以看到web3和web2共享同一个网络命名空间
 

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第4张图片

 切记:镜像是容器的基础,想要创建并运行一个容器,首先要拉取镜像

 1.3  none模式


使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个locker容器没有网卡、iP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡、这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第5张图片

1.4 bridge 桥接模式
 bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。

相当于Vmware中的 nat模式,容器使用独立.network Namespace,并连接到docker)虚拟网卡。通过dockerO网桥以及iptables

nat表配置与宿主机通信,此模式会为每一个容器分配hetwork Mamespace、设置等,并将一个主机上的 Docker容器连接到一个虚拟网桥上。

 (1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Dokcer容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2)从docker0子网中分配一个IP给容器使用,并设置dockerO的I地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来、因此,veth设备常用来连接两个网络设备。

(3 ) Docker将 veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show命令查看。

(4) 使用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

​
[root@localhost opt]#docker run -id --name c1  centos:7
[root@localhost opt]#docker run -id --name c2  centos:7
[root@localhost opt]#docker run -id --name c3  centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker run -id --name c4  -p 8080:80 centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker ps -a
                                     

​

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第6张图片

 【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第7张图片

1.5 容器的自定义网络

​
ifconfig docker0

​

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第8张图片

(1)未创建自定义网络时,创建指定IP容器的测试

指定容器IP的方式: 

注意:创建指定IP的容器也需要基于docker网卡的IP网段 

​
docker run -id --name a1 --ip 172.17.0.66   605c77e624dd
ping 172.17.0.66
docker run -id --name a2 --network bridge --ip 172.17.0.65   605c77e624dd

​

(2)创建自定义docker网络 

 创建自定义网络:

docker network create --subnet=172.66.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第9张图片

 再次创建指定IP的容器:

docker run -id --net=mynetwork --ip 172.66.0.66 --name a3 centos:7
ping 172.66.0.66

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第10张图片

Docker容器网络生产经验,docker的网络建议和宿主机的IP"对照”:

 比如宿主机地址10.2.5.6,容器的地址就可以修改为172.5.6.x,这样方便在故障发生时,更容易定位故障节点位置。 

1.数据卷(容器与宿主机之间数据共享) 

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。 

想要将容器中的数据持久化,可以将宿主机目录挂载到容器中。

一般只建议在创建容器时进行挂载,不建议启动容器后再挂载。因为启动容器后再挂载的话,需要修改配置文件,且不一定能挂载成功。

 docker run -v 数据卷              #在容器内创建数据卷
 ​
 docker run -v 宿主机目录:数据卷    #将宿主机目录挂载到容器中
 #注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
 #挂载后的目录默认可读可写
 

 【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第11张图片

  

2.  数据卷容器(容器与容器之间数据共享)

有时时候,容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。 

#创建数据卷容器co1。创建/data1和/data2两个数据卷。
 docker run -id --name co1 -v /data1 -v /data2 -itd centos:7
 docker exec -it co1 bash                #进入web2容器
 
 #使用--volumes-from 来挂载co1容器中的数据卷到新的容器co2
 docker run -id --volumes-from co1 --name co2 centos:7
 docker exec -it co2 bash       #进入web3容器
 

【云原生】Docker网络原理及数据卷、书卷容器、容器互联_第12张图片

 3. 容器互联(使用centos镜像)

  容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之问建立一条隧道,接收容器可以看到源容器指定的信息。

3.1 实现容器互联 

#创建并运行源容器取名c1
 docker run -itd -P --name c1 centos:7 /bin/bash
 #创建并运行接收容器取名c2,使用--1ink选项指定连接容器c1以实现容器互联。
 docker run -itd -P --name c2 --link c1:c2 centos:7 /bin/bash
 ##--link 容器名:连接的别名
 ​
 #进c2容器,ping c1,通过容器名称或者别名都可以通信
 docker exec -it c2 bash
 
 #可以看到c1容器的IP地址
 ​
 #进入c1容器,查看c1的IP地址
 docker exec -it c1 bash
 yum install -y net-tools   #下载网络工具
 ifconfig                   #查看IP和c2中显示的一致

你可能感兴趣的:(docker,云原生,linux)