docker部署python服务(如何在Python中使用ZeroMQ和Docker构建微服务架构)

1.如何在Python中使用ZeroMQ和Docker构建微服务架构

微服务是什么?微服务是一种架构风格,它包括多个彼此间进行通信的独立进程。

在设计上,这些进程具有高度的可扩展性、相互解耦而且一次只完成一个较小的任务。这些服务都拥有自己的资源以及通过网络实现彼此间通信的进程。

相比于靠后端的 单体结构 来封装所有服务器逻辑的传统客户端-服务器架构(C/S架构)而言,微服务架构的差异性体现在关注点分离(Separation of concern)。这种设计模式更易于维护,使得灵活性、可扩展性及容错能力更强。

但是这种分布式架构所的不足之处体现在如果设计不合理就会使得排错及维护变得复杂。一个简单微服务的例子让我们来分析这样的一个场景:你正在使用微服务模式构建一个电子商务网店。

对于一个电商网店上的常见商品,好比说iPhone,其详情页会显示:。产品的及基本信息。

你的购买历史。哪些人买了iPhone也买了手机套。

与苹果手机相关的优惠和折扣。店家的数据。

送货方式。推荐商品等等此外,这个简单的产品详情页的接口将有多个版本的来匹配web、移动端以及用于第三方应用程序的REST API。

在微服务模式中数据分布在多个服务之间。在这个例子中,服务包括:。

产品详情服务。商家服务。

支付服务。优惠及折扣服务。

库存服务。定价服务。

回顾服务。推荐服务这些独立的服务是如何被访问的呢?解决办法是使用一个API网管,它作为所有客户端的单一入口并且根据需求调用分布在整个基础架构中的特定微服务。

以上模式的行业应用案例是NetFlix API网关,它具有支持不同设备的多个API客户端。你可以点击此处 了解更多 。

构建一个简单的微服务目前有很多方法可以用于构建你的微服务。在本文中我们将使用ZeroMQ来创建两个进程之间的通信。

ZeroMQ提供了用于在套接字之上开发可扩展、分布式systed的构建块。它使用椭圆曲线密码体制(第四版)来实现安全性,并提供了即刻开启的 通讯模式 。

关于ZMQ,还有很多 优点 。MQ即是针对异步工作而设计的线程化消息队列。

谈论太多zeroMQ的内容已经超出了本文的范畴,你可以阅读 使用zeromq 以及 zeromq用于分布式系统 。我们要使用的另一个工具是 Docker 。

本文假设读者对Docker已经有了基础的了解。ZeroMQ有很多种通讯模式,为了开始我们的工作,让我们用ZeroMQ和Flask来配置一个简单的PUB-SUB。

下图展示了组件之间的关系和数据流。1&3 - 一个flask服务器运行在5000端口上而且其URL是 /downcase/ 。

该URL用来接受(GET)请求,而所有格式为的请求将收到回应:答谢字符将会转换为小写字符并返回。2 - 回应的消息也被发送给同一个容器中的ZMQ发布者(Publisher)4,5 - ZMQ订阅者(subscriber)持续监听并将来自ZMQ服务器的消息保存到名为 subscriber.log 的文件中创建服务器首先看一下我们的DockerfileFROM ubuntu:14.04RUN apt-get updateRUN apt-get install -y --force-yes python python-dev python-setuptools software-properties-common gcc python-pipRUN apt-get clean allRUN pip install pyzmqRUN pip install FlaskADD zmqserver.py /tmp/zmqserver.pyFlask PortEXPOSE 5000Zmq Sub ServerEXPOSE 4444CMD ["python","/tmp/zmqserver.py"]我们选择Ubuntu 14.04作为容器操作系统。

我们安装了基本的软件包。通过pip,我们安装pyzmq(zeromq的Python绑定)同时也安装了Flask。

接着我们导出端口5000(flask服务器)和4444(发布者运行的端口)。此外,我们复制了包含所有flask及zeromq pythond代码的脚本文件 zmqserver.py 并运行它。

