docker使用consul作为注册中心,搭建跨机器网络集群
环境准备1. centos 7.4以上版本,内核版本大于3.10.02. 一台(或者多台)服务器(主要安装一些辅助服务,consul服务,docker仓库等)3. 多台生产服务器(主要部署应用等)这里我示例为:A机器:consul server服务部署, docker仓库部署, ip为:10.250.151.122B,C,D机器:生产服务器使用consu...
环境准备
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启动容器。
更多推荐
所有评论(0)