序言

最近在关注Python的Docker基础镜像, 看到了一些tag, 比如3.8.0a4-stretch, 3.7.3-alpine3.8, 2.7.16-slim-jessie, 就想着搞清楚这写tag中的字符串 代表的含义, 因为除了3.7, 3.8, 2.7这种Python版本我认识之外, 后面的字符串就 完全不认识了.

发行版

其实在版本号后面跟着的字符串表示的是这个镜像所基于的发行版:

比如:

  1. stretchjessie代表使用的是Debian 前者表示Debian 9, 后者表示Debian 8
  2. alpine代表的是另一种Linux发行版.
  3. slim-jessie是使用docker-slim瘦身后的jessie镜像

几种基础镜像

主流发行版的镜像

主流的一些发行版就是类似于Debian, Ubuntu, Centos这种, 这些镜像 中规中矩, 但就是有点大, 动辄几百M.

Alpine

alpine linux是linux发行版的一种, 使用musl libcBusyBox构建. 这种镜像虽然只有5MB大小, 但是也有自己的包管理系统, 比一些基于busybox的基础镜像 要更加完善, 也使得Alpine适合于做基础镜像, 甚至用于生产环境的应用.

当你想创建最小的镜像时, 使用alpine是一个非常好的选择. 有一点你必须要重视, alpine使用的是musl libc, 而不是glibc, 一些特定的软件由于对libc的依赖太深 有可能无法运行. 不过大部分软件是没有这个问题的.

docker-slim精简后的基础镜像

docker-slim中, 给出了一张图片, docker-slim将400多MB的ubuntu镜像 压缩到了14MB, 压缩率奇高. 关键它还是无损压缩.

镜像的官网中给出了一点建议, 这个镜像不包含一些公共的包, 只包含了一些能让Python运行起来的包(最少), 除非你只用镜像中的Python或是 有磁盘空间限制, 否则还是推荐你使用缺省的镜像.

我查看了几个工具后, 发现由Docker官方维护的一些镜像比如Python, Node, OpenJDK, PHP中, 大量使用了slim-stretch或是slim-jessie, 不知道 为何会官方团队如此偏爱Debian.

基础镜像的选择问题

有位大佬调查了各种Python基础镜像使用率:

从上图来看, alpine的占用率是最高的, 比其他几种加起来还要多, 可能空间占用率低真的很诱人吧.

个人角度

  1. 如果一个项目已经使用了Docker, 并且依赖于基础镜像, 那么还是保持现状比较好

  2. 新的项目, 我觉得考虑一下alpine也是可以的, 你可以按需安装软件, 可以用最少的 依赖让项目跑起来, 而且如果你去Docker hub上翻看基础镜像, 几乎每个基础镜像 下面的tag都会有几个是用alpine构建的.

  3. 编译型语言Golang就用alpine, 镜像体积能保持很小, 真的清爽(K8s 好多镜像甚至都直接用scratch, 这种镜像是给所有人用的, 所以会考虑压缩体积). 其实我觉得这个语言本身设计就是为了跑在不同的发行版上, 使用Docker的时候只是为了隔离宿主机环境, 使用alpine也是合适的.

  4. Python的话, 用普通debian就行了, slim什么没必要, 因为你总会装很多包, 有的还要gcc编译, 镜像的体积根本小不了

平时工作不用 C++/Java, 要是给我的话, 估计它两都是分步构建+debian 做基础镜像. 既然使用了分步构建, 那么每个镜像差别不会很大, 真正 pull 的层也不多. 另外的话从开发者心理上讲 debian 稳一点, 更接近普通 Linux 环境.

参考文档

Docker hub Python官方镜像 Docker hub Golang官方镜像 Docker hub Node官方镜像