问题:

Python Docker 镜像的种类比较多,以3.6.15版本为例就有10个选择。那具体应该如何选?

版本区别:

通过python Tags | Docker Hub查看信息,整理后如下表(以linux/386系统为例):

TAG OS/ARCH COMPRESSED SIZE
python:3.6.15-slim-buster linux/386 40.89 MB
python:3.6.15-slim-bullseye linux/386 43.67 MB
python:3.6.15-slim linux/386 43.67 MB
python:3.6.15-buster linux/386 329.45 MB
python:3.6.15-bullseye linux/386 333.86 MB
python:3.6.15 linux/386 333.86 MB
python:3.6.15-alpine3.15 linux/386 14.94 MB
python:3.6.15-alpine linux/386 14.94 MB
python:3.6.15-alpine3.14 linux/386 14.97 MB
python:3.6.15-alpine3.13 linux/386 14.96 MB

根据这些镜像,可以分为四类:

  • slim瘦身版:python:3.6.15-slim-buster、python:3.6.15-slim-bullseye、python:3.6.15-slim
  • Debian系列: python:3.6.15-buster、python:3.6.15-bullseye
  • alpine系列: python:3.6.15-alpine3.15、python:3.6.15-alpine、python:3.6.15-alpine3.14、python:3.6.15-alpine3.13
  • Default默认:python:3.6.15

具体区别如下:

  1. slim:是完整镜像的配对版本,它与默认镜像拥有一样的系统和包管理工具,但省略许多不常用的依赖,故而它变得很小。但这意味着需要一些不常用的依赖时,需要自己安装。
  2. Debian:bullseyebuster此类镜像使用Debian作为系统,包含了所有 CPython 所需要的依赖。如果需要指定使用 Debian buster 而不是未来可能会变化的 Debian letest stable 时,可以使用它。甚至又有些更久远的stretchjessie系统版本为基础,具体代表的系统版本号如下:
    • bullseye:基于 Debian 11
    • buster:基于 Debian 10
    • stretch:基于 Debian 9
    • jessie:基于 Debian 8
  3. alpine:alpine包含了在 Linux 上运行 Python 所需要的最小环境,它使用 Alpine 作为系统,alpine后面的数字代表着系统的版本。因为它最小,所以只能直接运行纯 Python 代码。任何需要编译 C 代码或动态链接库的 Python 仓库都不能直接使用,需要自己安装依赖。故而此镜像需要更多的时间去调配系统依赖,并且如果不懂如何在使用后删除那些可删除的系统依赖,使用它构建的最终镜像依旧不会很小。
    注意: 在使用这个镜像时,一定要进行测试!如果遇到无法解释的错误,请尝试切换到其他镜像,看看是否能够解决问题。
  4. Default:由镜像大小可以知道,使用Debianbullseye做为默认镜像基础系统。

备注: 有些版本的镜像会有windowsservercoreWindows Server Core系统为镜像基础系统的。如果该镜像是运行在Windows系统的,可以考虑使用。

如何选择

由于同一台机器上的 Docker Image 是可以共享的。要快速启动并运行项目,没有空间限制,并且没有时间进行太多测试。而且有许多 Python 项目需要跑在同一台机器上时,default 或 buster 是最好的选择。不需要为每个项目安装大量各自专属的依赖,这能减少大量的磁盘空间。要快速启动并运行项目,没有空间限制,并且没有时间进行太多测试,那么就使用实际的标准镜像。

如果愿意花时间去调试依赖并且对镜像大小有追求时,slim 和 alpine 都是好的选择。但如果不是追求极致的小——大量使用 C 扩展的项目也无法追求极致的小,那么 slim 会比 alpine 更快的完成工作。

使用 alpine 在仅使用了纯 Python 代码或少量的使用了 C 扩展的项目,它能让构建的镜像保持最小的状态。