使用Docker Swarm部署可扩展的Python3应用

简介:

 

Ben Firshman 最近在 Dockercon 做了一个关于使用 Docker 构建无服务应用的演讲,你可以在这里查看详情(还有视频)。之后,我写了一篇关于如何使用 AWS Lambda 构建微服务系统的文章。

今天,我想展示给你的就是如何使用 Docker Swarm 部署一个简单的 Python Falcon REST 应用。这里我不会使用dockerrun 或者是其他无服务特性,你可能会惊讶,使用 Docker Swarm 部署(复制)一个 Python(Java、Go 都一样)应用是如此的简单。

注意:这展示的部分步骤是截取自 Swarm Tutorial,我已经修改了部分内容,并且增加了一个 Vagrant Helper 的仓库来启动一个可以让 Docker Swarm 工作起来的本地测试环境。请确保你使用的是 1.12 或以上版本的 Docker Engine。我写这篇文章的时候,使用的是 1.12RC2 版本。注意的是,这只是一个测试版本,可能还会有修改。

你要做的第一件事,就是如果你想本地运行的话,你要保证 Vagrant 已经正确的安装和运行了。你也可以按如下步骤使用你最喜欢的云服务提供商部署 Docker Swarm 虚拟机系统。

我们将会使用这三台 VM:一个简单的 Docker Swarm 管理平台和两台 worker。

安全注意事项:Vagrantfile 代码中包含了部分位于 Docker 测试服务器上的 shell 脚本。这是一个潜在的安全问题,它会运行你不能控制的脚本,所以请确保你会在运行代码之前审查过这部分的脚本。

 
  1. $ git clone https://github.com/chadlung/vagrant-docker-swarm 
  2. $ cd vagrant-docker-swarm 
  3. $ vagrant plugin install vagrant-vbguest 
  4. $ vagrant up 

Vagrant up 命令需要一些时间才能完成。

SSH 登录进入 manager1 虚拟机:

 
  1. $ vagrant ssh manager1 

在 manager1 的 ssh 终端会话中执行如下命令:

 
  1. $ sudo docker swarm init --listen-addr 192.168.99.100:2377 

现在还没有 worker 注册上来:

 
  1. $ sudo docker node ls 

让我们注册两个新的 worker,请打开两个新的终端会话(保持 manager1 会话继续运行):

 
  1. $ vagrant ssh worker1 

在 worker1 的 ssh 终端会话上执行如下命令:

 
  1. $ sudo docker swarm join 192.168.99.100:2377 

在 worker2 的 ssh 终端会话上重复这些命令。

在 manager1 终端上执行如下命令:

 
  1. $ docker node ls 

你将会看到:


在 manager1 的终端里部署一个简单的服务。

 
  1. sudo docker service create --replicas 1 --name pinger alpine ping google.com 

这个命令将会部署一个服务,它会从 worker 之一 ping google.com。(或者 manager,manager 也可以运行服务,不过如果你只是想 worker 运行容器的话,也可以禁用这一点)。可以使用如下命令,查看哪些节点正在执行服务:

 
  1. $ sudo docker service tasks pinger 

结果会和这个比较类似:

所以,我们知道了服务正跑在 worker1 上。我们可以回到 worker1 的会话里,然后进入正在运行的容器:

 
  1. $ sudo docker ps 

你可以看到容器的 id 是: ae56769b9d4d,在我的例子中,我运行如下的代码:

 
  1. $ sudo docker attach ae56769b9d4d 

 

你可以按下 CTRL-C 来停止服务。

回到 manager1,然后移除这个 pinger 服务。

 
  1. $ sudo docker service rm pinger 

现在,我们将会部署可复制的 Python 应用。注意,为了保持文章的简洁,而且容易复制,所以部署的是一个简单的应用。

你需要做的第一件事就是将镜像放到 Docker Hub上,或者使用我已经上传的一个。这是一个简单的 Python 3 Falcon REST 应用。它有一个简单的入口: /hello 带一个 value 参数。

