Docker网络
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器Container-IP直接通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。
原理:
1、每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。桥接网卡
2、每启动一个容器linux主机多了一个虚拟网卡。
3、docker run -d -P --name tomcat --net bridge tomcat:8
网络模式
docker默认使用桥接模式
网络模式 | 配置 | 说明 |
bridge模式 | --net=bridge | 默认值,在Docker网桥docker0上为容器创建新的网络 栈 |
none模式 | --net=none | 不配置网络,用户可以稍后进入容器,自行配置 |
container模 式 | -- net=container:name/id | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。(联盟式容器) |
host模式 | --net=host | 容器和宿主机共享Network namespace; |
用户自定义 | --net=mynet | 用户自己使用network相关命令定义网络, 创建容器的时候可以指定为自己定义的网络 |
--update 2022年5月13日23:18:04 结合下面这个图来理解。
docker桥接网络模式示意图
多主机通信
docker网络-端口转发
docker run -it --name --rm myweb -p 80 nginx
-p 参数的指定会在iptables的nat表中新增转发记录。
宿主机上如何访问这个myweb服务呢?
因为重启了myweb服务,所以端口变成了49154. 宿主机可以通过49154访问到nginx服务。
删除该容器之后,iptables中的nat表内容自动删除。
还有另外一种方式查看这种映射关系
docker port containername
-P 不指定端口,暴露构建镜像时的默认端口,例如Nginx,不适用任何端口暴露,宿主机是无法访问的,可以使用-P 参数无需指定端口,宿主机通过80端口可访问nginx,因为nginx默认暴露的是80端口。
联盟式容器
自定义docker0网桥
远程连接其他服务器上的docker deamon
这个和mysql的通信是类似的。
同一个宿主机上创建多个docker网桥
docker network create
可以指定子网以及网关
启动容器的时候就可以指定所要连接的网桥.
只要宿主机开启了路由转发功能,两个网段的容器是可以通信的。
实战
创建4个Docker容器:con1、con2、con3、con4
$ docker run -itd ——name con1 ubuntu /bin/bash
$ docker run -itd ——name con2 ubuntu /bin/bash
$ docker run -itd ——name con3 ubuntu /bin/bash
$ docker run -itd ——name con4 ubuntu /bin/bash
在主机上查看网络