docker生产——容器通信

简介

在接触docker的第一天起,大家应该就知道:docker容器使用沙箱机制,相互之间没有接口,一般情况下内部访问通过IP+端口。本地容器默认分配的IP极易发生变化,所以靠IP+端口访问的方式缺失稳定性。单机模式暂且不讲,集群模式下容器间的通信仅通过内部IP是无法访问的。docker给出解决方案是link和network,本文介绍一下network(link操作会复杂化容器之间的关系,本文既不推荐,也不予详解)。

如果对docker基础不清楚的,这里(强行安利一波)送一波传送门:镜像仓库docker部署netcoredocker安装——centosdocker资料卷——nginxdocker资料卷——mysql

network

network可以称之为网桥,如果给不同容器指定了相同网桥,那么它们之间是可以相互访问的。

使用以下命令查看docker的网桥:

docker network ls

这三个是默认的。在默认情况下,所有容器创建时都会被指派到bridge(这里说的是name而非driver)网桥下,使用以下命令查看bridge信息:

docker inspect bridge

信息会有很多,在海量的信息中找到Containers节点,这个节点内存储了包含在本网桥下的所有容器。因为同在一个网桥下,所以访问是没问题的(容器asp_net_core是web应用,mysql01是数据库,nginx001是web服务器,彼此关联):

网桥的类型

如上图所示,默认的网桥类型有三种:bridge、host、none。

bridge类似于虚拟机内网模式,host代表直接使用宿主机网络,none表示容器不使用任何网络。

假设你的服务器IP为 127.0.0.1 ,内有容器A和B,其中A在host模式网桥下,B在bridge模式网桥下,那么你访问A可以直接使用 127.0.0.1:对应端口,访问B则需要先使用-p指令将服务器IP映射到B中。

常用命令

新增
docker network create [-d 网桥类型] 网桥别名
ps:可以使用-d更改类型,如果不使用-d命令,则默认bridge。

删除
docker network rm 网桥别名

查看列表
docker network ls

查看详情
docker inspect 网桥别名

新容器指定网桥
docker run --name 容器别名 --network 网桥别名 镜像名:版本/镜像ID
PS:此命令不影响-v、-p等命令的使用

已有容器加入网桥
docker network connect 网桥别名 容器别名/容器ID

再说点没用的

容器通信这个问题就像冰山,看起来很简单,实际上水面以下还藏着很多未知。当应用的规模脱离单机,向集群、微服务演变时,才发觉单机下的通信只是冰山一角,很多问题在解决以后才发现,原来都是因为原理不够清晰。

现在我觉得,并不是所有东西我们都要学(即便它真的很酷),如果因为学了就要去用,那就像孔雀的羽毛一样华而不实。适合的才是最好。