14.3 Python

Python是一种解释型的动态语言,面向对象设计,功能十分强大。它集成了模块(modules)、异常处理(exceptions)、动态类型(dynamic typing)、高级数据结构(元组、列表、序列)、类(classes)等高级特性。Python设计精良,语法简约,表达能力很强。目前,所有主流操作系统(Windows、所有Linux、类Unix系统)都支持Python。

14.3 Python - 图1

下面,笔者将带领大家使用Docker部署Python环境,以及部署Python技术栈中的主流框架。

14.3.1 使用官方的Python镜像

推荐用户使用Docker官方提供的Python镜像作为基础镜像。

首先,新建项目目录py-official,进入此目录,新建一个Dockerfile文件,内容如下:


  1. FROM python:3-onbuild
  2. CMD [ "python3.5", "./py3-sample.py" ]

新建py3-sample.py文件,计算Fibonacci数列:


  1. def fib(n):
  2. a, b = 0, 1
  3. while a < n:
  4. print(a, end=' ')
  5. a, b = b, a+b
  6. print()
  7. fib(1000)

新建requirements.txt依赖文件,读者可以在此文件中加入项目依赖程序,如Django等。此处仅新建空文件。


  1. $ touch requirements.txt

第二步,使用docker build命令构建名为py2.7-sample-app的镜像:


  1. $ docker build -t py3-image .

第三步,通过docker run命令创建并运行容器:


  1. $ docker run -it --rm --name py3-container py3-image
  2. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

如果读者只需要运行单个Python脚本,那么无需使用Dockerfile构建自定义镜像,而是通过以下命令直接使用官方Python镜像,带参数运行容器:


  1. $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w
  2. /usr/src/myapp python:3 python your-daemon-or-script.py

14.3.2 使用PyPy

PyPy是一个Python实现的Python解释器和即时编译(JIT)工具,它专注与速度、效率,以及和CPython完全的兼容性。PyPy通过JIT技术可以使得Python运行速度提高近十倍,同时保证兼容性。

14.3 Python - 图2

首先,设置项目目录,并新建hi.py实例程序:


  1. for animal in ["dog", "cat", "mouse"]:
  2. print "%s is a mammal" % animal

然后,在根目录新建Dockerfile,基于pypy3的onbuild版本镜像:


  1. FROM pypy:3-onbuild
  2. CMD [ "pypy3", "./hi.py" ]

如果用户需要使用pypy2,则可以使用:FROM pypy:2-onbuild。

onbuild版本的镜像内含若干onbuild触发器,它们可以再镜像构建期间完成一些必要的初始化操作,便于项目的直接运行。pypy的onbuild镜像会拷贝一个requirements.txt依赖文件,运行RUN pip install安装依赖程序,然后将当前目录拷贝至/usr/src/app。

下面,用户开始构建和运行此镜像:


  1. $ docker build -t my-python-app .
  2. $ docker run -it --rm --name my-running-app my-python-app

如果用户只需要运行单个pypy脚本,并希望避免新建Dockerfile,那么用户可以直接使用以下指令:


  1. $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w
  2. /usr/src/myapp pypy:3 pypy3 your-daemon-or-script.py

如果需要使用pypy2运行,则可以使用如下指令:


  1. $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w
  2. /usr/src/myapp pypy:2 pypy your-daemon-or-script.py