服务
通过运行镜像得到一个容器,这个容器向外提供服务,服务只运行一个映像,但它的运行方式——即它应该使用哪些端口,应该运行多少个容器副本,以及服务具有所需的容量,等等。扩展服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多的计算资源,幸运的是在Docker上,运行和扩展服务非常容易——只需编写一个docker-compose.yml文件即可。
docker-compose.yml文件
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: micoldd/test:friendlyhello
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
该docker-compose.yml
文件告诉Docker执行以下操作:
-
从username/repo:tag中拉取镜像。
-
将该映像的5个实例作为一个被调用的服务运行
web
,限制每个实例的资源使用,最多只占单个CPU核心时间的10%(“1.5”表示一个半核心即150%),以及50MB RAM。 -
如果一个失败,立即重启容器。
-
将主机上的端口4000映射到
web
端口80。 -
指示
web
容器通过称为负载平衡的网络共享端口80webnet
。(在内部,容器本身将web
发布到 80端口。) -
webnet
使用默认设置(负载平衡的覆盖网络)定义网络。
运行负载均衡的应用
- 在运行之前,要打开集群模式,注意
docker swarm init
命令会将当前节点作为集群管理器
F:\dockerExample>docker swarm init
Swarm initialized: current node (n6bipht26vpu4yvfc36f706qs) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1cu8f4kk8663cd4snt5f5xhoju7ywrcblg92e2h037kst1ox4r-acvg4htwkvm9e4w3xidh9y7sk 192.168.65.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果你没有执行swarm init 命令,你执行下面的命令的时候会报错:“this node is not a swarm manager.”
- 运行之前现在得为你的service取个名字:我给的名字是
getstartedlab
:
docker stack deploy -c docker-compose.yml getstartedlab
F:\dockerExample>docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
F:\dockerExample>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a514a1055bb micoldd/test:friendlyhello "python app.py" 51 seconds ago Up 47 seconds 80/tcp getstartedlab_web.5.n3rg197d86j7ps3w1byeq2jqc
eb01bd51c06c micoldd/test:friendlyhello "python app.py" 51 seconds ago Up 47 seconds 80/tcp getstartedlab_web.4.xjlli44uqva9ztp02vl079q6w
c0a6e0deb908 micoldd/test:friendlyhello "python app.py" 51 seconds ago Up 47 seconds 80/tcp getstartedlab_web.2.zoxpkb7uc18wa0jr6gbsyqayu
f80d82b4d4f3 micoldd/test:friendlyhello "python app.py" 51 seconds ago Up 48 seconds 80/tcp getstartedlab_web.1.i3nytdihaaohn3hflznjx5hfv
7c0d4e574839 micoldd/test:friendlyhello "python app.py" 51 seconds ago Up 47 seconds 80/tcp getstartedlab_web.3.ochfhxexdv4w6avv1jhn1i2hz
F:\dockerExample>
可以看到已经启动了5个容器,如果你访问本地的htpp://localhost:4000,每刷新一次都是5个container id
中的一个,负载均衡使用的规则是轮询
- 查看所有服务
docker service ls
F:\dockerExample>docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
orh2kwsuwz1m getstartedlab_web replicated 5/5 micoldd/test:friendlyhello *:4000->80/tcp
F:\dockerExample>
注意以_web
结束的NAME字段。如果你服务的名车和我取的一样,则名称为 getstartedlab_web
。还列出了服务ID,以及副本数,镜像名称和公开端口。或者,您可以运行docker stack services
,然后加上服务的名称。以下示例命令允许您查看与getstartedlab
堆关联的所有服务 :
docker stack services getstartedlab
ID NAME MODE REPLICAS IMAGE PORTS
bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp
在服务中运行的单个容器称为任务。任务名称被赋予以数字递增的唯一ID,最多为在docker-compose.yml
中定义的replicas
数量。列出您的服务任务:
# docker service ps getstartedlab_web
F:\dockerExample>docker service ps getstartedlab_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
i3nytdihaaoh getstartedlab_web.1 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running 25 minutes ago
zoxpkb7uc18w getstartedlab_web.2 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running 25 minutes ago
ochfhxexdv4w getstartedlab_web.3 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running 25 minutes ago
xjlli44uqva9 getstartedlab_web.4 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running 25 minutes ago
n3rg197d86j7 getstartedlab_web.5 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running 25 minutes ago
如果您只列出系统上的所有容器,则任务也会显示:
docker container ls -q
查看所有的容器id
F:\dockerExample>docker container ls -q
2a514a1055bb
eb01bd51c06c
c0a6e0deb908
f80d82b4d4f3
7c0d4e574839
您可以运行多次curl -4 http://localhost:4000
,或者在浏览器中访问该URL并点击刷新几次。
无论哪种方式,Hostname都会发生变化,即五个容器id的一个,从而证明负载均衡; 对于每个请求,以轮询方式选择5个任务中的一个来响应。容器ID与上一个命令(docker container ls -q
)的输出匹配。
- 要查看堆中的所有任务,您可以运行
docker stack ps
加上您的服务名称,如以下示例所示:
F:\dockerExample>docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
i3nytdihaaoh getstartedlab_web.1 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago
zoxpkb7uc18w getstartedlab_web.2 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago
ochfhxexdv4w getstartedlab_web.3 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago
xjlli44uqva9 getstartedlab_web.4 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago
n3rg197d86j7 getstartedlab_web.5 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago
F:\dockerExample>
Windows 10上执行curl?
Windows 10 PowerShell上
curl
应该已经可用,但如果没有,你可以获得像Git BASH这样的Linux终端模拟器 ,或者下载wget。
响应时间慢?
根据当前环境的网络配置,容器最多可能需要30秒才能响应HTTP请求。这并不表示Docker或swarm性能,而是未满足的Redis依赖性。目前,访客数量因同样的原因不起作用; 我们还没有添加服务来保存数据。
继续扩展应用程序
您可以通过更改docker-compose.yml
中的replicas
值,保存更改并重新运行docker stack deploy
命令来扩展应用程序:
docker stack deploy -c docker-compose.yml getstartedlab
Docker执行实时更新,无需首先拆除堆或停止任何容器。
现在,重新运行docker container ls -q
以查看已重新配置的已部署实例。如果增大副本数量,则会启动更多任务,从而启动更多容器。
停止应用程序和集群
-
将应用程序关闭
docker stack rm
加上服务名称:docker stack rm getstartedlab
-
关闭集群。
docker swarm leave --force
-
示例
F:\dockerExample>docker stack ps getstartedlab ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS i3nytdihaaoh getstartedlab_web.1 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago zoxpkb7uc18w getstartedlab_web.2 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago ochfhxexdv4w getstartedlab_web.3 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago xjlli44uqva9 getstartedlab_web.4 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago n3rg197d86j7 getstartedlab_web.5 micoldd/test:friendlyhello linuxkit-00155d38010d Running Running about an hour ago F:\dockerExample>docker stack rm getstartedlab Removing service getstartedlab_web Removing network getstartedlab_webnet F:\dockerExample>docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a514a1055bb micoldd/test:friendlyhello "python app.py" About an hour ago Up About an hour 80/tcp getstartedlab_web.5.n3rg197d86j7ps3w1byeq2jqc eb01bd51c06c micoldd/test:friendlyhello "python app.py" About an hour ago Up About an hour 80/tcp getstartedlab_web.4.xjlli44uqva9ztp02vl079q6w c0a6e0deb908 micoldd/test:friendlyhello "python app.py" About an hour ago Up About an hour 80/tcp getstartedlab_web.2.zoxpkb7uc18wa0jr6gbsyqayu f80d82b4d4f3 micoldd/test:friendlyhello "python app.py" About an hour ago Up About an hour 80/tcp getstartedlab_web.1.i3nytdihaaohn3hflznjx5hfv 7c0d4e574839 micoldd/test:friendlyhello "python app.py" About an hour ago Up About an hour 80/tcp getstartedlab_web.3.ochfhxexdv4w6avv1jhn1i2hz F:\dockerExample>docker swarm leave --force Node left the swarm. F:\dockerExample>docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES F:\dockerExample>
网友评论