现在我们来看一下zmqserver.py的内容:server.pyimport timeimport zmqHOST = '127.0.0.1'PORT = '4444'_context = zmq.Context()_publisher = _context.socket(zmq.PUB)url = 'tcp://{}:{}'.format(HOST, PORT)def publish_message(message):try:_publisher.bind(url)time.sleep(1)_publisher.send(message)except Exception as e:print "error {}".format(e)finally: _publisher.unbind(url)from flask import Flaskfrom flask import requestapp = Flask(__name__)@app.route("/downcase/", methods=['GET'])def lowerString():_strn = request.args.get('param')response = 'lower case of {} is {}'.format(_strn, _strn.lower()) publish_message(response)return responseif __name__ == '__main__':app.run(host='0.0.0.0', debug=False)ZMQ发布者运行在4444端口上。我们创建了一个context并且声明了URL。

我们运行了flask app,它通过URL /downcase/ 把GET获得的参数 Param 转换成小写字符,这就是服务的应答。应答的字符串是 published ,它作为一个消息把相同的字符串返回给浏览器。

为了构建以上的Docker映像(image),我们执行以下的命令:sudo docker build -t docker-zmq-pub 并且在该映像之上执行:docker run --name docker-pub-server -p 5000:5000 -p 4444:4444 -t docker-zmq-pub 我们把容器中的端口5000和4444映射到这台主机上,于是无论客户端在哪里,它们都可以订阅这个发布者。订阅者客户端client.pyimport zmqimport sysimport timeimport loggingimport osHOST = '127.0.0.1'PORT = '4444'logging。

docker部署python项目,docker部署python应用,PythonDocker实战

2.怎样在Python中操作Docker容器

从util-linux版本2.23开始,nsenter工具就包含在其中。

它用来访问另一个进程的名字空间。nsenter要正常工作需要有root权限。

很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤: 为了连接到容器,你还需要找到容器的第一个进程的PID。

docker inspect --format "{{ .State.Pid }}" 通过这个PID,你就可以连接到这个容器: nsenter --target $PID --mount --uts --ipc --net --pid nsinit 从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。

在安装nsinit之前,你首先需要安装Go运行时环境: apt-get install git golang-go mkdir -p $HOME/go-dev/binmkdir -p $HOME/go-dev/src echo "export GOPATH=\$HOME/go-dev" >> ~/.profileecho "PATH=\$PATH:\$GOPATH/bin" >> ~/.profile source ~/.profile 接下来才安装nsinit: mkdir -p $GOPATH/src/github.com/dotcloudcd $GOPATH/src/github.com/dotcloud git clone /dotcloud/docker.gitcd $GOPATH/src/github.com/dotcloud/docker /usr/bin/go get -v github.com/dotcloud/docker/vendor/src/github.com/docker/libcontainer/nsinit nsinit读取的是位于/var/lib/docer/execdriver/native/容器目录下的配置数据。要运行nsinit,你需要切换到容器目录下。

由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过docker的ps命令,你可以确定容器ID。

一旦你进入/var/lib/docker目录,你就可以连接容器了: nsinit exec /bin/bash lxc(-attach) 直到Docker 0.8.1版本为止,LXC一直是管理容器的基本工具,Docker一直支持这个工具。但是从0.9.0版本开始,Docker默认使用libcontainer管理容器,不再依赖LXC了。

因此默认情况下,你不能使用lxc-attach了。 如果你仍然希望使用lxc-attach,那么你需要使用-e lxc选项来重新启动Docker服务进程。

使用这个选项,Docker的内部将再次使用LXC管理容器了。完成这个任务最简单的做法就是创建/etc/default/docker文件(如果这个文件仍然不存在),并添加以下内容: DOCKER_OPTS=" -e lxc" 现在你可以重新启动Docker服务了。

要连接容器,你需要知道完整的容器ID: docker ps --no-trunc 接下来,你就可以连接这个容器了。要完成下面工作,你还需要root权限: lxc-attach -n -- /bin/bash sshd 上面所有三种方法都要求具有主机系统的root权限。

为了不采用root权限,通过ssh访问容器将是一个很好的选择。 要做到这一点,你需要构建一个支持SSH服务的基础映像。

