Docker Swarm集群部署

2019-09-26

Docker Swarm集群部署

  • Docker版本1.12+
  • 集群节点之间保证TCP 2377、TCP/UDP 7946和UDP 4789端口通信

TCP端口2377集群管理端口

TCP与UDP端口7946节点之间通讯端口

TCP与UDP端口4789 overlay网络通讯端口

初始化集群

语法

docker swarm init [OPTIONS]

--advertise-addr: 多网卡的情况下,指定需要使用的ip

--listen-addr: 指定监听的 ip 与端口

--availability: 节点的有效性 ("active"|"pause"|"drain")

Active:集群中该Node可以被指派Task
Pause:集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的Node上

master创建Swarm(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)

[root@master ~]# docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 

注:上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

该条命令的node将会成为manager node,该命令会生成两个token: manager token和worker token,通过docker swarm join --token TOKEN MANAGER_NODE_IP提供不同的token来将当前node以不同身份加入到集群。

添加节点

[root@host22 ~]# docker swarm join [OPTIONS] HOST:PORT

--token: 所需加入集群的token

--advertise-addr: 多网卡的情况下,指定需要使用的ip

--listen-addr: 指定监听的 ip 与端口

--availability: 节点的有效性("active"|"pause"|"drain")

修改节点

以下命令只能在manager节点上执行

节点降级
[root@host22 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
ttv7htcjineq7cjutkuf3fbl9    host226   Ready   Active        Reachable

[root@host22 ~]# docker node demote host226
Manager host226 demoted in the swarm.

降级后

[root@host22 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
ttv7htcjineq7cjutkuf3fbl9    host226   Ready   Active 
修改节点参数

语法

docker node update [OPTIONS] NODE

OPTIONS

--availability: 节点的有效性("active"|"pause"|"drain")

Active:集群中该Node可以被指派Task
Pause:集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的Node上

示例:

[root@host22 ~]# docker node update --availability pause host226
host226
[root@host22 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
ttv7htcjineq7cjutkuf3fbl9    host226   Ready   Pause         


[root@host22 ~]# docker node update --availability Active host226
host226
[root@host22 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
ttv7htcjineq7cjutkuf3fbl9    host226   Ready   Active 

退出节点

语法

docker node rm [OPTIONS] NODE [NODE...]

Options

--force , -f: 强制从集群中删除节点
示例:

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
ttv7htcjineq7cjutkuf3fbl9    host226   Ready   Active        
[root@host22 ~]# docker node rm -f host226
host226
[root@host22 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
q55vhgfsos7vilq85vx41s8ol *  host22    Ready   Active        Leader
退出集群

退出集群(需要退出的节点执行)

语法

docker swarm leave [OPTIONS]

Options

--force , -f: 强制从集群中删除节点
示例:

docker swarm leave host226

集群一旦退出 需要重新使用token加入集群

应用创建

创建服务

语法

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

Options

--detach , -d: 指定容器运行于前台还是后台,默认为false

--name: 服务名称

--network: 网络连接

--publish , -p: 端口映射

--env , -e: 设置环境变量

--tty , -t: 分配tty设备,该可以支持终端登录

--mount: 文件挂载

--replicas: 指定任务数量

示例

    docker service create --replicas 3 -p 443:8080 --name api_131 \
--mount type=bind,source=/storage/apiapp_log,destination=/go/src/logs \
--mount type=bind,source=/root/apiapp/app.conf,destination=/root/app.conf \
--mount type=bind,source=/root/apiapp/run_application.sh,destination=/root/run_application.sh \
-e RUN_MODE=Production \
-td 192.168.77.53:5000/gbss/api-swarm:1.3.1

修改服务

修改服务参数

语法

docker service update [OPTIONS] SERVICE

Options

  1. --detach , -d: 指定容器运行于前台还是后台
  2. --env-add: 增加环境变量
  3. --env-rm: 删除环境变量
  4. --mount-add: 增加文件挂载
  5. --mount-rm: 通过目标路径删除文件挂载
  6. --network-add: 增加网络设置
  7. --network-rm: 移除网络设置
  8. --publish-add: 增加端口映射
  9. --publish-rm: 通过目标端口移除端口映射
  10. --replicas: 修改任务数量

示例

docker service update --replicas 2 nginx_1
修改任务数量

虽然通过docker service update命令也可以修改任务数量,但是docker还提供了一个修改任务数量的命令。
该命令可以修改一个或多个服务的任务数量

语法

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

示例

docker service scale ser1=3 ser2=5

查看服务

查看服务列表

manager节点执行

语法

docker service ls [OPTIONS]

Options

  1. --filter , -f: 过滤条件

示例

docker service ls --filter name=redis
查看任务列表

manager执行,可查看一个或多个服务的任务列表

语法

docker service ps [OPTIONS] SERVICE [SERVICE...]

Options

  1. --filter , -f: 过滤条件

示例

docker service ps nginx_1
查看服务详情

manager执行,可查看一个或多个服务的详细情况

语法

docker service inspect [OPTIONS] SERVICE [SERVICE...]

Options

  1. --pretty: 格式化输出信息

示例

docker service inspect nginx_1

删除服务

manager 执行,删除一个或多个服务

语法

docker service rm SERVICE [SERVICE...]

示例

docker service rm nginx_1

查看服务日志

manager执行,查看服务或任务的日志

语法

docker service logs [OPTIONS] SERVICE|TASK

Options

  1. --follow , -f: 跟随输出
  2. --tail: 显示最新的N条日志
  3. --since: 显示从某个时间开始的所有日志
  4. --timestamps , -t: 显示时间戳

示例

docker service logs -f nginx_1