学习Docker Stack
介绍
一个stack是一组共享依赖包的多个相关的services,并且可以编排和扩展.其实从第4小节开始,在利用compose文件部署app时,就已经开始一直使用stack.但是还只是运行在一个单一服务器的单一service.
现在,你可以学习在多个服务器上,运行多个相关的services.
- 使用下面的docker-compose.yml文件替换第4小节中的docker-compose.yml
1 | version: "3" |
docker-compose文件稍微做了点改动.添加一个Visualizer服务,placement指令确保这个Visualizer服务仅仅运行在swarm manager节点.
部署compose文件
- 初始化swarm
1 | docker swarm init |
- 第二台服务器加入swarm集群
1 | [root@php compose]$docker swarm join --token SWMTKN-1-5qr6e90o52h5licxatuvmft65kji5qf1roujebf16auoe5xgam-3d0fuzr8818r6330n88dm1fcu 10.0.0.50:2377 |
- 部署app
1 | [root@localhost compose]$docker stack deploy -c docker-compose.yml getstartedlab |
添加了2个服务.web和Visualizer
1 | [root@localhost compose]$docker stack ps getstartedlab |
访问任意一台服务器的8080端口,可以看到Visualizer服务正在运行
这是我借用的官网的图片.
可以看到,visualizer运行在swarm manager节点上,5个web服务运行在swarm集群上.visualizer是一个不需要任何依赖,而可以运行在任何app的独立服务.现在尝试一下创建一个具有依赖项的服务:提供访问计数器的Redis服务
编辑docker-compose文件
1 | version: "3" |
这里我们添加了一个redis服务.在Docker HUB上有redis官方镜像,并且已经暴露了6379端口.所以这里只需要指定redis镜像即可..同样redis也只运行在manager节点服务器.
这里为了持久化数据,在启动redis容器的时候指定了appendonly参数,并且挂载了本机的/home/docker/data目录映射到容器的/data.(redis容器默认保存数据路径)
- 在manager节点创建/home/docker/data目录
1 | [root@localhost compose]$mkdir -pv /home/docker/data |
- 部署compose
1 | [root@localhost compose]$docker stack deploy -c docker-compose.yml getstartedlab |
可以看到3个services都启动起来了
1 | [root@localhost compose]$docker service ls |
在浏览器访问服务器的4000端口可以看到有一个访问计数器在增加
1 | huangyong@huangyong-Macbook-Pro ~ curl http://10.0.0.50:4000 |
访问另外一台服务器也可以看到同样结果
1 | huangyong@huangyong-Macbook-Pro ~ curl http://10.0.0.12:4000 |
访问visulizer容器的8080端口,可以看到redis服务运行
管理命令
使用docker node ls 列出swarm集群的所有节点
使用docker service ls 列出所有服务
docker service ps <service_name> 列出某个服务的所有tasks
1 | [root@localhost ~]$docker node ls |