此时,我们可能遇到这样的问题:我们是不是用Docker CMD或者ENTRYPOINT运行一条命令就可以了?如果此时有sshd进程运行,那么我们就不要再运行其他进程了。接下来的工作是创建一个脚本或者使用像supervisord这样的进程管理工具来启动其它所有需要启动的进程。

有关如何使用supervisord的 优秀的文档可以在Docker的web站点上找到。一旦你启动了具有sshd进程的容器,你就可以像以往一样通过ssh客户端了连接这个容器了。

部署,服务,docker,python

3.怎样在 Python 中操作 Docker 容器

Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。

如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。

我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器? 有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。 使用 attach 命令有时候并不方便。

当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。 nsenter 可以访问另一个进程的名字空间。

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。 PID=$(docker inspect –format “{{ .State.Pid }}” ) //将换成你的容器id 通过这个 PID,就可以连接到这个容器: $ nsenter –target $PID –mount –uts –ipc –net –pid 更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。

4.如何在Python中使用ZeroMQ和Docker构建微服务架构

微服务是什么?微服务是一种架构风格,它包括多个彼此间进行通信的独立进程。

在设计上,这些进程具有高度的可扩展性、相互解耦而且一次只完成一个较小的任务。这些服务都拥有自己的资源以及通过网络实现彼此间通信的进程。

相比于靠后端的 单体结构来封装所有服务器逻辑的传统客户端-服务器架构(C/S架构)而言,微服务架构的差异性体现在关注点分离(Separation of concern)。这种设计模式更易于维护,使得灵活性、可扩展性及容错能力更强。

但是这种分布式架构所的不足之处体现在如果设计不合理就会使得排错及维护变得复杂。一个简单微服务的例子让我们来分析这样的一个场景:你正在使用微服务模式构建一个电子商务网店。

对于一个电商网店上的常见商品,好比说iPhone,其详情页会显示:。产品的及基本信息。

你的购买历史。哪些人买了iPhone也买了手机套。

与苹果手机相关的优惠和折扣。店家的数据。

送货方式。推荐商品等等此外,这个简单的产品详情页的接口将有多个版本的来匹配web、移动端以及用于第三方应用程序的REST API。

在微服务模式中数据分布在多个服务之间。在这个例子中,服务包括:。

产品详情服务。商家服务。

支付服务。优惠及折扣服务。

库存服务。定价服务。

回顾服务。推荐服务这些独立的服务是如何被访问的呢?解决办法是使用一个API网管,它作为所有客户端的单一入口并且根据需求调用分布在整个基础架构中的特定微服务。

以上模式的行业应用案例是NetFlix API网关,它具有支持不同设备的多个API客户端。你可以点击此处 了解更多 。

构建一个简单的微服务目前有很多方法可以用于构建你的微服务。在本文中我们将使用ZeroMQ来创建两个进程之间的通信。

ZeroMQ提供了用于在套接字之上开发可扩展、分布式systed的构建块。它使用椭圆曲线密码体制(第四版)来实现安全性,并提供了即刻开启的 通讯模式 。

关于ZMQ,还有很多 优点 。MQ即是针对异步工作而设计的线程化消息队列。

谈论太多zeroMQ的内容已经超出了本文的范畴,你可以阅读 使用zeromq 以及 zeromq用于分布式系统 。我们要使用的另一个工具是 Docker 。

本文假设读者对Docker已经有了基础的了解。ZeroMQ有很多种通讯模式,为了开始我们的工作,让我们用ZeroMQ和Flask来配置一个简单的PUB-SUB。

下图展示了组件之间的关系和数据流。1&3 - 一个flask服务器运行在5000端口上而且其URL是 /downcase/ 。

该URL用来接受(GET)请求,而所有格式为的请求将收到回应:答谢字符将会转换为小写字符并返回。2 - 回应的消息也被发送给同一个容器中的ZMQ发布者(Publisher)4,5 - ZMQ订阅者(subscriber)持续监听并将来自ZMQ服务器的消息保存到名为 subscriber.log 的文件中创建服务器首先看一下我们的DockerfileFROM ubuntu:14.04RUN apt-get updateRUN apt-get install -y --force-yes python python-dev python-setuptools software-properties-common gcc python-pipRUN apt-get clean allRUN pip install pyzmqRUN pip install FlaskADD zmqserver.py /tmp/zmqserver.pyFlask PortEXPOSE 5000Zmq Sub ServerEXPOSE 4444CMD ["python","/tmp/zmqserver.py"]我们选择Ubuntu 14.04作为容器操作系统。