放在 chadlung/hello-app 上的 Python 代码看起来像这样:

 
  1. import json 
  2. from wsgiref import simple_server 
  3. import falcon 
  4. class HelloResource(object): 
  5.     def on_get(self, req, resp): 
  6.         try: 
  7.             value = req.get_param('value'
  8.             resp.content_type = 'application/json' 
  9.             resp.status = falcon.HTTP_200 
  10.             resp.body = json.dumps({'message': str(value)}) 
  11.         except Exception as ex: 
  12.             resp.status = falcon.HTTP_500 
  13.             resp.body = str(ex) 
  14. if __name__ == '__main__'
  15.     app = falcon.API() 
  16.     hello_resource = HelloResource() 
  17.     app.add_route('/hello', hello_resource) 
  18.     httpd = simple_server.make_server('0.0.0.0', 8080, app) 
  19.     httpd.serve_forever() 

Dockerfile 很简单:

 
  1. FROM python:3.4.4 
  2. RUN pip install -U pip 
  3. RUN pip install -U falcon 
  4. EXPOSE 8080 
  5. COPY . /hello-app 
  6. WORKDIR /hello-app 
  7. CMD ["python""app.py"

上面表示的意思很简单,如果你想,你可以在本地运行该进行来访问这个入口: http://127.0.0.1:8080/hello?value=Fred

这将返回如下结果:

 
  1. {"message""Fred"

在 Docker Hub 上构建和部署这个 hello-app(修改成你自己的 Docker Hub 仓库或者使用这个):

 
  1. $ sudo docker build . -t chadlung/hello-app:2 
  2. $ sudo docker push chadlung/hello-app:2 

现在,我们可以将应用部署到之前的 Docker Swarm 了。登录 manager1 的 ssh 终端会话,并且执行:

 
  1. $ sudo docker service create -p 8080:8080 --replicas 2 --name hello-app chadlung/hello-app:2 
  2. $ sudo docker service inspect --pretty hello-app 
  3. $ sudo docker service tasks hello-app 

现在,我们已经可以测试了。使用任何一个 Swarm 节点的 IP 来访问 /hello 入口。在本例中,我在 manager1 的终端里使用 curl 命令:

注意,Swarm 中的所有的 IP 都可以,不管这个服务是运行在一台还是更多的节点上。

 
  1. $ curl -v -X GET "http://192.168.99.100:8080/hello?value=Chad" 
  2. $ curl -v -X GET "http://192.168.99.101:8080/hello?value=Test" 
  3. $ curl -v -X GET "http://192.168.99.102:8080/hello?value=Docker" 

结果:

 
  1. * Hostname was NOT found in DNS cache 
  2. *   Trying 192.168.99.101... 
  3. * Connected to 192.168.99.101 (192.168.99.101) port 8080 (#0) 
  4. > GET /hello?value=Chad HTTP/1.1 
  5. User-Agent: curl/7.35.0 
  6. > Host: 192.168.99.101:8080 
  7. > Accept: */* 
  8. >  
  9. * HTTP 1.0, assume close after body 
  10. < HTTP/1.0 200 OK 
  11. Date: Tue, 28 Jun 2016 23:52:55 GMT 
  12. < Server: WSGIServer/0.2 CPython/3.4.4 
  13. < content-type: application/json 
  14. < content-length: 19 
  15. <  
  16. {"message""Chad"

从浏览器中访问其他节点:

如果你想看运行的所有服务,你可以在 manager1 节点上运行如下代码:

 
  1. $ sudo docker service ls 

如果你想添加可视化控制平台,你可以安装 Docker Swarm Visualizer(这对于展示非常方便)。在 manager1 的终端中执行如下代码:

 
  1. $ sudo docker run -it -d -p 5000:5000 -e HOST=192.168.99.100 -e PORT=5000 -v /var/run/docker.sock:/var/run/docker.sock manomarks/visualizer 

打开你的浏览器,并且访问: http://192.168.99.100:5000/

结果如下(假设已经运行了两个 Docker Swarm 服务):

要停止运行 hello-app(已经在两个节点上运行了),可以在 manager1 上执行这个代码:

 
  1. $ sudo docker service rm hello-app 

如果想停止 Visualizer, 那么在 manager1 的终端中执行:

 
  1. $ sudo docker ps 

获得容器的 ID,这里是: f71fec0d3ce1,从 manager1 的终端会话中执行这个代码:

 
  1. $ sudo docker stop f71fec0d3ce1 

祝你成功使用 Docker Swarm。这篇文章主要是以 1.12 版本来进行描述的。

本文作者:Chad Lung

来源:51CTO

相关文章
|
7天前
|
Python
python增量赋值运算的应用
Python中的增量赋值运算符用于便捷地执行算术操作,如`+=`, `-=`等,它们分别代表加法、减法、乘法、除法、取模、整除和幂运算。
10 1
|
7天前
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
|
1天前
|
机器学习/深度学习 数据采集 供应链
从数据到决策:scikit-learn在业务分析中的应用
【4月更文挑战第17天】本文探讨了scikit-learn在业务分析中的应用,包括数据预处理、分类、回归和聚类模型的构建,以及模型评估与优化。通过使用scikit-learn,企业能有效处理数据、预测趋势、客户细分并制定决策,从而提升经营效率和市场策略。随着机器学习的发展,scikit-learn在业务分析领域的潜力将持续释放,创造更多价值。
|
1天前
|
测试技术 Linux 网络安全
【好玩的开源项目】使用Docker部署SyncTV视频同步和共享平台
【4月更文挑战第16天】使用Docker部署SyncTV视频同步和共享平台
30 0
|
3天前
|
API 调度 开发者
深入理解Python异步编程:从Asyncio到实战应用
在现代软件开发中,异步编程技术已成为提升应用性能和响应速度的关键策略。本文将通过实例讲解Python中的异步编程核心库Asyncio的基本概念、关键功能以及其在Web开发中的应用。我们不仅将理论与实践结合,还将展示如何通过实际代码示例解决常见的并发问题,帮助开发者更有效地利用Python进行异步编程。
|
4天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
5天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
6天前
|
测试技术 Linux 数据安全/隐私保护
【Docker项目实战】使用Docker部署Seatsurfing预订座位系统
【4月更文挑战第12天】使用Docker部署Seatsurfing预订座位系统
32 3
|
21天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。