Docker——容器通信
简介
在接触docker的第一天起,大家应该就知道:docker容器使用沙箱机制,相互之间没有接口,一般情况下内部访问通过IP+端口。本地容器默认分配的IP极易发生变化,所以靠IP+端口访问的方式缺失稳定性。单机模式暂且不讲,集群模式下容器间的通信仅通过内部IP是无法访问的。docker给出解决方案是link和network,本文介绍一下network(link操作会复杂化容器之间的关系,本文既不推荐,也不予详解)。
如果对docker基础不清楚的,这里(强行安利一波)送一波传送门:镜像仓库、docker部署netcore、docker安装——centos、docker资料卷——nginx、docker资料卷——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
再说点没用的
容器通信这个问题就像冰山,看起来很简单,实际上水面以下还藏着很多未知。当应用的规模脱离单机,向集群、微服务演变时,才发觉单机下的通信只是冰山一角,很多问题在解决以后才发现,原来都是因为原理不够清晰。
现在我觉得,并不是所有东西我们都要学(即便它真的很酷),如果因为学了就要去用,那就像孔雀的羽毛一样华而不实。适合的才是最好。