Docker网络服务
加入Docker中一个容器运行着Tomcat,有一个容器运行着MySQL,由于容器和容器之间的隔离性,这两个容器的数据是相互访问不到的。如果要二者进行通信,那么就需要配置Docker网络服务。
Docker允许通过外部访问容器或容器互联的方式来提供网络服务。
容器互联的方式现在Docker已经不推荐使用了,新版的Docker支持高级网络配置来设置网络通信。
Docker通信机制
当 Docker 启动时,会自动在主机上创建一个 bridge 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会挂载到它的网口之间进行转发。
可以粗略的总结容器与宿主机之间的通信依靠的就是这个bridge,但是不准确。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 (opens new window)中定义)中的一个地址给 bridge 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 bridge 网桥,名称以 veth 开头(例如 vethAQI2QT,veth是virtual Ethernet的简写)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
注意:在Linux的开源标准中,所有操作系统都必须有eth0作为默认网卡。(CentOS 7例外,CentOS 7将eth0改成了ens33)
构建网桥
上面描述的这种通信方式好不好呢?
有一个缺点,所有容器都运行在同一个网桥上(默认bridge),如果某些容器频繁的传输数据,会对另外其他容器的带宽造成影响。从实战的角度来说,我们不能让Docker中所有容器都运行在同一个网桥上,所以我们通常不使用默认bridge,我们应该基于应用,自己构建网桥。
构建规则:一个项目构建一个网桥,项目和项目之间不能跨项目通信。
命名规则:网桥的名字和项目名保持一致。
Docker网络相关命令
1. 查看所有网桥
docker network ls
2. 创建网桥
docker create 网桥名称
上面这个命令是简写形式,详细写法为
docker create -d bridge 网桥名称
- -d bridge表示指定网桥为bridge方式。
注意:当前Docker中并不只有bridge这一种配置方式,但是bridge是官方推荐的,也是默认的配置方式。
3. 容器指定网桥
docker run --network 网桥名称 镜像名:镜像版本 | 镜像ID
注意:
- 一旦容器创建了之后,Docker会给该容器分配一个IP,如果同时指定了network,Docker就会将该容器的名称和IP进行映射(Host解析成域名)。这样以来,如果就算容器的IP变了,也无所谓,通信时直接访问容器名称(域名)代替IP就行了。
- 创建容器时指定的网桥必须事前已经创建完毕,该命令不能自动创建网桥。
4. 删除网桥
docker network rm 网桥名称
5. 查看网桥详细信息
docker inspect 网桥名称
注意:该命令不仅可以查看指定网桥的详细信息,还可以看到在该网桥上所有容器的IP等信息。