82

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

0

文章评论