浅谈Docker的四种网络模式 、容器的互通与隔离

一.自定义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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值