Docker基本命令与使用 —— Docker容器网络深入篇(五)

Docker网络介绍

Docker网络官网: https://docs.docker.com/network/
Docker是基于Linux Kernel的namespace, CGroups, UnionFileSystem等技术封装成的一种自定义的容器格式,从而提供了一套虚拟运行环境。
namespace: 用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]
CGroups: Controller Groups 用来做资源限制,比如内存和CPU等
Union Filie Systems: 用来做Image和Container分层
 这里,我们首先需要对linux的网络隔离network namespace有一定的了解。
可以先看我这篇文章:Linux网络 —— Network namespace

1.docker网络通信

先启动两个docker容器(需要带有ip 命令),如果没有先执行: yum install initscripts -y
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat

0

两个容器可以互相连通:
0
 
[思考:它们分别属于两个不同的namespace,它们是如何ping通的?]
在宿主机执行 ip a
发行多了两张网卡,分别是 if6 和 if8 , 对应到容器中的是 if7 和 if9
0
原理图如下:
0
验证:
yum install -y bridge-utils
brctl show

0

7和9实际是docker0 维护的两块网卡。每多一个容器,docker0 就会多一个维护的网卡,进行和容器内网络通信。
 
2.深入分析Container 网络 - Bridge
2.1 docker默认bridge.
docker network ls

0

# 验证查看
docker network inspect bridge

0

 
[思考:docker容器为什么能访问外网?]
0
容器本身只有lo 本地回环网络,和与docker0通信的eth0。并没有连接外网的方式。
0
网络转换,利用iptables相关技术。(需要很强的linux网络知识)
0
iptables-save
0
2.2 docker自定义Network
# 创建新的网卡信息
docker network create tomcat-net
docker network ls
docker network inspect tomcat-net    # 现在没有什么网卡信息,containers为空
# 删除网卡信息
docker network rm tomcat-net
docker network ls
# 创建时指定ip段
docker network create --subnet=172.18.0.0/24 tomcat-net

0

# 指定容器使用新创建的网络(网卡)
docker run -d --name custom-net-tomcat --network tomcat-net tomcat
docker exec -it custom-net-tomcat ip a

查看发行已经使用了新的18网段了

0
宿主机使用 ip a ,发现多了新创建的网桥,和 if19 [ 对应 上面容器内的 if20]
0
使用 brctl show ,发现多了一个网桥,对应的接口就是 if19
示意图:
0
此两个网络互相ping不通 172.17.0.2 〈-〉 172.18.0.2
0
如何使此两个网段能互相访问?
给tomcat01再分配新的IP,18网段使它们能够相互通信。
# 查看原先tomcat-net网络信息
docker network inspect tomcat-net

此处只有一个172.18.0.2的容器

0
# 让tomcat-net网卡 连接tomcat01 容器
docker network connect tomcat-net tomcat01
# 再次查看tomcat-net网络
docker network inspect tomcat-net

发现tomcat01已经分配了172.18.0.3 的IP

0
再次查看tomcat01容器内的网卡信息,发现增加了eth@if24网卡,IP为172.18.0.3
0
宿主机 ip a 发现也多了一个if23的网卡
0
# 测试发现 tomcat01 和 custom-net-tomcat 两个容器已经能互相访问
docker exec -it tomcat01 ping 172.18.02
docker exec -it custom-net-tomcat ping 172.18.0.3

通过inspect查看 tomcat-net网络。发现它有一个容器name和ip的对应,实际它实现了类似dns的功能,刻意直接访问容器名。

docker network inspect tomcat-net
0
# 测试发现 这样也是能 ping 的通的
docker exec -it tomcat01 ping custom-net-tomcat
docker exec -it custom-net-tomcat ping tomcat01

3.深入分析Container 网络 -- Host和None

Host:
# 创建一个host模式的容器
docker run -d --name my-tomcat-host --network host tomcat
# 发现此网络信息就是宿主机的网络信息
docker exec -it my-tomcat-host ip a
# 查看host网络信息
docker network inspect host

发现mac地址和ip都没有分配,其实就是利用宿主机的配置

0
None:
# 创建一个host模式的容器
docker run -d --name my-tomcat-none --network none tomcat
# 查看网络
docker exec -it my-tomcat-host ip a

发现只有本地的回环网络,没有其他的网络信息。说明通过none模式创建的容器,对外部是不通的。

0
# 查看none网络信息
docker network inspect none

同样的mac地址和ip都没有。

0
4.端口映射
docker run -d --name port-tomcat -p 8090:8080 tomcat

它映射到宿主的8090端口,外部机器也可以通过宿主机的ip:8090访问到该服务。

5.多机通信
Docker Swarm技术
0
0
docker swarm 用的是ingress overlay网络
0
docker service create --name my-tomcat -p 8088:8080 tomcat

虽然只是分配到node1节点,但集群所有ip:8088均能访问到这个服务 。

0
底层是通过overlay实现的。
0
overlay
overlay在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其他网络业务分离,并且以基于IP的基础网络技术为主
VXLAN(Virtual extensible LAN)技术是当前主流的Overlay标准
posted @ 2022-05-09 17:43  海~~D  阅读(129)  评论(0编辑  收藏  举报