[docker]Docker 安装 Python
要在 Docker 中搭建一个 Python 3.5 环境,其实并不复杂,主要就是两种思路:直接从官方仓库拉取现成镜像,或者自己动手通过 Dockerfile 构建。下面分别拆开来看,每一步都带命令和说明,上手非常快。 方法一、docker pull python:3.5 先看看 Docker Hu
要在 Docker 中搭建一个 Python 3.5 环境,其实并不复杂,主要就是两种思路:直接从官方仓库拉取现成镜像,或者自己动手通过 Dockerfile 构建。下面分别拆开来看,每一步都带命令和说明,上手非常快。
方法一、docker pull python:3.5
先看看 Docker Hub 上有什么现成的 Python 镜像。打开官方仓库就能看到所有可选的版本标签——默认是 python:latest,也就是最新版。如果目标明确想要 3.5,可以通过 Sort by 筛选,或者直接在命令行里搜索:
runoob@runoob:~/python$ docker search python NAME DESCRIPTION STARS OFFICIAL AUTOMATED python Python is an interpreted,... 982 [OK] kaggle/python Docker image for Python... 33 [OK] ...
确认之后,直接拉取带有 3.5 标签的官方镜像:
runoob@runoob:~/python$ docker pull python:3.5
下载完成,本地镜像列表里就能看到 Reposity 为 python、Tag 为 3.5 的镜像了:
runoob@runoob:~/python$ docker images python:3.5 REPOSITORY TAG IMAGE ID CREATED SIZE python 3.5 045767ddf24a 9 days ago 684.1 MB
方法二、通过 Dockerfile 构建
如果希望更精细化地控制底层依赖,或者无法直接访问 Docker Hub,那就自己写一个 Dockerfile 来构建镜像。先创建一个项目目录:
runoob@runoob:~$ mkdir -p ~/python ~/python/myapp
myapp 目录后面会挂载到容器内部作为应用目录。进入 ~/python 目录,创建一个 Dockerfile,内容如下(这里以 Python 3.5.1 为例,依赖 buildpack-deps:jessie 基础镜像):
FROM buildpack-deps:jessie # remove several traces of debian python RUN apt-get purge -y python.* # http://bugs.python.org/issue19846 # > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK. ENV LANG C.UTF-8 # gpg: key F73C700D: public key "Larry Hastings" imported ENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700D ENV PYTHON_VERSION 3.5.1 # if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value ' '" ENV PYTHON_PIP_VERSION 8.1.2 RUN set -ex \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \ && gpg --batch --verify python.tar.xz.asc python.tar.xz \ && rm -r "$GNUPGHOME" python.tar.xz.asc \ && mkdir -p /usr/src/python \ && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \ && rm python.tar.xz \ && cd /usr/src/python \ && ./configure --enable-shared --enable-unicode=ucs4 \ && make -j$(nproc) \ && make install \ && ldconfig \ && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION \ && find /usr/local -depth \ \( \( -type d -a -name test -o -name tests \) \ -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \) \ -exec rm -rf '{}' + \ && rm -rf /usr/src/python ~/.cache # make some useful symlinks that are expected to exist RUN cd /usr/local/bin \ && ln -s easy_install-3.5 easy_install \ && ln -s idle3 idle \ && ln -s pydoc3 pydoc \ && ln -s python3 python \ && ln -s python3-config python-config CMD ["python3"]
有了 Dockerfile,就可以用 build 命令构建出镜像了(注意最后的 . 代表当前目录):
runoob@runoob:~/python$ docker build -t python:3.5 .
构建完成后,再次查看本地镜像列表,确认新镜像已经生成:
runoob@runoob:~/python$ docker images python:3.5 REPOSITORY TAG IMAGE ID CREATED SIZE python 3.5 045767ddf24a 9 days ago 684.1 MB
使用 python 镜像
镜像准备好了,接下来就用它来跑一个简单的 Python 程序。在 ~/python/myapp 目录下创建 helloworld.py:
#!/usr/bin/python
print("Hello, World!");
然后通过 docker run 启动容器,关键点在于挂载本地目录和指定工作目录:
runoob@runoob:~/python$ docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py
这条命令里的几个参数说明一下:
-v $PWD/myapp:/usr/src/myapp:把宿主机当前目录下的myapp挂载到容器的/usr/src/myapp下。-w /usr/src/myapp:指定容器的工作目录为/usr/src/myapp。python helloworld.py:容器内的 Python 命令执行工作目录中的脚本。
执行后,终端就会输出:
Hello, World!
至此,两种获取 Python 3.5 镜像以及运行容器的方法都跑通了。实际工作中,官方仓库的镜像通常足够用,但如果需要定制化底层依赖,自己写 Dockerfile 反而更可控。选择哪种,看具体需求就好。

































