在实际的项目中,因为需要部署多节点冗余备份,以实现高可用,这里就要用到各类工具的分布式部署方案了,以前手动部署过mysql replication和pxc,但docker的方案没有尝试成功,无法成功部署,这里也是参考了各类博客和文档后,尝试部署成功。

假设要在两台节点上安装docker,并使这两个docker可以相互访问。

环境:Ubuntu 16.04 etcd docker

安装ETCD

etcd集群

etcd集群参考基于etcd服务发现的overlay跨多宿主机容器网络

在两台主机上:

1
2
3
4
5
curl -L <https://github.com/coreos/etcd/releases/download/v2.2.1/etcd-v2.2.1-linux-amd64.tar.gz> -o etcd-v2.2.1-linux-amd64.tar.gz

tar xzvf etcd-v2.2.1-linux-amd64.tar.gz

cd etcd-v2.2.1-linux-amd64

注意下面的命令需要先设置下面值:

{NODE_NAME}:etcd节点名称,需要和命令中的-initial-cluster的对应的{NODE1_NAME}或{NODE2_NAME}对应

{NODE_IP}/{NODE1_IP}/{NODE2_NAME}:节点的IP

1
2
3
4
5
6
7
./etcd -name {NODE_NAME} -initial-advertise-peer-urls [http://{NODE_IP}:2380](http://NODE_IP:2380) \
-listen-peer-urls <http://0.0.0.0:2380> \
-listen-client-urls [http://0.0.0.0:2379,http://127.0.0.1:4001](http://0.0.0.0:2379,http:/127.0.0.1:4001) \
-advertise-client-urls <http://0.0.0.0:2379> \
-initial-cluster-token etcd-cluster \
-initial-cluster {NODE1_NAME}=http://{NODE1_IP}:2380,{NODE2_NAME}=http://{NODE2_IP}:2380 \
-initial-cluster-state new

单个运行etcd

参考docker跨主机overlay网络配置

etcd配置:

etcd启动

etcd启动命令:

1
etcd --advertise-client-urls 'http://192.168.15.232:2379' --listen-client-urls 'http://0.0.0.0:2379'

需要确保 advertise-client-urls 是在正确的ip和端口上监听

etcd检查

  • 本机检查:

在etcd运行的机器上,检查启动情况:

1
2
etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://192.168.15.232:2379 isLeader=true

检查功能是否正确,能否正确设置和获取

1
2
3
etcdctl mk key value
etcdctl get key
value
  • 远程检查

在其他主机上,验证远程连接的正确性,是否可以正确设置和获取

1
2
3
4
5
6
./etcdctl -endpoints http://192.168.15.232:2379 get key
value
/etcdctl -endpoints http://192.168.15.232:2379 mk key2 value2
value2
./etcdctl -endpoints http://192.168.15.232:2379 get key2
value2

安装docker

如何安装,参考:https://docs.docker.com/install/linux/docker-ce/ubuntu/

在两个节点上:

1
2
3
4
5
6
7
$sudo service docker stop

$sudo vim /etc/default/docker
# 写入: (注意下面{NODE_IP}需要改为主机IP)
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://{NODE_IP}:2379 --cluster-advertise={NODE_IP}:2375"

$ sudo service docker start

在其中一台主机上初始化swarm,使其为swarm manager节点

1
$ sudo docker swarm init

加入集群(运行完上面的命令后,会出现指示如何加入网络的指令)。

1
docker swarm join --token SWMTKN-1-0qo83je2oxsfxd72m09fgsm598i4dqzu3xfim36f4w20ioovgs-7oj4jufbt6yhsbq8mdxzf0bkj xxx.1xx.xxx.201:2377

在这台主机上,新建overlay network:(注意下面命令{NETWORK_NAME}改为自己的network名称,–attachable参数很重要)

1
$ sudo docker network create --driver overlay --attachable {NETWORK_NAME}

测试:

第一个节点:

1
sudo docker run -itd --name=worker-1 --net={NETWORK_NAME} ubuntu

第二个节点:

1
sudo docker run -itd --name=worker-2 --net={NETWORK_NAME} ubuntu

在两个节点运行的ubuntudocker 容器安装ping和ifconfig并查看各自的ip:

第一个节点:

1
2
3
4
5
sudo docker exec worker-1 apt-get update

sudo docker exec worker-1 apt-get install net-tools

sudo docker exec worker-1 ifconfig //看到eth0则为该docker容器的ip,比如看到的为10.0.0.2

第二个节点:

1
2
3
4
5
6
7
8
9
sudo docker exec worker-2 apt-get update

sudo docker exec worker-2 apt-get install net-tools

sudo docker exec worker-2 apt-get install inetutils-ping

sudo docker exec worker-2 ifconfig //看到eth0则为该docker容器的ip,比如看到的为10.0.0.4

sudo docker exec worker-2 ping 10.0.0.2 //ping 得通则成功了