Py学习  »  docker

讲座实录 | 拥抱容器:Docker 集群入门与实战(下)

GDG • 6 年前 • 838 次点击  
讲师:孟繁超 | 记录:Ron You | 编辑:婧


错过了【8月18日】拥抱容器:Docker 实战第二讲?没关系!我们已经把实录给你带来了👇


这篇文章将侧重介绍 docker 在集群方面的部署,在介绍完集群相关概念之后会进入大家喜闻乐见的实战环节~


首先让我们来看看与集群相关的对象:

  • swarm

  • node

  • stack

  • service


其中 swarm 在上篇推文已经有过介绍,可以关注 GDG 公众号查看历史消息。


NODE


node 的概念和 swarm 密切相关,swarm 是指一组包含一个或多个运行 docker engine 的主机(物理机或者虚拟机)组成的群组,节点(node)就自然是指在群组中的单体了。



运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点 (node) 。


node 有两类:managers 和 works。managers 负责 swarm 的任务调度和编排决策,works 负责任务的执行。

node 的类别可以互相转换,如果想要转换一个 worker 为 manager,可以使用 docker node promte , 反之则使用 docker node demote

$ docker node --help
Usage: docker node COMMAND
Manage Swarm nodes
Commands: demote Demote one or more nodes from manager in the swarm inspect Display detailed information on one or more nodes ls List nodes in the swarm promote Promote one or more nodes to manager in the swarm ps List tasks running on one or more nodes, defaults to current node rm Remove one or more nodes from the swarm update Update a node
Run 'docker node COMMAND --help' for more information on a command.


使用 ls 命令查看节点信息:


$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONv1oo73vt40hnjivnhnw78po4u * dameng-00 Ready Active Leader 18.09.8-ceyrz7drszt4hq5j8c8rbhoexqc dameng-01 Ready Active 18.09.8-ce

SERVICE

service[1] is the definition of how you want to run your application containers in a swarm.


简单来说,service 定义了 worker node 上要执行的任务。swarm 的主要编排任务就是保证 service 处于期望的状态下。


创建 service 时,您可以指定要使用的容器镜像以及在运行容器中执行的命令。您还可以定义 service 的选项,包括:

  • 群集在群组外部提供服务的端口

  • 服务的覆盖网络,以连接到群中的其他服务

  • CPU和内存限制和预留

  • 滚动更新政策

  • 要在群中运行的图像的副本数


Service 的创建过程:



$ docker service --help
Usage: docker service COMMAND
Manage services
Commands: create Create a new service inspect Display detailed information on one or more services logs Fetch the logs of a service or task ls List services ps List the tasks of one or more services rm Remove one or more services rollback Revert changes to a service's configuration scale Scale one or multiple replicated services update Update a service
Run 'docker service COMMAND --help' for more information on a command.


查看:


$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTSoyiesfc3biiq myapp_myapp replicated 1/1 friendlyhello:v3 *:5000->5000/tcpxrk7kska1z76 myapp_redis replicated 1/1 redis:latest


扩容:


$ docker service scale myapp_myapp=2
ID NAME MODE REPLICAS IMAGE PORTSoyiesfc3biiq myapp_myapp replicated 2/2 friendlyhello:v3 *:5000->5000/tcp xrk7kska1z76 myapp_redis replicated 1/1 redis:latest

STACK


stack 是一组相互关联的服务,它们共享依赖关系,并且可以一起 orchestrated (编排)和缩放。单个 stack 能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个 stack)。

$ docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options: --kubeconfig string Kubernetes config file --orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands: deploy Deploy a new stack or update an existing stack ls List stacks ps List the tasks in the stack rm Remove one or more stacks services List the services in the stack


部署:


# compose:$ docker-compose -f CONFIG-YAML up
# stack:$ docker stack deploy -c CONFIG-YAML STACK-NAME


查看:


# compose:$ docker-compose ps$ docker ps
# stack: $ docker node ls$ docker stack ls$ docker service ls


终止:


# compose:$ docker-compose -f CONFIG-YAML down
# stack:$ docker stack rm STACK-NAME


网络:


单机 vs 跨节点

注意: docker stack 默认使用的是swarm,但也是可以对接k8s的


TRY IT OUT : 使用 Swarm 部署


这次我们要用Swarm集群来部署前面做过的friendlyhello


在前面,我们了解到可以用Docker Machine很快地创建一个虚拟的Docker主机,接下来我们来创建2个新的Docker主机,并加入到集群中。


STEP 1: 创建Swarm集群——管理节点


首先是一个管理节点,创建并通过ssh连接:


$ docker-machine create -d virtualbox manager$ docker-machine ssh manager


我们可以看到:

