IPython Notebook 应用构建

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

目标:用 Docker 的方式搭建一个 IPython Notebook 应用

前言

Python 家族成员繁多,能够解决五花八门的业务需求。这里将通过 Python 明星项目 IPython Notebook,使其容器化,让大家掌握基础的 Docker 使用方法。

IPython Notebook 目前已经成为用 Python 做教学、计算、科研的一个重要工具。

Docker 化应用的关键元素

  • 镜像是 Docker 应用的静态表示,是应用的交付件,镜像中包含了应用运行所需的所有依赖,包括应用代码、应用依赖库、应用运行时和操作系统。
  • Dockerfile 是一个描述文件,描述了产生 Docker 镜像的过程,详细文档可以参见官方文档 Dockerfile reference
  • 容器是镜像运行时的动态表示,如果把镜像想象为一个 Class 那么容器就是这个 Class 的一个实例。

编写 Dockerfile

一个应用 Docker 化的第一步就是通过 Dockerfile 产生应用镜像。
构建本例中的 Dockerfile 完整代码如下

FROM python:3.6

RUN mkdir -p /app
WORKDIR /app

ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple --trusted-host=pypi.douban.com


EXPOSE 8888
CMD ["jupyter","notebook","--no-browser","--allow-root"]

Dockerfile文件说明

FROM python:3.6

选择 Python 3.6 版本为我们依赖的系统镜像。

RUN mkdir -p /app
WORKDIR /app

ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple --trusted-host=pypi.douban.com

向镜像中添加文件并安装依赖。

ADD 与 COPY 的区别
总体来说 ADD 和 COPY 都是添加文件的操作,其中 ADD 比 COPY 功能更多,ADD 允许后面的参数为 URL,还有 ADD 添加的文件为压缩包的话,它将自动解压。

注意:在编写 Dockerfile 时尽量将安装依赖的过程提前以提高镜像层的复用率。

EXPOSE 8888
CMD ["jupyter","notebook","--no-browser","--allow-root"]

启动应用进程。
通过 EXPOSE 指定该镜像需要公开的端口。
通过 ENTRYPOINT 制定镜像启动时的入口。

CMD 指定了容器启动时的命令 在 CMD 上仅需要指定参数;另外在我们需要自定义 CMD 时不容易出错。

添加依赖文件(requirements.txt)

安装 IPython 以及所需的依赖

# pip requirements  
ipython[all]  

我们将 IPython 所需的依赖写成一个文件,并通过 Dockerfile 中的 ADD requirements.txt,将 requirements.txt 放入镜像 ,之后在通过 Dockerfile 中的 RUN pip install -r requirements.txt 进行依赖的安装。

启动容器

有了 Dockerfile 以后,我们可以借助 PaaS 平台构建 Python 应用镜像,具体过程请看教程

或者可以在Docker环境中运行下面的命令构建 Python 应用镜像:

通过指令建立镜像,命名为 ipython-notebook:1.0.0

docker build -t registry.cosmoplat.com/test/ipython-notebook:1.0.0

通过以下指令启动容器

docker run -d -p 8888:8888  registry.cosmoplat.com/test/ipython-notebook:1.0.0  

注意:我们将初始登录密码以环境变量的形式传入容器并告知应用。

打开浏览器,访问 http://127.0.0.1:8888 端口,就可以看到 IPython Notebook 了。