Docker四种网络模式演示及连通性测试

Docker 的四种网络模式

网络模式 网络配置 说明
host(开放式网络模式) –network host 容器和宿主机共享 Network namespace
container(联合挂载式网络模式) –network container 多个容器共享一个 Network namespace
none(封闭式网络模式) –network none 将容器放置在它自己的网络栈中,但是并不进行任何配置,该模式关闭了容器的网络功能
bridge(桥接式网络模式) –network bridge Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等

docker network 查看 docker 网络模式

[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
15791bf83278        bridge              bridge              local
df75b40e39f6        host                host                local
f89ee64125bc        none                null                local

docker run --network 命令可以指定使用的网络模式

host 模式

Docker四种网络模式演示及连通性测试_第1张图片

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 。但是, 容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的 。

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

host 模式演示

以 host 网路模式运行容器centos

[root@docker ~]# docker run -itd --name centos --network host centos:latest

查看该容器的网络模式

[root@docker ~]# docker inspect 40c4e28bd29c | grep -i network
            "NetworkMode": "host",
        "NetworkSettings": {
            "Networks": {
                    "NetworkID": "df75b40e39f671cbc4d287fefce8b7b64819fcad453cfe7f34831f6490480760",

查看容器 IP

[root@docker ~]# docker exec -it $(docker ps -q) hostname -I 
192.168.117.130 172.17.0.1 

container 模式

Docker四种网络模式演示及连通性测试_第2张图片

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

container 模式演示

使用 bridge 网络模式启动一个 centos_1 容器

	[root@docker ~]# docker run -itd --name centos_1 --network bridge centos:latest
	10ec9d1e3a6b7530cff797cdfc2c44702b62f9f29dcee679306a0262d1e41226
#查看该容器的网络模式
	[root@docker ~]# docker inspect 10ec9d1e3a6b | grep -i network
            "NetworkMode": "bridge",
        "NetworkSettings": {
            "Networks": {
                    "NetworkID": "ae7c4bfdd3910f8a00cb962afd06cf296d7d04a99611a6ab154d496ca777183b",
#查看容器IP
	[root@docker ~]# docker exec -it 10ec9d1e3a6b hostname -I
	172.17.0.2 

使用 container 网络模式启动一个 centos_2 容器

	[root@docker ~]# docker run -itd --name centos_2 --network container:centos_1 centos:latest
	1f7d976b3f80dd064fd87902dacefc72b617acc6f7917a2f0adb434cb5ff0d11
#查看该容器的网络模式
	[root@docker ~]# docker inspect 1f7d976b3f80 | grep -i network
            "NetworkMode": "container:centos_1",
        "NetworkSettings": {
            "Networks": {}
#查看容器IP
	[root@docker ~]# docker exec -it 1f7d976b3f80 hostname -I
	172.17.0.2 

测试 centos_2 与宿主机的连通性

#通信正常
	[root@docker ~]# docker exec -it 1f7d976b3f80 ping 192.168.117.130
	PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
	64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.135 ms
	64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.046 ms
	64 bytes from 192.168.117.130: icmp_seq=3 ttl=64 time=0.057 ms

测试 centos_2 与外网的连通性

#通信正常
	[root@docker ~]# docker exec -it 1f7d976b3f80 ping www.baidu.com
	PING www.a.shifen.com (61.135.185.32) 56(84) bytes of data.
	64 bytes from 61.135.185.32 (61.135.185.32): icmp_seq=1 ttl=127 time=4.45 ms
	64 bytes from 61.135.185.32 (61.135.185.32): icmp_seq=2 ttl=127 time=4.27 ms

none 模式

Docker四种网络模式演示及连通性测试_第3张图片

使用none模式,Docker容器拥有自己的Network Namespace,但是, 并不为Docker容器进行任何网络配置 。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo 网络接口。需要我们自己为Docker容器添加网卡、配置IP等。

不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份进程诊断及各种离线任务等。

 none 模式演示

使用 none 网络模式启动一个 centos_1 容器

[root@docker ~]# docker run -itd --name centos_1 --network none  centos:latest
b70dddea0a3a554c0c658442fcce8950a272148192b9622a1c5e6baa92be705c
#查看该容器的网络模式
	[root@docker ~]# docker inspect b70dddea0a3a | grep -i network
	            "NetworkMode": "none",
	        "NetworkSettings": {
	            "Networks": {
	                    "NetworkID": "f89ee64125bc9606a0e30f5d6c52d21bbdd10b14cd32191c783967a41675497c",
#查看容器IP
	[root@docker ~]# docker exec -it b70dddea0a3a hostname -I
	#IP为空

测试 centos_1 与宿主机的连通性

#无法通信
	[root@docker ~]# docker exec -it b70dddea0a3a ping 192.168.117.130
	connect: Network is unreachable

bridge 模式

Docker四种网络模式演示及连通性测试_第4张图片

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

从 docker0子网中分配一个IP给容器使用 ,并设置 docker0的IP地址为容器的默认网关 。在主机上 创建一对虚拟网卡 veth pair设备,Docker将veth pair设备的 一端放在新创建的容器 中,并命名为eth0(容器的网卡), 另一端放在主机中 ,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

#如果您的主机没有 brctl 命令,请安装网桥管理工具包
	[root@docker ~]# yum install -y bridge-utils 
#查看网桥
	[root@docker ~]# brctl show
	bridge name	bridge id		STP enabled	interfaces
	docker0		8000.02426f470008	no	

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

 bridge 模式演示

创建一个网桥 centos-net

	[root@docker ~]# docker network create -d bridge centos-net
	1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218
#查看创建的网桥
	[root@docker ~]# brctl show
	bridge name	bridge id		STP enabled	interfaces
	#新创建的网桥
	br-1d8d918c3488		8000.024297951600	no	
	#系统默认的网桥	
	docker0		8000.02426f470008	no	
	[root@docker ~]# ip a
	8: br-1d8d918c3488:  mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:97:95:16:00 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-1d8d918c3488
       valid_lft forever preferred_lft forever

使用 bridge 网络模式启动一个 centos_1 容器

	[root@docker ~]# docker run -itd --name centos_1 --network centos-net centos:latest
	f5bdd3510cc84a6fdeef10f062589770daa663aa31855131cab3fa0627e98d3d
#查看该容器的网络模式
	[root@docker ~]# docker inspect f5bdd3510cc8 | grep -i network
	            "NetworkMode": "centos-net",
	        "NetworkSettings": {
	            "Networks": {
	                    "NetworkID": "1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218",
#查看容器IP
	[root@docker ~]# docker exec -it f5bdd3510cc8 hostname -I
	172.18.0.2 

使用 bridge 网络模式启动一个 centos_2 容器

	[root@docker ~]# docker run -itd --name centos_2 --network centos-net centos:latest
#查看该容器的网络模式
	[root@docker ~]# docker inspect $(docker ps -n 1 -q ) | grep -i network
            "NetworkMode": "centos-net",
        "NetworkSettings": {
            "Networks": {
                    "NetworkID": "1d8d918c3488b0e5b3f15ecd5c35c1dc36a87c66dc39fa38fbefcdc6ef471218",
#查看容器IP
	[root@docker ~]# docker exec -it $(docker ps -n 1 -q ) hostname -I
	172.18.0.3 

查看网桥连接状况

[root@docker ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-1d8d918c3488		8000.024297951600	no		veth44c8534
							vethef015ff
docker0		8000.02426f470008	no	

测试容器之间的连通性

[root@docker ~]# docker exec -it f5bdd3510cc8 ping 172.18.0.3 
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.045 ms

测试容器与宿主机间的连通性

#容器 centos_1 与宿主机间的连通性
	[root@docker ~]# docker exec -it f5bdd3510cc8 ping 192.168.117.130
	PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
	64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.102 ms
	64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.042 ms
#容器 centos_2 与宿主机间的连通性
	[root@docker ~]# docker exec -it 78854ab16473  ping 192.168.117.130
	PING 192.168.117.130 (192.168.117.130) 56(84) bytes of data.
	64 bytes from 192.168.117.130: icmp_seq=1 ttl=64 time=0.103 ms
	64 bytes from 192.168.117.130: icmp_seq=2 ttl=64 time=0.043 ms

以上就是Docker四种网络模式演示及连通性测试的详细内容,更多关于Docker网络模式连通性测试的资料请关注脚本之家其它相关文章!

你可能感兴趣的:(Docker四种网络模式演示及连通性测试)