miaodi
发布于 2020-12-26 / 1752 阅读
0

docker跨主机网络互通 swarm overlay

docker跨主机网络互通

1.介绍

docker跨主机的网络互通方式很多,我之前最常用的方式就是--network=host,直接使用宿主机的网络,容器需要用到的端口,直接暴露在宿主机对应的端口上。

最近准备用docker搭建一个高可用的数据库集群,跑rabbitmq、mysql、以及redis等等。之前的--network=host方式未免有些太粗暴了。

这次用swarm集群的方式搭建跨主机的容器网络。

特此记录下,以后再次搭建环境时可以参考

2.准备工作

我这边有两台虚拟化服务器,准备开3个虚拟机做高可用,其中一台性能较强的服务器开两个虚拟机,另外一台服务器开一个虚拟机。

两台服务器连接两台不同的ups保证电源稳定。

3台虚拟机配置相同,均为4核16G内存。

在一台虚拟机上装好centos7系统、常用软件以及docker之后,复制出来另外两台虚拟机,并修改另外两台虚拟机的ip地址。

ip地址:

​ - 虚拟机1:192.168.8.192

​ - 虚拟机2:192.168.8.193

​ - 虚拟机3:192.168.8.194

3. 创建swarm集群

3.1 开放端口号

在3台机器上分别执行下列命令:

firewall-cmd --add-port=2377/tcp --add-port=4789/udp --add-port=7946/tcp --add-port=7946/udp  --permanent --zone=public
firewall-cmd --reload

其中,2377为默认管理服务端口,可以自定义。

4789和7946为服务成员发现以及外部服务映射

3.2 创建/加入集群

192节点上执行创建swarm集群:

[root@datasource2 ~]# docker swarm init --advertise-addr 192.168.8.192

如果需要自定义端口号,可以将192.168.8.192改为192.168.8.192:端口号

执行之后,会输出一串token,同时也会输出其他节点加入集群的命令。

193和194节点执行加入集群:

[root@datasource3 ~]# docker swarm join --token xxxxxxxx 192.168.8.192:2377

此时,只有192节点是管理节点,193和194仅作为工作节点。

在192节点上执行命令查看集群情况:

docker node ls

可以在管理节点执行以下命令来将工作节点提升为管理节点:

docker node promote xxx

可以在管理节点执行以下命令来将管理节点降级为工作节点:

docker node demote xxx

4. 创建overlay网络

在任一管理节点上执行以下命令:

docker network create -d overlay --subnet=10.10.0.0/16 --gateway=10.10.0.254  --attachable=true datasource

结果的datasource是我指定的网络名,下同。

查看下创建的网络:
docker network inspect datasource

[root@datasource2 ~]# docker network inspect datasource 
[
    {
        "Name": "datasource",
        "Id": "rptgfp0lgamyp3yknfzb6n65f",
        "Created": "2020-12-26T03:20:45.722640236+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.10.0.0/16",
                    "Gateway": "10.10.0.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        ---以下省略

可以看到作用域是"Scope": "swarm",

网络类型/驱动是"Driver": "overlay",

子网为设置的"Subnet": "10.10.0.0/16",10.10.x.x段

# 5. 创建容器使用跨主机网络

docker run --network=datasource -it centos:7

这样会自动给容器分配一个10.10.x.x的网址


docker run --network=datasource --ip=10.10.x.x -it centos:7

这样会给容器指定一个固定ip

可以在不同宿主机创建几个容器,然后互相ping测试下,我这边测试正常就不贴代码了。

可以使用docker network inspect datasource查看网络的详情

可以使用docker container inspect 容器名查看容器的ip等信息

6.参考

https://blog.csdn.net/Rapig1/article/details/102470936

https://blog.csdn.net/alaska_bibi/article/details/78414922