Skip to main content

镜像的构建与保存

安装好 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