Docker Swarm集群部署实践

本文为转载,原文:Docker Swarm集群部署实践

docker

1. 介绍

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具。Docker 1.12 内嵌了 swarm mode 集群管理模式。

2. 准备

2.1. Docker 安装及配置

  1. 在实现docker swarm集群之前,我肯定是需要多台服务器实现集群的,这里我准备了3台服务器,且操作系统都是CentOS 7.3,IP分别是:
192.168.89.14  // ser1
192.168.89.15  // ser2
192.168.89.16  // ser3
  1. 3台服务器上分别执行以下命令,安装docker
yum -y install docker
  1. docker 服务的几个简单命令:
systemctl start docker // 启动docker服务
systemctl stop docker // 停止docker服务
systemctl restart docker // 重启docker服务
systemctl status docker // 查看docker服务状态
systemctl enable docker // 开机启动docker服务
systemctl disable docker // 取消开机启动docker服务
  1. 添加私有镜像仓库源,分别在3个服务器的/etc/docker/daemon.json 文件中添加以下内容:
{
"insecure-registries":["xxx.xxx.xxx.xxx:5000"]
}

xxx.xxx.xxx.xxx为你的私有仓库的ip

2.2. Docker 升级

2.2.1. 卸载旧版本

执行以下命令卸载旧版本docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

2.2.2. docker ce 安装

  1. 安装yum-utils包
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  1. 更新 docker-ce稳定版的yum源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装docker-ce
yum install docker-ce
  1. 查看其它可安装的docker-ce源
yum list docker-ce --showduplicates | sort -r

2.3. swarm 安装

3台服务器分别安装好docker,并启动docker服务之后,下面要分别在3台服务器的docker上拉取swarm镜像:

docker pull swarm

2.4. 防火墙

另外,为了方便,这里将服务器的防火墙全都关闭了。

firewall -cmd --state    //查看防火墙状态
systemctl stop firewalld   // 关闭防火墙
systemctl start firewalld  //开启防火墙
systemctl disable firewalld  //禁止防火墙开机启动

成功之后,我们的准备工作就做完了。接下来就要建立集群了。

3. 建立集群

我们有3个服务器作为集群的3个节点,其中,ser1, ser2作为manager节点,ser3 作为worker节点。

3.1. 初始化集群

**语法: **

docker swarm init [OPTIONS]

**Options: **

  1. --advertise-addr: 多网卡的情况下,指定需要使用的ip
  2. --listen-addr: 指定监听的 ip 与端口
  3. --availability: 节点的有效性("active"|"pause"|"drain")

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

示例

docker swarm init --advertise-addr 192.168.89.14 \
--listen-addr 192.168.89.14:2377
init

3.2. 添加节点

语法

docker swarm join [OPTIONS] HOST:PORT

Options

  1. --token: 所需加入集群的token
  2. --advertise-addr: 多网卡的情况下,指定需要使用的ip
  3. --listen-addr: 指定监听的 ip 与端口
  4. --availability: 节点的有效性("active"|"pause"|"drain")

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

3.2.1. manager节点

首先要获取manager的token,在ser1上执行以下命令:

docker swarm join-token manager
manager token

然后执行以下命令,将ser2服务器作为manager节点加入集群

docker swarm join \
--advertise-addr 192.168.89.15 \
--listen-addr 192.168.89.15:2377 \
--token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-ajkrv2ctjr5cmxzuij75tbrmz \
192.168.89.14:2377
join manager

3.2.2. worker节点

首先要获取worker的token,在ser1上执行以下命令:

docker swarm join-token worker
worker token

然后执行以下命令,将ser3服务器作为worker节点加入集群:

docker swarm join \
--advertise-addr 192.168.89.16 \
--listen-addr 192.168.89.16:2377 \
--token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-a53g5oimn8zeaqomm5vxgcoj7 \
192.168.89.14:2377
join worker

3.3. 查看节点

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

查出集群的节点列表

语法

docker node ls [OPTIONS]

Options

  1. --filter , -f: 根据条件筛选查询结果

示例

docker node ls
node ls

3.4. 修改节点

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

3.4.1. 节点降级

将manager节点降为worker

语法

docker node demote NODE [NODE...]

示例

docker node demote host-192-168-88-15
demote

3.4.2. 节点升级

将worker节点提升为manager

语法

docker node promote NODE [NODE...]

示例

docker node promote host-192-168-88-15
promote

3.4.3. 修改节点参数

语法

docker node update [OPTIONS] NODE

Options

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

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

  1. --role: 节点角色(“worker”|“manager”)

示例

docker node update --availability Active host-192-168-88-14
node update

3.5. 退出节点

3.5.1. docker node rm

从集群中移除一个或多个节点(manager 节点执行)

语法

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

Options

  1. --force , -f: 强制从集群中删除节点

示例

docker node rm -f host-192-168-88-16
node rm

3.5.2. docker swarm leave

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

语法

docker swarm leave [OPTIONS]

Options

  1. --force , -f: 强制从集群中删除节点

示例

docker swarm leave
swarm leave

4. 应用部署

4.1. 创建服务

语法

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

Options

  1. --detach , -d: 指定容器运行于前台还是后台,默认为false
  2. --name: 服务名称
  3. --network: 网络连接
  4. --publish , -p: 端口映射
  5. --env , -e: 设置环境变量
  6. --tty , -t: 分配tty设备,该可以支持终端登录
  7. --mount: 文件挂载
  8. --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

4.2. 修改服务

4.2.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 api_131

4.2.2. 修改任务数量

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

语法

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

示例

docker service scale ser1=3 ser2=5

4.3. 查看服务

4.3.1. 查看服务列表

manager节点执行

语法

docker service ls [OPTIONS]

Options

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

示例

docker service ls --filter name=redis

4.3.2. 查看任务列表

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

语法

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

Options

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

示例

docker service ps api_131

4.3.3. 查看服务详情

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

语法

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

Options

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

示例

docker service inspect api_131

4.4. 删除服务

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

语法

docker service rm SERVICE [SERVICE...]

示例

docker service rm api_131

4.5. 查看服务日志

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

语法

docker service logs [OPTIONS] SERVICE|TASK

Options

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

示例

docker service log -f api_131

5. 问题及解决

  1. container ingress-sbox is already present in sandbox ingress sbox
    错误

    错误

    集群部署的时候,节点无法启动容器,且报错:container ingress-sbox is already present in sandbox ingress sbox,这个时候可能是因为docker的SELinux配置问题。
    解决办法:编辑文件/etc/sysconfig/docker,若不存在该文件,则添加文件。添加以下内容:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
    DOCKER_CERT_PATH=/etc/docker
fi
  1. connection is unavailable


    错误

    错误

    添加集群节点的时候报如上图的错误。可能有两个原因,第一,查看下防火墙的问题,需要配置防火墙,或者暴力一点直接关闭防火墙,另外一个原因就是检查下你的ip是不是输错了。我因为ip敲错了,困惑了很久。

  2. invalid mount


    错误

    错误

    节点机器起容器的时候报上图的错,请仔细检查挂载的目录是否存在。

6. 完

转载请注明出处
Docker Swarm集群部署实践

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容