Docker 容器跨主机通信之网络:overlay
乐果 发表于 2025 年 01 月 03 日 标签:Docker
当你安装了 docker
, 它会自动创建 3 个网络,可以使用 docker network ls
命令来查看。
(base) xiao@xiao:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
acb47f4c7ff0 bridge bridge local
f2b6a346bd84 host host local
d2699c7383f0 none null local
- Bridge模式(桥接模式):默认的网络模式,容器通过虚拟网桥连接到主机的物理网络接口上,可以通过端口映射将容器的端口映射到主机上。
- Host模式(主机模式):容器与主机共享网络命名空间,容器直接使用主机的网络栈,可以轻松访问主机上的网络资源,但会损失一定的隔离性。
- None模式(无网络模式):容器不连接到任何网络,只能通过内部与其他容器进行通信,不能与外部进行网络通信。
docker inspect
命令可以查看某个网络详情。
root@vm01:~# docker inspect bridge
[
{
"Name": "bridge",
"Id": "e11244c41ed7db4a5f43f392316c1dd1999bc7e49b74952f0aed6f5352a4a70f",
"Created": "2025-01-02T15:53:02.456439999+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
当你开启 docker swarm
模式时,overlay
网络模式就会出现了。
docker swarm
初始化如下所示:
root@vm01:~# docker swarm init
Swarm initialized: current node (nimkm8zwb83py4gmeosdnflmn) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2nb5tww0ykitc6r7cmyqawgl7eg3vrvp0icf6h8how6wfrnozf-cr5ae2b3jd5gyovhn0d38s0xe 192.168.10.201:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
此时 docker network ls
命令查看 docker
网络:
root@vm01:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
e11244c41ed7 bridge bridge local
9fe9ea4a856f docker_gwbridge bridge local
02209fe40f23 host host local
qp93aztel07j ingress overlay swarm
44dff29c7fd5 none null local
overlay
又是什么网络模式?
如上所演示的,docker swarm
开启后为啥会自动以 overlay
网络模式呢?
overlay网络模式
Overlay
网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在 IP
报文之上的新的数据格式。Overlay
网络采用 VXLAN(Virtual Extensible LAN)
技术创建一个虚拟网络,将不同主机上的容器连接到同一个逻辑网络中。这样,容器就可以像在同一台主机上一样进行通信,而无需关心底层的网络细节。
上面是一端官方的解释,说直白一点这种网络模式就是为了让不同宿主机之间的容器能够相互组网通信。
除了在 docker swarm
初始化时自动创建Overlay
网络,也可以手动创建。
创建 overlay network
如下所示,手动创建:
# 创建ovelay,自定义子网和网关,不输入系统会自动生成
root@vm01:~# docker network create -d overlay --subnet=192.168.8.0/24 --gateway=192.168.8.1 --attachable my-overlay
818c5i2a4w6nm6ukd0nequxb1
root@vm01:~#
root@vm01:~#
root@vm01:~#
root@vm01:~# docker network inspect my-overlay
[
{
"Name": "my-overlay",
"Id": "818c5i2a4w6nm6ukd0nequxb1",
"Created": "2025-01-03T03:44:16.240656953Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.8.0/24",
"Gateway": "192.168.8.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": null,
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4097"
},
"Labels": null
}
]
不同docker swarm服务集群通信
swarm
在设计之初是为了 service
(一组 container
)而服务的,因此通过 swarm
创建的 overlay
网络在一开始并不支持单独的 container
加入其中。但是在 docker1.13
, 我们可以通过 --attachable
参数声明当前创建的 overlay
网络可以被 container
直接加入。
docker network create --driver=overlay --attachable name=my-overlay
例如将单个单独的 container
加入:
docker run -d --name=cooper-mq --network=my-overlay hub.wesais.cn/cooper/cooper-mq:v.241212.01
乐果 发表于 2025 年 01 月 03 日 标签:Docker