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

在这里插入图片描述
(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

在这里插入图片描述

2.如何让不同网桥的容器通信

实验环境:

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 

在这里插入图片描述

#3.查看镜像
[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.下载并导入镜像

ubuntu.tar
[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

在这里插入图片描述

[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.激活网卡

[root@sever2 ~]# 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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/88616218