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 安装及配置
在实现docker swarm集群之前,我肯定是需要多台服务器实现集群的,这里我准备了3台服务器,且操作系统都是
CentOS 7.3
,IP分别是:
192.168.89.14 // ser1192.168.89.15 // ser2192.168.89.16 // ser3
3台服务器上分别执行以下命令,安装docker
yum -y install docker
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服务
添加私有镜像仓库源,分别在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 安装
安装yum-utils包
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
更新 docker-ce稳定版的yum源
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安装docker-ce
yum install docker-ce
查看其它可安装的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: **
--advertise-addr:
多网卡的情况下,指定需要使用的ip--listen-addr:
指定监听的 ip 与端口--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
--token:
所需加入集群的token--advertise-addr:
多网卡的情况下,指定需要使用的ip--listen-addr:
指定监听的 ip 与端口--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
--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
--availability
: 节点的有效性("active"|"pause"|"drain")
Active:集群中该Node可以被指派Task
Pause:集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的Node上
--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
--force , -f
: 强制从集群中删除节点
示例
docker node rm -f host-192-168-88-16
node rm
3.5.2. docker swarm leave
退出集群(需要退出的节点执行)
语法
docker swarm leave [OPTIONS]
Options
--force , -f
: 强制从集群中删除节点
示例
docker swarm leave
swarm leave
4. 应用部署
4.1. 创建服务
语法
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
4.2. 修改服务
4.2.1. 修改服务参数
语法
docker service update [OPTIONS] SERVICE
Options
--detach , -d
: 指定容器运行于前台还是后台--env-add
: 增加环境变量--env-rm
: 删除环境变量--mount-add
: 增加文件挂载--mount-rm
: 通过目标路径删除文件挂载--network-add
: 增加网络设置--network-rm
: 移除网络设置--publish-add
: 增加端口映射--publish-rm
: 通过目标端口移除端口映射--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
--filter , -f
: 过滤条件
示例
docker service ls --filter name=redis
4.3.2. 查看任务列表
manager执行,可查看一个或多个服务的任务列表
语法
docker service ps [OPTIONS] SERVICE [SERVICE...]
Options
--filter , -f
: 过滤条件
示例
docker service ps api_131
4.3.3. 查看服务详情
manager执行,可查看一个或多个服务的详细情况
语法
docker service inspect [OPTIONS] SERVICE [SERVICE...]
Options
--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
--follow , -f
: 跟随输出--tail
: 显示最新的N条日志--since
: 显示从某个时间开始的所有日志--timestamps , -t
: 显示时间戳
示例
docker service log -f api_131
5. 问题及解决
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/dockerfi
connection is unavailable
错误
错误
添加集群节点的时候报如上图的错误。可能有两个原因,第一,查看下防火墙的问题,需要配置防火墙,或者暴力一点直接关闭防火墙,另外一个原因就是检查下你的ip是不是输错了。我因为ip敲错了,困惑了很久。
invalid mount
错误
错误
节点机器起容器的时候报上图的错,请仔细检查挂载的目录是否存在。
6. 完
转载请注明出处
Docker Swarm集群部署实践