Giter Site home page Giter Site logo

python-ipython-notebook's Introduction

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

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

本项目代码维护在 DaoCloud/python-ipython-notebook 项目中。

您可以在 GitHub 找到本项目并获取本文中所提到的所有代码文件。

前言

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

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

Docker 化应用的关键元素

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

一个应用 Docker 化的第一步就是通过 Dockerfile 产生应用镜像。

编写 Dockerfile

  • 选择 Python 2.7 版本为我们依赖的系统镜像。
FROM python:2.7

因所有官方镜像均位于境外服务器,为了确保所有示例能正常运行,可以使用与官方镜像保持同步的 DaoCloud 境内镜像:FROM daocloud.io/python:2.7

也推荐通过 DaoCloud Toolbox 极速下载官方镜像!

  • 设置镜像的维护者,相当于镜像的作者或发行方。
MAINTAINER Captain Dao <[email protected]>
  • 向镜像中添加文件并安装依赖。
RUN mkdir -p /app
WORKDIR /app

ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ADD 与 COPY 的区别

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

使用 RUN 命令调用 pip 包管理器安装 App 的依赖包

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

设置 docker-entrypoint.sh 文件的执行权限

在 Dockerfile 中设置文件权限,可以保证其在每次制作完成的镜像里的权限都是正确的。

  • 启动应用进程
EXPOSE 8888
ENTRYPOINT ["docker-entrypoint.sh"]
CMD [""]

通过 EXPOSE 指定该镜像需要公开的端口。

ENTRYPOINTCMD 的区别

ENTRYPOINT 指定了该镜像启动时的入口,CMD 则指定了容器启动时的命令,当两者共用时,完整的启动命令像是 ENTRYPOINT + CMD 这样。使用 ENTRYPOINT 的好处是在我们启动镜像就像是启动了一个可执行程序,在 CMD 上仅需要指定参数;另外在我们需要自定义 CMD 时不容易出错。

制作启动脚本(docker-entrypoint.sh)

#!/bin/bash
# Strict mode
set -euo pipefail

# Create the hash to pass to the IPython notebook, but don't export it so it doesn't appear
# as an environment variable within IPython kernels themselves
HASH=$(python -c "from IPython.lib import passwd; print(passwd('${PASSWORD:-admin}'))")

echo "========================================================================"
echo "You can now connect to this Ipython Notebook server using, for example:"
echo ""
echo "  docker run -d -p <your-port>:8888 -e password=<your-password> ipython/noetebook"
echo ""
echo "  use password: ${PASSWORD:-admin} to login"
echo ""
echo "========================================================================"

unset PASSWORD

ipython notebook --no-browser --port 8888 --ip=* --NotebookApp.password="$HASH"

一般我们会将初始化应用的过程编写成一个启动脚本,在脚本里以环境变量或命令行参数的形式获取应用初始化所必须的信息,然后配置并启动应用。

启动容器

有了 Dockerfile 以后,我们可以运行下面的命令构建 Python 应用镜像并命名为 ipython/notebook

  • 通过指令建立镜像
docker build -t ipython/notebook .
  • 通过以下指令启动容器
docker run -d -p 8888:8888 -e PASSWORD=admin ipython/notebook 

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

打开游览器,访问 8888 端口,就可以看到 IPython Notebook 了。

ipython login

python-ipython-notebook's People

Contributors

allencloud avatar dnc1994 avatar golfenguo avatar realityone avatar vizv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-ipython-notebook's Issues

自动构建的话,能否把requirement.txt加入到镜像中

之前开了一个Dockerfile构建库在github上,里面除了Dockerfile还有一个我需要ADD 一个自己修改的文件然后进行编译

可我发现无论是用ADD (https://hub.docker.com/r/zealseeker/rdkit-draw/builds/b33rd4kh6agyjzrqalpo3he/)
还是用COPY (https://hub.docker.com/r/zealseeker/rdkit-draw/builds/b33rd4kh6agyjzrqalpo3he/)
尽管最终都编译成功,但是打开发现,源文件中并没有覆盖我需要修改的文件。
最终我只能通过wget的方法获取文件(https://github.com/zealseeker/rdkit-draw/blob/master/Dockerfile#L7)

所以想问, 这是docker hub的问题还是我的问题?如果是docker hub的问题,daocloud是否可以自动构建,添加开源库内的文件呢?

exec: "docker-entrypoint.sh": executable file not found in $PATH

[root@localhost ipython]# docker run -d -p 8888:8888 -e PASSWORD=admin ipython/notebook
adbbeb6e84458cd41e2a4e1135c7902e0908084ded53d7263dae7115484c2e71
Error response from daemon: Cannot start container adbbeb6e84458cd41e2a4e1135c7902e0908084ded53d7263dae7115484c2e71: [8] System error: exec: "docker-entrypoint.sh": executable file not found in $PATH
[root@localhost ipython]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
ipython/notebook                        latest              0c93b73f9c32        About a minute ago   781.6 MB

run时候出错,请问如何解决? ps,镜像真大啊!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.