作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 ?? 收藏 ? 加关注哦!
Swarm mode
Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令
一、基本概念
使用
节点
运行 Docker 的主机可以主动初始化一个
节点分为管理 (
管理节点用于
工作节点是任务执行节点,管理节点将服务 (
服务和任务
任务 (
服务 (
-
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。 -
global services 每个工作节点上运行一个任务
两种模式通过
二、创建 Swarm 集群
阅读 基本概念 一节我们知道
初始化集群
在已经安装好 Docker 的主机上执行如下命令:
$ docker swarm init --advertise-addr 192.168.99.100 Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用
执行
docker swarm init 命令的节点自动成为管理节点。
增加工作节点
上一步我们初始化了一个
$ docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377 This node joined a swarm as a worker.
查看集群
经过上边的两步,我们已经拥有了一个最小的
在管理节点使用
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 03g1y59jwfg7cf99w4lt0f662 worker2 Ready Active 9j68exjopxe7wfl6yuxml7a7j worker1 Ready Active dxn1zf6l61qsb1josjja83ngz * manager Ready Active Leader
三、部署服务
我们使用
新建服务
现在我们在上一节创建的
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
现在我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页面。
查看服务
使用
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
使用
$ docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago 36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago
使用
$ docker service logs nginx nginx.3.36wmpiv7gmfo@swarm3 | 10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-" nginx.3.36wmpiv7gmfo@swarm3 | 10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-" nginx.3.36wmpiv7gmfo@swarm3 | 2017/11/25 02:10:30 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.4, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.102" nginx.1.pjfzd39buzlt@swarm2 | 10.255.0.2 - - [25/Nov/2017:02:10:26 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-" nginx.1.pjfzd39buzlt@swarm2 | 10.255.0.2 - - [25/Nov/2017:02:10:27 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-" nginx.1.pjfzd39buzlt@swarm2 | 2017/11/25 02:10:27 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.101"
服务伸缩
我们可以使用
当业务处于高峰期时,我们需要扩展服务运行的容器数量。
$ docker service scale nginx=5
当业务平稳时,我们需要减少服务运行的容器数量。
$ docker service scale nginx=2
删除服务
使用
$ docker service rm nginx
四、在 Swarm 集群中使用 compose 文件
正如之前使用
上一节中,我们使用
我们以在
version: "3" services: wordpress: image: wordpress ports: - 80:80 networks: - overlay environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress deploy: mode: replicated replicas: 3 db: image: mysql networks: - overlay volumes: - db-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress deploy: placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] volumes: db-data: networks: overlay:
在
在
部署服务
部署服务使用
$ docker stack deploy -c docker-compose.yml wordpress
现在我们打开浏览器输入
在浏览器新的标签页输入
查看服务
$ docker stack ls NAME SERVICES wordpress 3
移除服务
要移除服务,使用
$ docker stack down wordpress Removing service wordpress_db Removing service wordpress_visualizer Removing service wordpress_wordpress Removing network wordpress_overlay Removing network wordpress_default
该命令不会移除服务所使用的
五、在 Swarm 集群中管理敏感数据(管理密钥)
在动态的、大规模的分布式集群上,管理和分发
Docker 目前已经提供了
注意:
secret 也可以在Docker Compose 中使用。
我们可以用
这里我们以在 Swarm 集群中部署
创建 secret
我们使用
$ openssl rand -base64 20 | docker secret create mysql_password - $ openssl rand -base64 20 | docker secret create mysql_root_password -
查看 secret
使用
$ docker secret ls ID NAME CREATED UPDATED l1vinzevzhj4goakjap5ya409 mysql_password 41 seconds ago 41 seconds ago yvsczlx9votfw3l0nz5rlidig mysql_root_password 12 seconds ago 12 seconds ago
创建 MySQL 服务
创建服务相关命令已经在前边章节进行了介绍,这里直接列出命令。
$ docker network create -d overlay mysql_private $ docker service create --name mysql --replicas 1 --network mysql_private --mount type=volume,source=mydata,destination=/var/lib/mysql --secret source=mysql_root_password,target=mysql_root_password --secret source=mysql_password,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" -e MYSQL_USER="wordpress" -e MYSQL_DATABASE="wordpress" mysql:latest
如果你没有在
$ docker service create --name wordpress --replicas 1 --network mysql_private --publish target=30000,port=80 --mount type=volume,source=wpdata,destination=/var/www/html --secret source=mysql_password,target=wp_db_password,mode=0444 -e WORDPRESS_DB_USER="wordpress" -e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" -e WORDPRESS_DB_HOST="mysql:3306" -e WORDPRESS_DB_NAME="wordpress" wordpress:latest
查看服务
$ docker service ls ID NAME MODE REPLICAS IMAGE wvnh0siktqr3 mysql replicated 1/1 mysql:latest nzt5xzae4n62 wordpress replicated 1/1 wordpress:latest
现在浏览器访问
通过以上方法,我们没有像以前通过设置环境变量来设置 MySQL 密码, 而是采用
六、在 Swarm 集群中管理配置数据
在动态的、大规模的分布式集群上,管理和分发配置文件也是很重要的工作。传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性。
在 Docker 17.06 以上版本中,Docker 新增了
注意:
config 仅能在 Swarm 集群中使用。
这里我们以在 Swarm 集群中部署
创建 config
新建
port 6380
此项配置 Redis 监听
我们使用
$ docker config create redis.conf redis.conf
查看 config
使用
$ docker config ls ID NAME CREATED UPDATED yod8fx8iiqtoo84jgwadp86yk redis.conf 4 seconds ago 4 seconds ago
创建 redis 服务
$ docker service create --name redis # --config source=redis.conf,target=/etc/redis.conf --config redis.conf -p 6379:6380 redis:latest redis-server /redis.conf
如果你没有在
经过测试,redis 可以正常使用。
以前我们通过监听主机目录来配置 Redis,就需要在集群的每个节点放置该文件,如果采用
七、SWarm mode 与滚动升级
在 部署服务 一节中我们使用
现在我们想要将
你可能会想到,先停止原来的服务,再使用新镜像部署一个服务,不就完成服务的 “升级” 了吗。
这样做的弊端很明显,如果新部署的服务出现问题,原来的服务删除之后,很难恢复,那么在 Swarm mode 中到底该如何对服务进行滚动升级呢?
答案就是使用
$ docker service update --image nginx:1.13.12-alpine nginx
以上命令使用
更多选项可以通过
服务回退
现在假设我们发现
$ docker service rollback nginx
现在使用
$ docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS rt677gop9d4x nginx.1 nginx:1.13.7-alpine VM-20-83-debian Running Running about a minute ago d9pw13v59d00 \_ nginx.1 nginx:1.13.12-alpine VM-20-83-debian Shutdown Shutdown 2 minutes ago i7ynkbg6ybq5 \_ nginx.1 nginx:1.13.7-alpine VM-20-83-debian Shutdown Shutdown 2 minutes ago
结果的输出详细记录了服务的部署、滚动升级、回退的过程。
作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 ?? 收藏 ? 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!