我们安装了基本的软件包。通过pip,我们安装pyzmq(zeromq的Python绑定)同时也安装了Flask。

接着我们导出端口5000(flask服务器)和4444(发布者运行的端口)。此外,我们复制了包含所有flask及zeromq pythond代码的脚本文件 zmqserver.py 并运行它。

现在我们来看一下zmqserver.py的内容:server.pyimport timeimport zmqHOST = '127.0.0.1'PORT = '4444'_context = zmq.Context()_publisher = _context.socket(zmq.PUB)url = 'tcp://{}:{}'.format(HOST, PORT)def publish_message(message):try:_publisher.bind(url)time.sleep(1)_publisher.send(message)except Exception as e:print "error {}".format(e)finally: _publisher.unbind(url)from flask import Flaskfrom flask import requestapp = Flask(__name__)@app.route("/downcase/", methods=['GET'])def lowerString():_strn = request.args.get('param')response = 'lower case of {} is {}'.format(_strn, _strn.lower()) publish_message(response)return responseif __name__ == '__main__':app.run(host='0.0.0.0', debug=False)ZMQ发布者运行在4444端口上。我们创建了一个context并且声明了URL。

我们运行了flask app,它通过URL /downcase/ 把GET获得的参数 Param 转换成小写字符,这就是服务的应答。应答的字符串是 published ,它作为一个消息把相同的字符串返回给浏览器。

为了构建以上的Docker映像(image),我们执行以下的命令:sudo docker build -t docker-zmq-pub 并且在该映像之上执行:docker run --name docker-pub-server -p 5000:5000 -p 4444:4444 -t docker-zmq-pub。

5.如何开发一个基于 Docker 的 Python 应用

python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写。python在生物信息、统计、网页制作、计算等多个领域都体现出了强大的功能。python和其他脚本语言如java、R、Perl 一样,都可以直接在命令行里运行脚本程序。工具/原料

python;CMD命令行;windows操作系统

方法/步骤

1、首先下载安装python,建议安装2.7版本以上,3.0版本以下,由于3.0版本以上不向下兼容,体验较差。

2、打开文本编辑器,推荐editplus,notepad等,将文件保存成 .py格式,editplus和notepad支持识别python语法。

脚本第一行一定要写上 #!usr/bin/python

表示该脚本文件是可执行python脚本

如果python目录不在usr/bin目录下,则替换成当前python执行程序的目录。

3、编写完脚本之后注意调试、可以直接用editplus调试。调试方法可自行百度。脚本写完之后,打开CMD命令行,前提是python 已经被加入到环境变量中,如果没有加入到环境变量,请百度

4、在CMD命令行中,输入 “python” + “空格”,即 ”python “;将已经写好的脚本文件拖拽到当前光标位置,然后敲回车运行即可。

docker部署python服务

转载请注明出处编程代码网 » docker部署python服务(如何在Python中使用ZeroMQ和Docker构建微服务架构)

资讯

python编译成dll(python有没有办法能够编译成DLL文件呢?)

阅读(14)