然后,我们用docker swarm init从这个节点初始化一个Swarm集群,如果这个Docker主机有多个IP(多个网卡),就要用--advertise-addr指定一个:


$ docker swarm init --advertise-addr 192.168.99.107


我们可以看到:

现在我们的Manager节点就是刚刚创建的集群的管理节点了,记得复制一下它输出的添加工作节点的那句命令。

STEP 2: 添加项目文件


接下来我们Manager节点的~/try-it-out-4里添加几个文件:

  • app.py

  • Dockerfile

  • docker-stack.yaml


$ mkdir try-it-out-4$ cd try-it-out-4$ vi app.py$ vi Dockerfile$ vi docker-stack.yaml
$ docker build -t friendlyhello .

app.py


from flask import Flaskfrom redis import Redis, RedisErrorimport osimport socket


    

# Connect to Redisredis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)

@app.route("/")def hello(): try: visits = redis.incr("counter") except RedisError: visits = "cannot connect to Redis, counter disabled"
html = "

Hello {name}!

" \
"Hostname: {hostname}
" \
"Visits: {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)

Dockerfile

FROM python:3.7-slim
WORKDIR /app
COPY . /app
RUN pip install flask redis -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com EXPOSE 5000ENV NAME World
CMD ["python", "app.py"]

docker-stack.yaml

version: "3"
services: myapp: image: friendlyhello container_name: myapp ports: - 5000:5000 environment: NAME: World
redis: image: redis container_name: web

STEP 3: 创建 Swarm 集群——工作节点

继续,我们来创建一个工作节点:


首先回到主机:

$ exit


接着创建一个新的虚拟机worker,并通过上面复制的那句命令加入到集群里:


$ docker-machine create -d virtualbox worker$ docker-machine ssh worker
$ docker swarm join --token SWMTKN-1-3wd0vdozskitmpw5vofkjc9ie6251wuno21dmbugqk56pd97iv-eu9w5gkkmy7chvgcwt7j71iu4 192.168.99.107:2377


我们可以看到:

STEP 4: 使用Stack部署服务


我们先回到manager节点:


$ exit
$ docker-machine ssh manager


然后使用docker stack deploy部署服务,其中 -c参数指定docker-stack.yaml文件:


$ docker stack deploy -c ~/try-it-out/docker-stack.yaml friendlyhello

部署完毕。

STEP 5: 访问 friendlyhello


现在就可以通过集群中的任意一个节点的IP访问到这个flask项目了:

TRY IT OUT: 使用 Docker stack 部署


我们继续用前一个 Case 的集群。


进入manager节点,在try-it-out-5里新建一个docker-stack.yaml


$ docker-machine ssh manager
$ mkdir try-it-out-5$ vi docker-stack.yaml

docker-stack.yaml

version: '3.1'
services:
db: image: postgres command: postgres -c 'shared_buffers=512MB' -c 'max_connections=2000' restart: always environment: POSTGRES_USER: dameng POSTGRES_PASSWORD: pythonic ports: - 5432:5432 volumes: - pgdata:/var/lib/postgresql/data

adminer: image: adminer restart: always ports: - 8998:8080
volumes: pgdata:


然后部署:


$ docker stack deploy -c docker-stack.yaml postgresql


接着就可以从8998端口访问 GUI 了:

小作业&大福利


在尝试过 Docker 部署之后,让我们应用起来吧!可以点击文首蓝色 GDG,关注 GDG 微信公众号,回复【docker】获得上述 TRY IT OUT!源码


此处留一个作业哦,就是用 docker swarm 和 docker stack 尝试部署一个有前后端,带有数据库的 web,在下次课上进行展示会有非常棒的奖品!!!


奖品是什么暂时保密!一定不会让你失望滴~

References

[1] service: https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/


关于我们

Google Developer Groups 谷歌开发者社区,是谷歌开发者部门发起的全球项目,面向对 Google 和开源技术感兴趣的人群而存在的公益性开发者社区。GDG Shanghai 创立于 2009 年,是全球 GDG 社区中最活跃和知名的技术社区之一,每年举办 30 – 50 场大大小小的科技活动,每年影响十几万以上海为中心辐射长三角地带的开发者及科技从业人员。


社区中的各位组织者均是来自各个行业有着本职工作的互联网从业者,我们需要更多新鲜血液的加入!如果你对谷歌技术感兴趣,业余时间可调配,认同社区的价值观,愿意为社区做出贡献,欢迎加入我们成为社区志愿者!


志愿者加入方式:关注上海 GDG 公众号:GDG_Shanghai,回复:志愿者。


社区成员加入方式:请发邮件至以下邮箱

  gdg-shanghai+subscribe@googlegroups.com、

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38512