【Docker】Swarm 部署 MySQL

最近在用 Swarm 搭建一个新的大数据开发集群, 因为安装 Hive 需要用到 MySQL,
为了方便部署和统一维护, 决定把 MySQL 也加入到 Swarm 部署环境中,
而且后续要部署多版本的大数据组件, 为了环境隔离也会频繁用到.

Swarm

Swarm 是管理 Docker 集群的实用工具.
首先我们需要选择一个机器节点创建 Swarm 集群并作为 Manager:

# docker swarm init 

Swarm initialized: current node (t7x7qp97g48sp3djk8f4lk1l5) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-6csh08t6mwhp7qea92k19zkdmwttmzfecdh2nge251nyg584zu-ckw77mdh8oxr95jd5e2kbh6tv 192.168.0.180:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

在其他节点上执行, 加入新建的 Swarm 集群 :

docker swarm join --token SWMTKN-1-6csh08t6mwhp7qea92k19zkdmwttmzfecdh2nge251nyg584zu-ckw77mdh8oxr95jd5e2kbh6tv 192.168.0.180:2377

编写 MySQL 的 service 描述

接着, 是编写 MySQL 的 service 描述文件(docker-compose-mysql.yaml),
进行设置版本、网络、端口、数据挂载位置、部署位置等等。
如下, 是一个 stack 部署文件, 在 services 中可以定义多个 service,
组成一个 stack, 这里我们定义了一个名为 mysql01 的 service:

# vim docker-compose-mysql.yaml

version: '3.9'
services:
mysql01:
image: mysql:8.0.19
networks:
- hadoop-net
deploy:
mode: replicated
replicas: 1
endpoint_mode: dnsrr
placement:
constraints:
- "node.hostname==dkn2"
environment:
- MYSQL_ROOT_PASSWORD=todo
ports:
- target: 3306
published: 3306
mode: host
volumes:
- /data/services/bd1/docker/mysql:/var/lib/mysql
#- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
hadoop-net:
external: true

这里用的是 host 模式部署, 依赖的 network 已经创建了, 没有的话可以创建:
docker network create --driver overlay hadoop-net
部署位置 constraints 是 node.hostname==dkn2,
并把物理机的位置 /data/services/bd1/docker/mysql 挂载到容器里的目录 /var/lib/mysql.

部署

现在我们就可以开始执行部署了,docker stack 可以把刚才 docker-compose-mysql.yaml 中定义的 services 部署到 swarm 集群中。

docker stack deploy --compose-file docker-compose-mysql.yaml bdv3

bdv3 是我们定义的 stack 名称,而 MySQL 部署后的 service 名称是 bdv3_mysql01.

docker stack ls 可以查看所有的 stack :

# docker stack ls
NAME SERVICES
bdv3 1
...

docker stack services bdv3 可以查看 stack bd1 下所有 services:

# docker stack services bdv3
ID NAME MODE REPLICAS IMAGE PORTS
zvxgsnybxdpm bdv3_mysql01 replicated 1/1 mysql:8.0.19

docker stack ps bdv3 可以查看 stack 下所有 services 的 tasks :

# docker stack ps bdv3
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w5ffdyvhvtia bdv3_mysql01.1 mysql:8.0.19 dkn3 Running Running 2 days ago *:3306->3306/tcp,*:3306->3306/tcp

docker stack rm bdv3 可以移除 stack.

也可以某些 service 缩容到0个实例:

docker service scale bdv3_mysql01=0 foo=0

参考

https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/
https://docs.docker.com/engine/reference/commandline/stack/
https://docs.docker.com/engine/reference/commandline/service_scale/