[docker] container 通信 -- bridge
解决了容器运行的问题,之后就需要解决容器之间如何进行通信的问题
docker由于内部针对Linux内核进行封装,具有自己的网络,也有自身处理网络基本请求的方式,所以对于解决通信问题的手段是非常多的。
最基础最基础的方式就是上一篇将内部需要暴露的port与宿主机的某个port绑定起来,但是这样还是有问题。
问题:可以解决外部访问容器内部的问题,但是无法解决容器内部访问外部的问题。
bridge
docker提供第一种解决方式是建立bridge
这个bridge感觉像一个虚拟的网络…
In terms of Docker, a bridge network uses a software bridge which lets containers connected to the same bridge network communicate, while providing isolation from containers that aren’t connected to that bridge network. The Docker bridge driver automatically installs rules in the host machine so that containers on different bridge networks can’t communicate directly with each other.
Bridge networks apply to containers running on the same Docker daemon host. For communication among containers running on different Docker daemon hosts, you can either manage routing at the OS level, or you can use an overlay network.
When you start Docker, a default bridge network (also called
bridge
) is created automatically, and newly-started containers connect to it unless otherwise specified. You can also create user-defined custom bridge networks. User-defined bridge networks are superior to the defaultbridge
network.
比较关键的几句话:
- bridge可以通过hardware或者software实现
- docker选择使用software实现
- 需要运行在同一个daemon下面才能够使用bridge
个人见解,官方意思是并不是让容器内部的Linux内核完成了“物理层面”的网络连接,而是让docker通过bridge帮助他们进行通信。(不知道这个理解对不对)
但我也不知道是在通信那一层级docker截取了信息
default && user-defined
另外,docker 的bridge分为两种,第一种是使用系统default,另外一种是自己构造一个bridge
但二者有不同
User-defined bridges provide automatic DNS resolution between containers.
Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.
User-defined bridges provide better isolation.
Containers can be attached and detached from user-defined networks on the fly.
Each user-defined network creates a configurable bridge.
Linked containers on the default bridge network share environment variables.
关键点:
- 用户自定义可以使用别名也可以使用ip,用default只能用ip
- 用户自定义可以随时选择连接网络与断开网络,但是default只能把容器删了重建(直接爆杀)
- default可以共享环境变量(有点逆天)
三点可以看的出来default跟普通user-defined实现应该是不太一样的,并没有提及性能是否有差异。
但第二点,感觉default可以捐了😂
use bridge
# 生成一个user-defined bridge
docker network create {bridge_name}# 将container加入bridge
docker network connet {bridge_name} {container alias/id}# 查看bridge信息,可以看到那个container用了那个ip
docker network inspect [bridge_name]
加入bridge之后,这些container在内部服务的时候就好像在同一个网络了,可以直接用ip通信或者直接用别名。
别名一般就是container名字
别名具体实现还未知,但可以发现不是用hosts实现的,在container内部查看hosts文件没有特别关于container name信息
所以感觉像daemon插足实现的???