您的位置:首页 > 运维架构 > Docker

73.Docker的中级使用:服务和集群

2017-05-03 14:30 375 查看
服务

集群

转载请注明原始出处:http://blog.csdn.net/a464057216/article/details/71123165

服务

实际生产中使用
docker run
的方式启动容器是非常不易管理的,Docker提供了服务编排的功能可以方便扩展应用规模、配置流量负载均衡等。服务编排通过
docker-compose.yml
(YAML文件的名字是任意的)定义,例如:

version: "3"
services:
web:
image: hub.c.163.com/learndocker/learndocker:v1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:


上面的YAML文件定义如下几个规则:

运行5个
learndocker
的实例作为名为
web
的服务,每个实例限制最高使用10%的CPU和50M内存。

如果某个实例失败,立即重启容器。

建立宿主机的80端口到容器的80端口的映射。

web
服务的5个容器通过名为
webnet
的网络共享80端口。

webnet
网络采用默认配置,即负载均衡。

首先初始化集群服务:

$ docker swarm init
Swarm initialized: current node (<node ID>) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join \
--token <token> \
<ip>:<port>

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


先登录Docker Hub再运行服务,
learndocker
是给应用启的名字:

# Written by: CSDN - Mars Loo的博客
$ docker login hub.c.163.com
Username: marsloo
Password:
Login Succeeded
$ docker stack deploy -c docker-compose.yml learndocker
Creating network learndocker_webnet
Creating service learndocker_web


通过如下命令查看容器运行情况:

# Written by: CSDN - Mars Loo的博客
$ docker stack ps learndocker
ID            NAME               IMAGE                                     NODE                   DESIRED STATE  CURRENT STATE                 ERROR  PORTS
kymj866ml0n0  learndocker_web.1  hub.c.163.com/learndocker/learndocker:v1  localhost.localdomain  Running        Preparing about a minute ago
cnebfmpfmoob  learndocker_web.2  hub.c.163.com/learndocker/learndocker:v1  localhost.localdomain  Running        Preparing about a minute ago
d6h6nlvqzb2x  learndocker_web.3  hub.c.163.com/learndocker/learndocker:v1  localhost.localdomain  Running        Preparing about a minute ago
i7ezt3v2veas  learndocker_web.4  hub.c.163.com/learndocker/learndocker:v1  localhost.localdomain  Running        Preparing about a minute ago
o32fpbvvdtdm  learndocker_web.5  hub.c.163.com/learndocker/learndocker:v1  localhost.localdomain  Running        Preparing about a minute ago


浏览器访问主机的80端口,刷新几次浏览器可以发现Hostname是变化的,证明进行了负载均衡:





如果要增加容器运行的实例数量,直接修改YAML文件,然后
docker stack deploy -c docker-compose.yml learndocker
即可,docker会增加相应的数量的容器,而不会影响已经运行的容器。

停止运行应用:
docker stack rm <appname>


查看所有的应用列表:
docker stack ls


查看某个应用的所有服务:
docker stack services <appname>


查看某个应用运行的所有容器:
docker stack ps <appname>


集群

Docker swarm适用于多机多容器场景,swarm指运行Docker且加入同一个集群的机器(物理机或虚拟机)的集合。在swarm manager执行命令,相当于在集群执行命令,其余机器的角色是swarm worker。加入集群后,机器称为节点。

Swarm manager可以按不同策略运行容器,比如“空闲模式”——分配容器给利用率最低的机器,“全局模式”——确保每台机器都获得容器的一个运行实例。在Docker集群中,swarm manager起到管理作用,其余swarm worker仅仅起到扩容作用。

在swarm manager机器上使用
docker swarm init
使能集群模式,然后在其他worker机器上使用类似如下命令加入集群:

# Written by: CSDN - Mars Loo的博客
docker swarm join \
--token <token> \
<ip>:<port>
This node joined a swarm as a worker.


如果出现类似
Error response from daemon: rpc error: code = 14 desc = grpc: the connection is unavailable
的错误,可能是由于防火墙引起的,解决方案是正确配置防火墙或关闭防火墙(为了应用安全,建议正确配置防火墙)。

worker加入集群后,在swarm manager上使用
docker stack deploy -c config.yml <appname>
启动应用,然后使用
docker stack ps <appname>
命令即可查看容器在集群中的分布情况:

# Written by: CSDN - Mars Loo的博客
$ docker stack ps learndocker
ID            NAME               IMAGE                                     NODE         DESIRED STATE  CURRENT STATE            ERROR  PORTS
hff3wyl7ax3c  learndocker_web.1  hub.c.163.com/learndocker/learndocker:v1  bogon        Running        Starting 2 seconds ago
exxmh1oj8e1w  learndocker_web.2  hub.c.163.com/learndocker/learndocker:v1  bogon        Running        Starting 1 second ago
6b2mnx6n9zal  learndocker_web.3  hub.c.163.com/learndocker/learndocker:v1  centos7.bak  Running        Preparing 6 seconds ago
qsv3sxschn1n  learndocker_web.4  hub.c.163.com/learndocker/learndocker:v1  bogon        Running        Starting 1 second ago
yr58eka5b7gs  learndocker_web.5  hub.c.163.com/learndocker/learndocker:v1  centos7.bak  Running        Preparing 6 seconds ago


如果集群中加入了新的机器,在swarm manager上重新运行
docker stack deploy -c config.yml <appname>
命令即可。通过集群方式部署服务后,通过两个节点的80端口均可访问服务,Docker底层通过入口网络(ingress network)实现此功能,入口网络图式如下:



即HTTP请求无论发往哪个机器的80端口,通过负载均衡算法,均可将请求转发至集群内的所有容器。使能入口网络依赖集群中的节点开放如下端口:

网络发现依赖TCP/UDP的7946端口

Ingress网络依赖UDP的4789端口

接下来请继续阅读通过栈的方式在产品中使用Docker

如果觉得我的文章对您有帮助,欢迎关注我(CSDN:Mars Loo的博客)或者为这篇文章点赞,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