要求
- 安装了1.13版本以上的Docker
- 安装了Docker Compose
# 下载安装docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 为docker-compose 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 确保发布了part2中的friendlyhello image
- 确保friendlyhello 能正常启动
# 启动iamge
docker run -p 80:80 username/repo:tag
# 访问 http://localhost/
关于服务
服务实际上就是“生产中的容器”。一个服务只运行一个image,但它编纂image的运行方式 ——它应该使用哪些端口,应该运行多少个容器副本,以便服务具有所需的容量,等等。扩展服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多计算资源。
幸运的是,使用Docker平台定义,运行和扩展服务非常容易 - 只需编写一个docker-compose.yml文件即可。
第一个 docker-compose.yml 文件
- docker-compose.yml 定义了Docker containers 的行为
- docker-compose.yml 可以保存到任意位置
一个docker-compose.yml文件是一个YAML文件,它定义了如何Docker容器在生产中应表现。
创建 docker-compose.yml 文件,保存到任意位置
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 8
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
该docker-compose.yml文件告诉Docker执行以下操作:
-
拉我们在步骤2中上传的image
-
运行该image的8个实例,作为服务,叫做web,限制每个实例最多使用单个CPU核心时间的10%,以及50MB RAM。
-
如果有一个失败了,立即重启所有容器。
-
将主机上的端口4000映射到web端口80。
-
指示web容器通过称为负载平衡的网络共享端口80 webnet。(在内部,容器本身web在短暂的端口发布到 80端口。)
webnet使用默认设置(负载平衡的覆盖网络)定义网络。
Run your new load-balanced(负载均衡) app
- 1、初始化集群(part4会具体讲解)
docker swarm ini
- 2、部署应用,可以给应用设置一个名字:getstartedlab
docker stack deploy -c docker-compose.yml getstartedlab
现在我们的 stack 中正运行着5个容器实例,可以在浏览器中输入http://localhost:4000/访问服务了
- 3、查看service ID
# 方法1
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vieno09adja5 getstartedlab_web replicated 8/8 yolanda99/get-started:part2 *:4000->80/tcp
# 方法2
docker stack services getstartedlab
ID NAME MODE REPLICAS IMAGE PORTS
vieno09adja5 getstartedlab_web replicated 8/8 yolanda99/get-started:part2 *:4000->80/tcp**
- 4、查看service或者stack的所有任务
在service上运行的一个container 叫做一个task,task 有唯一的自增id,task个数就是docker-compose.yml 文件中定义的replicas个数
# 方法1
docker service ps getstartedlab_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kxev9e1bqe3z getstartedlab_web.1 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
d2emxey208gz getstartedlab_web.2 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
jtentwj29xgt getstartedlab_web.3 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
h451ix24b0om getstartedlab_web.4 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
lwobxl7su15u getstartedlab_web.5 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
eegrl8znxdme getstartedlab_web.6 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
syqiyo2px3h7 getstartedlab_web.7 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
r4247hsc4qhm getstartedlab_web.8 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
# 方法2
docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kxev9e1bqe3z getstartedlab_web.1 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
d2emxey208gz getstartedlab_web.2 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
jtentwj29xgt getstartedlab_web.3 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
h451ix24b0om getstartedlab_web.4 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
lwobxl7su15u getstartedlab_web.5 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
eegrl8znxdme getstartedlab_web.6 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
syqiyo2px3h7 getstartedlab_web.7 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
r4247hsc4qhm getstartedlab_web.8 yolanda99/get-started:part2 server2-OptiPlex-380 Running Running 5 hours ago
也可以通过列出所有 container 显示task,但是没有用service过滤
docker container ls -q
2db10346e0e0
595fe0574031
5c7d06409f22
cb698b371925
45f00ea2ca98
8511c370da6e
4d39ce4eaa28
2c5302f215d6
您可以连续多次运行 curl -4 http://localhost:4000
,或者在浏览器中转到该URL并点击刷新几次。无论哪种方式,容器ID都会发生变化,从而证明负载均衡; 对于每个请求,以循环方式选择5个任务中的一个来响应。容器ID与上一个命令(docker container ls -q)的输出匹配。
Scale the app(扩展应用程序)
修改docker-compose.yml 文件中的replicas 的值,重新部署docker
docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: hwb75v60hlt9lpc3q78jlm1gq)
Take down the app and the swarm(移除应用程序和集群)
移除应用程序
docker stack rm getstartedlab
移除集群
docker swarm leave --force
命令小结
docker stack ls # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager