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
两个容器可以互相连通:
[思考:它们分别属于两个不同的namespace,它们是如何ping通的?]
在宿主机执行 ip a
发行多了两张网卡,分别是 if6 和 if8 , 对应到容器中的是 if7 和 if9
原理图如下:
验证:
yum install -y bridge-utils
brctl show
7和9实际是docker0 维护的两块网卡。每多一个容器,docker0 就会多一个维护的网卡,进行和容器内网络通信。
2.深入分析Container 网络 - Bridge
2.1 docker默认bridge.
docker network ls
# 验证查看
docker network inspect bridge
[思考:docker容器为什么能访问外网?]
容器本身只有lo 本地回环网络,和与docker0通信的eth0。并没有连接外网的方式。
网络转换,利用iptables相关技术。(需要很强的linux网络知识)
iptables-save
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
# 指定容器使用新创建的网络(网卡) docker run -d --name custom-net-tomcat --network tomcat-net tomcat docker exec -it custom-net-tomcat ip a
查看发行已经使用了新的18网段了
宿主机使用 ip a ,发现多了新创建的网桥,和 if19 [ 对应 上面容器内的 if20]
使用 brctl show ,发现多了一个网桥,对应的接口就是 if19
示意图:
此两个网络互相ping不通 172.17.0.2 〈-〉 172.18.0.2
如何使此两个网段能互相访问?
给tomcat01再分配新的IP,18网段使它们能够相互通信。
# 查看原先tomcat-net网络信息
docker network inspect tomcat-net
此处只有一个172.18.0.2的容器
# 让tomcat-net网卡 连接tomcat01 容器 docker network connect tomcat-net tomcat01 # 再次查看tomcat-net网络 docker network inspect tomcat-net
发现tomcat01已经分配了172.18.0.3 的IP
再次查看tomcat01容器内的网卡信息,发现增加了eth@if24网卡,IP为172.18.0.3
宿主机 ip a 发现也多了一个if23的网卡
# 测试发现 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
# 测试发现 这样也是能 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都没有分配,其实就是利用宿主机的配置
None:
# 创建一个host模式的容器 docker run -d --name my-tomcat-none --network none tomcat # 查看网络 docker exec -it my-tomcat-host ip a
发现只有本地的回环网络,没有其他的网络信息。说明通过none模式创建的容器,对外部是不通的。
# 查看none网络信息
docker network inspect none
同样的mac地址和ip都没有。
4.端口映射
docker run -d --name port-tomcat -p 8090:8080 tomcat
它映射到宿主的8090端口,外部机器也可以通过宿主机的ip:8090访问到该服务。
5.多机通信
Docker Swarm技术
docker swarm 用的是ingress overlay网络
docker service create --name my-tomcat -p 8088:8080 tomcat
虽然只是分配到node1节点,但集群所有ip:8088均能访问到这个服务 。
底层是通过overlay实现的。
overlay
overlay在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其他网络业务分离,并且以基于IP的基础网络技术为主
VXLAN(Virtual extensible LAN)技术是当前主流的Overlay标准