Docker网络管理
网络基础基础
- 科普下常见的两种网络分层结构类型
一个是7层一个是4层,4层是对7的一个归纳和抽象,标准的模型是7层的
- 常用查看网卡命令:
ls /sys/class/net /
或者ip a
- 关于docker的几个网卡的简单介绍
执行命令ip a
后
默认创建的容器都是在docker0这个network中,可以创建自己的network,指定容器运行在特定的network中
namespaceh和veth-pair技术
veth pair :Virtual Ethernet Pair,是一个成对的端口(veth-pair的link),可以实现两个namespace之间通信
观察容器中veth-pair对
- 创建两个tomcat容器
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat
查看宿主机网络情况:ip a
从上图中我们发现生成了两个veth-pair的link,但是它们其实不是一对,应为二者明显数字不是连续的
我们再看下两个tomcat容器的网路情况:docker exec -it tomcat01 ip a
其中eth0@if6和eth0@if7是一对veth-pair,eth0@if8和eth0@if9是一对veth-pair;它们都通过docker0来进行通信
我们使用类似命令 docker exec -it tomcat1 ping 172.17.0.3
可以在tomcat01和tomcat02之间互相ping通
其原理示意图如下:
自定义网络配置
- docker默认的网络配置方式
docker network ls
桥接 bridge(默认):虚拟机和宿主机通过桥接方式直连物理网络
主机host:通过共享宿主机ip通信去通信,和宿主机的网络配置显示是一模一样的
none:和外界完全不同的服务,特殊环境下使用
- 创建自己的network:
docker network create my-network
查看docker链接的各容器网络情况:docker network inspect bridge
可以把其它容器加入到多个network中实现之间的通信
自定义的 network中容器间可以通过名字直接访问(自动添加了DNS记录),默认的docker0是只能通过ip地址访问
如果是默认的docker0的network想通过容器名字直接访问,就要通过--link显性的指定要链接的容器
但是--link在生产环境中很少去使用,更加提倡自定义自己的bridge式network去管理容器
所以单机docker的通信最佳方案就是自己创建network,通过容器名称访问
跨network通信
当我们把类似的应用加入到不同的network中时,它们之属于不同的网段,肯定是不能互相通信的
比如新增一个tomcat3,指定在我们刚才创建的network下:docker run -d --name tomcat03 --network my-network -p 8083:8080 tomcat
观察发现tomcat3的网段是在172.18.0.2,而之前的是172.17.0.*,二者是不同的, 通过 docker exec -it tomcat03 ping 172.17.0.3
测试是ping不通的
我们观察my-network的情况,也发现了该network中也只有一个容器
要想让tomcat3和tomcat1能互通该怎么办呢?一个想法就是把tomcat1加入到my-network中来
执行命令 docker network connect my-network tomcat01
后
omcat01已经被加入到了my-network当中,分到的IP是172.18.0.3,这个是时候我们不仅可以通过IP进行ping通,甚至可以根据容器名称来进行,大大提升了开发的灵活性
跨主机通信
- 简单的方案就是通过端口映射来解决,通过外网,依赖DNS
- 另外一个是通过vxlan技术实现,组建成内网,内部地址不能冲突,底层技术是overlay
大致示意图如下:
这块内容涉及到比较专业的网络知识,详情待到后续补充新的文章再细说了
参考文献
docker官方文档: https://docs.docker.com/