docker多主机互联的方式有很多,docker自带的方式有Overlay、Macvlan,第三方插件有Pipework、Flannel、Calico等,此外,一般还需要借助相关的软件才能完成多主机互联。本文使用Overlay和Consul实现多主机互联。Consul是开源的服务注册、发现、治理工具。
1 查看网络配置
# 输入ifconfig命令查看网卡
# (1)Master主机网卡名称是ens33,IP地址192.168.108.133
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.108.133 netmask 255.255.255.0 broadcast 192.168.108.255
# (2)Node1主机网卡名称是ens33,IP地址192.168.108.131
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.108.131 netmask 255.255.255.0 broadcast 192.168.108.255
主机软件安装配置
主机名 | ip地址 | 网卡名 | 软件 |
---|---|---|---|
master | 192.168.108.133 | ens33 | Docker、Consul |
node1 | 192.168.108.131 | ens33 | Docker |
2 修个Docker启动配置文件
注意:修改之前一定要备份默认配置文件,如果出现问题还能恢复。
两个主机都需要修改。
2.1 旧方法(不推荐)
(1)进入目录
# docker的启动配置文件是docker.service
cd /lib/systemd/system
(2)修改配置文件
# 使用vim编辑docker.service
sudo vim docker.service
# 将文件中的ExecStart修改内容如下,添加了--cluster-store和--cluster-advertise两个参数
# 注意IP地址和端口号
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://192.168.108.133:8500 --cluster-advertise=ens33:2375
(3)重启docker
# 加载配置文件
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
# 查看docker启动状态
sudo systemctl status docker
2.2 新方法(推荐)
编辑文件
# master节点配置
# 编辑daemon.json文件
vim /etc/docker/daemon.json
# 添加内容如下
{
// consul地址
"cluster-store": "consul://192.168.108.133:8500",
// master宿主机地址
"cluster-advertise": "192.168.108.133:2375"
}
# node1节点配置
# 编辑daemon.json文件
vim /etc/docker/daemon.json
# 添加内容如下
{
// consul地址
"cluster-store": "consul://192.168.108.133:8500",
// node1宿主机地址
"cluster-advertise": "192.168.108.131:2375"
}
3 在master安装配置Consul
3.1 使用docker安装
方法1(不推荐)
在master(192.168.108.133)节点上安装Consul。这种方法存在的问题是容器重启后创建的overlay网桥会丢失。
# docker参数配置
# --name:容器名称
# --restart:设置开机启动,always开机自启
# -h:节点名称,集群中会用到
# -p:映射端口
# -v:映射配置目录
# consul的相关配置参数在集群中会用到
sudo docker run -itd \
--name consul-container \
--restart=always \
-h consul-maser \
-p 8500:8500 \
consul:1.10.0
方法2(推荐)
# 创建容器
sudo docker run -itd \
--restart=always \
--name=consul-master \
-p 8500:8500 \
-p 8300:8300 \
-p 8301:8301 \
-p 8302:8302 \
-p 8600:8600 \
-e CONSUL_DATA_DIR='/consul/data' \
-e CONSUL_CONFIG_DIR='/consul/config' \
-v /home/consul/conf/:/consul/conf/ \
-v /home/consul/data/:/consul/data/ \
consul:1.15.0 agent -server -bootstrap -ui -node=master -client='0.0.0.0'
# 说明
(1)端口说明:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口
(2)consul agent命令说明:
-server: 表示以server身份启动,默认是client。
-ui: 开启网页可视化管理界面
-node: 设置节点名称,注意每个节点的名称必须唯一不能重复
-bootstrap: 控制server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为server-leader
-client: 设置外部连接的地址,0.0.0.0表示外网全部可以连接
3.2 使用原生的consul安装
(1)下载consul
# consul-1.10.0的Linux版本下载
wget https://releases.hashicorp.com/consul/1.10.0/consul_1.10.0_linux_amd64.zip
# 其他版本
https://releases.hashicorp.com/consul/
(2)安装consul
# 创建在“/usr/local/”consul-1.10.0目录
sudo mkdir /usr/local/consul-1.10.0
# 解压consul_1.10.0_linux_amd64.zip,里面只有一个consul文件
sudo unzip consul_1.10.0_linux_amd64.zip
# 将consul文件复制到“/usr/bin”
sudo cp consul_1.10.0_linux_amd64/consul /usr/local/consul-1.10.0
# 给“consul”设置权限(所有用户可执行)
# 参数a是所有用户,参数x是可执行
sudo chmod a+x /usr/local/consul-1.10.0/consul
# 在“/usr/bin”目录下为consul创建软连接,这样可以直接启动
sudo ln /usr/local/consul-1.10.0/consul /usr/local/bin/consul
(3)命令启动consul
使用nohup(no hang up,不挂起)命令,可用于在系统后端不挂起执行命令,退出终端后不会挂起程序。
# 启动consul
sudo nohup consul agent \
-server \
-bootstrap \
-ui \
-bootstrap-expect=1 \
-data-dir=/usr/local/consul-1.10.0/data/ \
-bind=192.168.108.133 \
-client=0.0.0.0
# 查看consul启动情况
sudo netstat -natp | grep consul
# 返回值如下
# 8500是UI页面的端口
tcp 0 0 192.168.108.133:8300 0.0.0.0:* LISTEN 2138/consul
tcp 0 0 192.168.108.133:8301 0.0.0.0:* LISTEN 2138/consul
tcp 0 0 192.168.108.133:8302 0.0.0.0:* LISTEN 2138/consul
tcp 0 0 192.168.108.133:57028 192.168.108.133:8300 ESTABLISHED 2138/consul
tcp 0 0 192.168.108.133:8300 192.168.108.133:57028 ESTABLISHED 2138/consul
tcp6 0 0 :::8500 :::* LISTEN 2138/consul
tcp6 0 0 :::8600 :::* LISTEN 2138/consul
tcp6 0 0 192.168.108.133:8500 192.168.108.133:57652 ESTABLISHED 2138/consul
(4)文件启动
在“/usr/local/consul-1.10.0/”目录下新建start-consul.sh文件
# 进入"/usr/local/consul-1.10.0/"
cd /usr/local/consul-1.10.0/
# 新建文件
sudo touch start-consul.sh
# 编辑文件内容
sudo vim start-consul.sh
# 添加可执行权限
sudo chmod +x start-consul.sh
# 执行start-consul.sh文件
./start-consul.sh
文件"start-consul.sh"内容如下:
#!/bin/bash
sudo nohup consul agent -server -bootstrap -ui -bootstrap-expect=1 -data-dir=/usr/local/consul-1.10.0/data/ -bind=192.168.108.133 -client=0.0.0.0
3.3 访问consul
(1)访问consul
# consul地址如下 http://192.168.108.133:8500/
(2)截图
进入后截图
4 在master创建网桥
注意:在master节点中使用创建网桥即可,在node1上会自动同步网桥。
# 网桥名称是overlay-cluster
sudo docker network create --driver overlay --subnet=10.10.0.0/16 --gateway=10.10.0.1 overlay-cluster
# 查看网桥
sudo docker network ls
# 查看网桥的详细配置
sudo docker network inspect overlay-cluster
5 使用alpine测试
(1)创建容器
# 分别在两台主机上,下载alpine
sudo docker pull alpine:3.13.0
# 注意添加网桥
# 在master(192.168.108.133)节点运行
sudo docker run -itd --name alpine-master --net overlay-cluster alpine:3.13.0 /bin/sh
# 在master(192.168.108.131)节点运行
sudo docker run -itd --name alpine-node1 --net overlay-cluster alpine:3.13.0 /bin/sh
(2)测试连接,也可以在master测试
# 进入容器alpine-node1
sudo docker exec -it alpine-node1 /bin/sh
# 在容器中测试
ping -c 4 alpine-master