Docker之四种网络模式 、容器的互通与隔离
1.自定义docker网络
四种网络模式:
- host模式: 使用--net=host指定
- container模式: 使用--net=container:NAME_or_ID指定
- none模式: 使用--net=none指定
- bridge模式: 使用--net=bridge指定,默认设置
1.host模式
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。
一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。
当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
2.container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
3.none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4.bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
(1).创建docker网络(自动按顺序分配ip) 查看docker网络
[root@foundation66 ~]# docker network ls
查看docker0接口
[root@foundation66 ~]# ip addr show docker0
查看桥接
[root@foundation66 ~]# brctl show
1.创建docker网络:my_net1,默认为bridge模式,
[root@foundation66 ~]# docker network create --driver bridge my_net1
c92937ccafec29c36ae59394d992c4bb7b122138694eca459b6326e31f828643
2.查看docker网络
[root@foundation66 ~]# docker network ls
3.查看ip
[root@foundation66 ~]# ip addr
4.查看docker网络的详细参数
[root@foundation66 ~]# docker network inspect my_net1
自动分配IP到这里就结束了。
(2).创建docker网络并指定ip与网关 创建docker网络:my_net2,--subnet表示指定子网ip,--gateway表示指定网关
[root@foundation66 ~]# docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 my_net2
df8547dce1d5c52bcd3d70832ccb4787e847e1507a9539fc73c20107f025f786
[root@foundation66 ~]# docker network ls
查看地址
[root@foundation66 ~]# ip addr
查看docker网络的详细参数
[root@foundation66 ~]# docker network inspect my_net2
可以看到已经完成了指定IP的绑定
2.如何让不同网桥的容器通信
实验环境:
vm3: 172.17.0.2
vm4: 172.20.0.10
1.下载并导入镜像 镜像:
[root@foundation66 ~]# ls
ubuntu.tar
[root@foundation66 ~]# docker load -i ubuntu.tar
[root@foundation66 ~]# docker images
2.创建容器
1.交互式创建并运行容器:vm3,--net表示指定docker网络(默认系统会自动指定ip,按顺序指定)
[root@foundation66 ~]# docker run -it --name vm3 --net my_net1 ubuntu
root@86e6bd28168a:/# ip addr
#2.交互式创建并运行容器:vm4,--ip表示指定ip
[root@foundation66 ~]# docker run -it --name vm4 --net my_net2 --ip 172.20.0.10 ubuntu
root@226797aa4fd6:/# ip addr
测试:发现两个容器之间无法进行通信,可以和自己的网关进行通信
root@226797aa4fd6:/# ping 172.20.0.1
但不能和vm3容器进行通信
root@226797aa4fd6:/# ping 172.17.0.2
解决方案:
[root@foundation66 ~]# ping 172.17.0.2
查看网络
[root@foundation66 ~]# docker network ls
为vm4容器添加connect my_net1网络
[root@foundation66 ~]# docker network connect my_net1 vm4
测试:此时两个容器便能通信
在vm4容器中(my_net2):
1.发现多了一个eth1接口
root@226797aa4fd6:/# ip addr
2.可以与vm3通信
root@226797aa4fd6:/# ping 172.17.0.2
3.发现会自动解析
root@226797aa4fd6:/# ping vm4
4.也可以直接与vm3容器名通信
root@226797aa4fd6:/# ping vm3
rhel7与ubuntu的区别:
[root@foundation66 ~]# iptables -t nat -nL
rhel7镜像需要指定shell
[root@foundation66 ~]# docker run -it --name vm5 rhel7 bash
bash-4.2# exit
exit
ubuntu镜像会自动抛出一个shell
[root@foundation66 ~]# docker run -it --name vm6 ubuntu
root@acf62a0c9186:/# exit
exit
[root@foundation66 ~]# docker rm vm5
vm5
[root@foundation66 ~]# docker rm vm6
vm6
3.容器隔离
实验环境:
server1:vm1 172.25.66.10
server2:vm1 172.25.66.11
在server1上:
1.下载并安装docker服务
[root@server1 ~]# ls
包含如下文件
[root@server1 ~]# yum install -y *
[root@server1 ~]# systemctl start docker
2.开启混杂模式
[root@sever1 ~]# ip addr
显示地址
[root@sever1 ~]# ip link set eth0 promisc on
[root@sever1 ~]# ip addr
3.下载并导入镜像
[root@server1 ~]# ls
ubuntu.tar
[root@server1 ~]# docker load -i ubuntu.tar
[root@sever1 ~]# docker images
4.添加docker网络
[root@sever1 ~]# docker network ls
添加地址
[root@sever1 ~]# docker network create -d macvlan --subnet 172.25.66.0/24 --gateway 172.25.66.1 -o parent=eth0 mac_net1
45112a60df10a6d28b0baeeae8146b570f734742dc09840b2041647a888bcc79
[root@sever1 ~]# docker network ls
5.创建容器
[root@sever1 ~]# docker run -it --name vm1 --net mac_net1 --ip 172.25.66.10 ubuntu
root@8563c690b3d8:/# ip addr
容器网络情况
在server2上:(操作同server1结点) 1.下载并安装docker服务
[root@server2 ~]# ls
包含如下文件
[root@server2 ~]# yum install -y *
[root@server2 ~]# systemctl start docker
2.开启混杂模式
[root@server2 ~]# ip addr
设置网卡信息
[root@server2 ~]# ip link set eth0 promisc on
[root@server2 ~]# ip addr
3.下载并导入镜像
下载镜像
ubuntu.tar
[root@server2 ~]# ls
ubuntu.tar
[root@server2 ~]# docker load -i ubuntu.tar
[root@sever2 ~]# docker images
导入成功:
4.添加docker网络
[root@server2 ~]# docker network ls
添加IP信息
[root@server2 ~]# docker network create -d macvlan --subnet 172.25.66.0/24 --gateway 172.25.66.1 -o parent=eth0 mac_net1
8ff7cde84b0ef2746e050ee70d7310d9b5012538e68d34a0e4ab4bc6eba4974b
[root@server2 ~]# docker network ls
5.创建容器
[root@server2 ~]# docker run -it --name vm1 --net mac_net1 --ip 172.25.66.11 ubuntu
root@d7b69f64e946:/# ip addr
测试:发现两个容器间可以相互通信
root@d7b69f64e946:/# ping 172.25.66.10
测试完成。
那么如何让两个容器间不能进行通信呢,即实现容器隔离
实验环境:
server1:vm2 172.25.67.10
server2:vm2 172.25.67.11
先给server1和server2结点都添加eth1网卡
在server1上:
1.激活eth1网卡
[root@sever1 ~]# ip addr
激活网卡
[root@sever1 ~]# ip link set up eth1
[root@sever1 ~]# ip addr show eth1
2.开启混杂模式
[root@sever1 ~]# ip link set eth1 promisc on
[root@sever1 ~]# ip addr show eth1
3.添加docker网络
[root@sever1 ~]# docker network create -d macvlan --subnet 172.25.67.0/24 --gateway 172.25.67.1 -o parent=eth1 mac_net2
80c32c03f7f606d311b41d28f49d1020be13021c8d1d73051476ed45a459f2b4
[root@sever1 ~]# docker network ls
4.创建容器
[root@sever1 ~]# docker run -it --name vm2 --net mac_net2 --ip 172.25.67.10 ubuntu
root@c84bf32e9e32:/# ip addr
在server2上:(操作同server1)
1.激活网卡
查看网卡 ip addr
[root@server2 ~]# ip link set up eth1
[root@server2 ~]# ip addr show eth1
2.开启混杂模式
[root@server2 ~]# ip link set eth1 promisc on
[root@server2 ~]# ip addr show eth1
3.添加docker网络
[root@server2 ~]# docker network create -d macvlan --subnet 172.25.67.0/24 --gateway 172.25.67.1 -o parent=eth1 mac_net2
e73ac87d9c2e4673d54109d49952972f5544f7494849678f35aa5d265da9bab3
[root@server2 ~]# docker network ls
4.创建容器
[root@server2 ~]# docker run -it --name vm2 --net mac_net2 --ip 172.25.67.11 ubuntu
测试:发现此时两个容器间便无法通信,即实现了容器隔离
root@5918726bcc06:/# ping 172.25.66.10
root@5918726bcc06:/# ping 172.25.66.11
如果此时希望两个容器间可以通信该怎么做?
实验环境:
server1:vm3 172.25.68.10
server2:vm3 172.25.68.11
在server1上:
1.添加docker网络
[root@sever1 ~]# docker network create -d macvlan --subnet 172.25.68.0/24 --gateway 172.25.68.1 -o parent=eth1.1 mac_net3
5fa064dfc93f313f5e9b3b9206541ef45446bd70d3711ad99b56e236151717bc
[root@sever1 ~]# docker network ls
2.创建容器
[root@sever1 ~]# docker run -it --name vm3 --net mac_net3 --ip 172.25.68.10 ubuntu
root@a2e5e2ea24e5:/# ip addr
在server2上:
1.添加docker网络
[root@server2 ~]# docker network create -d macvlan --subnet 172.25.68.0/24 --gateway 172.25.68.1 -o parent=eth1.1 mac_net3
55a2ea2bd9048cc499c9b913bc6060609f9fed4541d08681f60e4a42c8790c97
[root@server2 ~]# docker network ls
2.创建容器
[root@server2 ~]# docker run -it --name vm3 --net mac_net3 --ip 172.25.68.11 ubuntu
root@b1767e9a0ffc:/# ip addr
测试:发现此时便可以进行通信
root@b1767e9a0ffc:/# ping 172.25.68.10
到这里基本上就结束了
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/05/16 03:31