镜像的构建与保存
安装好 Docker 之后,就是拉取或者构建一个镜像(image),然后就可以从这个镜像创建容器,进入容器之后,就可以折腾自己的环境。
镜像的搜索
在安装镜像之前,可以先搜索一下,看看是不是官方的镜,例如docker search python
,并注意查看是否有官方的标记(通常显示为 "OFFICIAL" 旁边的 "OK")。
当然,也可以直接去镜像的官网,例如想查找 Python 相关镜像就可以在这里查询
也可以查找指定版本的 Python
镜像的构建
构建,指的就是创建一个镜像,主要就是把一个已经制作好,环境配置好的镜像,构建到你的机器上
一般有两种方法创建镜像,一种是使用标准化的 Dockerfile 文件,好处就是所有的环境相关的依赖一次性全部写在 Dockerfile 里面,安装后开箱即用。
从Dockerfile
比如下面就是一个创建一个 Python 版本是 3.6.8,安装了 xbg 和 jupyter 的镜像
只需要创建一个名为 Dockerfile
的文件如下
# 使用官方 Python 3.6.8 镜像
FROM python:3.6.8-alpine3.10
# 设置工作目录
WORKDIR /app
# 更换为更快的阿里云 Alpine 镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装编译依赖和数学库
RUN apk update && apk add --no-cache \
openblas-dev \
gfortran \
build-base \
cmake \
libffi-dev \
libstdc++ \
musl-dev \
linux-headers \
bash
# 升级 pip
RUN pip install --upgrade pip setuptools wheel
# 安装依赖
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
pandas==1.1.5 \
numpy==1.19.5 \
scikit-learn==0.19.2 \
xgboost==1.4.1 \
jupyter
# 设置一个命令提示符,允许用户交互
CMD ["/bin/bash"]
然后在命令行执行docker build -t py36 .
即可构建这个镜像,执行完毕之后,可以执行docker run -it py36 /bin/sh
进入容器后进行操作
如果过于复杂的环境依赖配置,也可以使用多个 dockerfile 文件来构建,比如也可以先创建一个基础镜像,安装好所有依赖,命名为Dockerfile.base
:
# 创建基础镜像
FROM python:3.6.8-alpine3.10 as base
# 设置工作目录
WORKDIR /app
# 更换为更快的阿里云 Alpine 镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装编译依赖和数学库
RUN apk update && apk add --no-cache \
openblas-dev \
gfortran \
build-base \
cmake \
libffi-dev \
libstdc++ \
musl-dev \
linux-headers \
bash
# 升级 pip 和安装 setuptools
RUN pip install --upgrade pip setuptools wheel
然后构建基础镜像:
docker build -t py36-base -f Dockerfile.base .
再创建应用镜像的 Dockerfile 文件,命名为 Dockerfile.app:
# 使用基础镜像
FROM py36-base
# 设置工作目录
WORKDIR /app
# 安装 Python 库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
pandas==1.1.5 \
numpy==1.19.5 \
scikit-learn==0.19.2 \
xgboost==1.4.1 \
jupyter
# 设置一个命令提示符,允许用户交互
CMD ["/bin/bash"]
再构建应用镜像:
docker build -t py36 -f Dockerfile.app .
之后就可以从这个镜像创建容器并运行
docker run -it --name mypython py36 /bin/bash
这样通过将基础镜像和应用镜像的 Dockerfile 分开,可以有效地减少每次构建时重复安装依赖的时间。
从基础镜像手动安装
如果还是觉得从 Dockerfile 创建镜像麻烦,也可以先拉取最基础的镜像,然后手动安装相关依赖,然后再打包、存储。
下面同样介绍如何不基于 Dockerfile 实现构建和上面同样环境的镜像。
首先就直接拉一个官方的 python3.6.8 的镜像
docker build -t python:3.6.8-alpine3.10 .
然后进入这个镜像,手动安装 xgboost 和其他所需的库:
pip install xgboost==1.4.1 jupyter
在安装完所有你需要的依赖和包名之后,就可以将这个容器保存为一个镜像
镜像的保存
退出容器后,将该容器提交为一个新镜像:
docker commit mypython python:3.6.8-xgboost
使用 docker save
命令将新镜像保存为本地文件:
docker save -o python_3.6.8_xgboost.tar python:3.6.8-xgboost
以后你可以通过以下命令从本地文件加载镜像:
docker load -i python_3.6.8_xgboost.tar
然后就可以运行这个镜像了
docker run -it python:3.6.8-xgboost /bin/sh