环境准备

1.    centos 7.4以上版本,内核版本大于3.10.0
2.    一台(或者多台)服务器(主要安装一些辅助服务,consul服务,docker仓库等)
3.    多台生产服务器(主要部署应用等)

这里我示例为:
A机器:consul server服务部署, docker仓库部署, ip为:10.250.151.122
B,C,D机器:生产服务器

 

使用consul作为docker的服务注册中心
 

A,B,C,D机器安装docker

echo '重新安装docker...'

sudo yum remove docker docker-common docker-selinux docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install docker-ce -y
sudo systemctl start docker
sudo systemctl enable docker
echo '查看版本信息:'
docker version

A.B.C.D机器下载安装consul

cd /tmp

wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip
unzip consul_1.5.2_linux_amd64.zip
mv consul /usr/local/sbin/
consul --version
mkdir -p /data/consul.d

A机器部署consul server

1.	建立目录

mkdir /data/consul.d -p
cd /data/consul.d
mkdir data
touch consul-server.json

文件consul-server.json内容, 下面ip为A服务器ip
(下面注释记得删掉)
{
	"datacenter": "dc1",
	"data_dir": "/data/consul.d/data",
	"log_level": "INFO",
	"server": true,
	"bootstrap_expect": 1,
	"enable_debug": false,
	"advertise_addr": "10.250.151.121", // 本机器IP
	"bind_addr": "10.250.151.121",// 本机器IP
	"client_addr": "10.250.151.121",// 本机器IP
	"server_name": "consul-server01",
	"node_name": "consul-server01"
}


启动
nohup consul agent -ui -config-dir ./ -pid-file=./consul-server01.pid -rejoin &

访问http://10.250.151.121:8500/ui 可以看到节点状态,如果不需要web界面,则去掉-ui启动

 

B,C,D服务器部署consul client

建立目录
mkdir /data/consul.d -p
cd /data/consul.d
mkdir data
touch client.json

client.json内容:(ip为本机器ip, retry_join为server节点的服务器ip)

(下面的注释记得删掉)

{
	"datacenter": "dc1",
	"data_dir": "/data/consul.d/data",
	"log_level": "INFO",
	"server": false,
	"enable_debug": false,
	"advertise_addr": "10.250.151.122",  // B,C,D机器本机IP
	"bind_addr": "10.250.151.122", // B,C,D机器本机IP
	"client_addr": "10.250.151.122", // B,C,D机器本机IP
	"server_name": "consul-client122",
	"node_name": "consul-client122",
	"retry_join": [
		"10.250.151.121"  // A机器IP,表示consul client注册到A机器
	]
}

启动:
nohup consul agent -rejoin -config-dir ./ -pid-file=./client.pid &

A机器查看集群信息,后面的IP是A机器的,这样,
consul members -http-addr=10.250.151.121:8500

备注
如果机器分布或者ip重新修改,建议删除A机器中/data/consul.d/data内数据,重新注册

 

A,B,C,D服务器docker配置


PS: 可以拷贝 下的daemon.json做修改

修改/etc/docker/daemon.json配置为(没有则新建):

{
    "cluster-advertise": "10.250.151.121:2375",  // 本机器配置IP
    "cluster-store": "consul://10.250.151.121:8500", // 本机器配置IP
    "insecure-registries": [
        "10.250.151.122:5000"  // A机器IP(因为把A机器作为docker仓库)
    ]
}

重启docker:
service docker restart

测试overlay网络:
docker network create --driver overlay redstone

分别在A,B,C,D机器查看网络:

docker network ls

此时网络已经同步
 

查看consul中注册的网络信息:

 

开始测试

A机器建立网络

docker network create --driver overlay redstone

B,C,D机器查看网络是否同步:

docker network ls

B机器执行:

docker run -d --network redstone --name box1 busybox sleep 999999

C机器执行:

docker run -d --network redstone --name box2 busybox sleep 999999

B机器进入容器:

docker exec -it box1 sh

执行ping命令ping c机器box2

ping box2

 

此时。。可以ping通了,已经实现了docker跨机器网络互通了。

 

实际碰到的问题

1. 在机器重启之后,镜像使用了overlay网络,而在启动overlay网络时候报错:

ERROR: for mysql-master  Cannot start service mysql-master: network sandbox join failed: network sandbox join failed: could not get network sandbox (oper true): failed get network namespace "": no such file or directory

原因分析:

docker还没有同步到overlay网络,此时容器已经要启动了,那么出现找不到网络情况。

如何处理:

每次手动启动容器,或者添加服务,延时启动docker

不使用restart: always这类重启策略

 

2.网络异常

当使用docker-compose启动服务,出现端口冲突的时候,可能出现
例如:

Creating ov2_mysql-slave_1 ... error
Creating ov2_b1_1          ... 

ERROR: for ov2_mysql-slave_1  Cannot start service mysql-slave: container fabae835231ef86a937444a1e68ee3040f0d77b7146de913cad31d593ba9c562: endpoint join on GW Network failed: driver failed programming external connectivity on endpoint gateway_18df0b34b526 (328f51c1ac7e
Creating ov2_b1_1          ... done

ERROR: for mysql-slave  Cannot start service mysql-slave: container fabae835231ef86a937444a1e68ee3040f0d77b7146de913cad31d593ba9c562: endpoint join on GW Network failed: driver failed programming external connectivity on endpoint gateway_18df0b34b526 (328f51c1ac7ef08cf6e054cb27f2046504da37374cc40a78a9e7e7aee209d6d9): Bind for 0.0.0.0:3306 failed: port is already allocated

由于涉及网络同步等,或者没有使用docker-compose规范操作,可能出现网络无法删除, 容器已经删除,但是网络显示还在用情况,如下:
查看网络关联容器:(创建的overlay网络 rdx_nt)
docker network inspect rdx_nt
 
强制断开
docker network disconnect -f rdx_nt ov_rdx1_1
docker network disconnect -f rdx_nt rdx2

然后重新docker-compose up -d启动容器。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