本文主要为您介绍python编译成dll,内容包括python程序怎么编译成dll,python程序怎么编译成dll,python有没有办法能够编译成DLL文件。我在工作中就是用python些程序,再用c\c++封装掉 给同事调用的具体的做法是1. python 程序用 py2exe 打包(

资讯

pythonisselected(python出现这个错误是什么原因)

阅读(13)

本文主要为您介绍pythonisselected,内容包括该怎么办,python/django/html:如何输出selected,python出现这个错误是什么原因。要把代码发现来才知道,以下是常见的错误 下面终于要讲到当你用到更多的Python的功能(数据类型,函数,模块,类等等)时可能

资讯

pythonreadhdf5(好玩的电脑小代码)

阅读(12)

本文主要为您介绍pythonreadhdf5,内容包括好玩的电脑小代码,怎么安装hdf5package在python里,python中输入content=urllib.urlopen(url).read(),按F5运行后没有输。#coding=utf-8#表情识别import cv2from keras.models import load_modelimp

资讯

pythonrequests解析(pythonrequests库怎么解析响应)

阅读(14)

本文主要为您介绍pythonrequests解析,内容包括pythonrequests库怎么解析响应,python怎么解析requests.session.get,python:Request的函数是什么作用。Requests 是使用 Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为人类着想

资讯

pythondecode参数(python的instr.decode在哪个库)

阅读(11)

本文主要为您介绍pythondecode参数,内容包括python怎么使用decode,python怎么使用decode,pythondecode中文编码。问题: Dim SearchString, SearchChar, MyPos SearchString ="XXpXXpXXPXXP"

资讯

pythontelnet爆破(如何实现python和telnet通信)

阅读(16)

本文主要为您介绍pythontelnet爆破,内容包括如何实现python和telnet通信,怎样写python脚本控制telnet,python求大神帮助,如何判断是否telnet成功。Windows下开启Telnet服务(详见:与Win7防火墙无缝结合 Telnet功能测试)Windows 2000/XP/2003/V

资讯

python字符串嵌套(python列表的嵌套该怎么理解)

阅读(10)

本文主要为您介绍python字符串嵌套,内容包括python列表的嵌套该怎么理解,求助python嵌套字典字符串格式化,python用字符串拼接一条语句,然后怎么执行。不对…这里[row[i] for row in matrix] for i in range(4)是一个整体,不然row[i] for

资讯

python发邮件中文(python发送邮件,附件中文命名,怎么破)

阅读(11)

本文主要为您介绍python发邮件中文,内容包括python发送邮件,附件中文命名,怎么破,python发送邮件,附件中文命名,怎么破,如何用python发送email。不知道你是不是用的smtp来发的,我的发中文的附件没问题 #coding=utf-8Created on 2014-11-03@a

资讯

python加密狗(python中如何设计一个密码加密器)

阅读(11)

本文主要为您介绍python加密狗,内容包括学了python能破解加密狗吗?,python中如何设计一个密码加密器,Python有什么模块来加密。你好,我自己设计了一个小小的加密器玩。你可以参考一下。这是带有界面的。其中的算法你可以改掉。我是用来把密

资讯

python编译成dll(python有没有办法能够编译成DLL文件呢?)

阅读(14)

本文主要为您介绍python编译成dll,内容包括python程序怎么编译成dll,python程序怎么编译成dll,python有没有办法能够编译成DLL文件。我在工作中就是用python些程序,再用c\c++封装掉 给同事调用的具体的做法是1. python 程序用 py2exe 打包(

资讯

pythonisselected(python出现这个错误是什么原因)

阅读(13)

本文主要为您介绍pythonisselected,内容包括该怎么办,python/django/html:如何输出selected,python出现这个错误是什么原因。要把代码发现来才知道,以下是常见的错误 下面终于要讲到当你用到更多的Python的功能(数据类型,函数,模块,类等等)时可能

资讯

pythonreadhdf5(好玩的电脑小代码)

阅读(12)

本文主要为您介绍pythonreadhdf5,内容包括好玩的电脑小代码,怎么安装hdf5package在python里,python中输入content=urllib.urlopen(url).read(),按F5运行后没有输。#coding=utf-8#表情识别import cv2from keras.models import load_modelimp

资讯

pythonrequests解析(pythonrequests库怎么解析响应)

阅读(14)

本文主要为您介绍pythonrequests解析,内容包括pythonrequests库怎么解析响应,python怎么解析requests.session.get,python:Request的函数是什么作用。Requests 是使用 Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为人类着想

资讯

pythonnumpy函数库(pythonnumpy有什么用)

阅读(10)

本文主要为您介绍pythonnumpy函数库,内容包括python有numpy函数库么,python有numpy函数库么,python中numpy内容。NumPy is the fundamental package for scientific computing with Pytho