一.自定义docker网络
四种网络模式
host模式
container模式
none模式
bridge模式
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转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
就只是共享了宿主机的ip地址和端口而已,其他的方面还是域宿主机隔离的
container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信
none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network
Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。除了自己指定ip之外,它默认自动分配的ip是单调递增式的
(1).创建docker网络(自动按顺序分配ip)
#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
(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
查看ip addr
#查看docker网络的详细参数
[root@foundation66 ~]# docker network inspect my_net2
二.如何让不同网桥的容器通信
实验环境:
vm3: 172.17.0.2
vm4: 172.20.0.10
1.下载并导入镜像
镜像:
ubuntu.tar
#1.在网站上下载ubuntu.tar镜像
[root@foundation66 ~]# ls
ubuntu.tar
#2.导入镜像
[root@foundation66 ~]# docker load -i ubuntu.tar
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
解决方案:
#为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
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
三.容器隔离
实验环境:
server1:vm1 172.25.66.10
server2:vm1 172.25.66.11
[root@sever1 ~]# ip link set eth0 promisc on
[root@sever1 ~]# ip addr
2.开启混杂模式
[root@sever1 ~]# ip link set eth0 promisc on
[root@sever1 ~]# ip addr
3.下载并导入镜像
4.添加docker网络
[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结点)
2.开启混杂模式
[root@server2 ~]# ip link set eth0 promisc on
[root@server2 ~]# ip addr
3.下载并导入镜像
4.添加docker网络
[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