Docker基础镜像tag含义及选择
序言
最近在关注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版本我认识之外, 后面的字符串就
完全不认识了.
发行版
其实在版本号后面跟着的字符串表示的是这个镜像所基于的发行版:
比如:
stretch
与jessie
代表使用的是Debian
前者表示Debian 9
, 后者表示Debian 8
alpine
代表的是另一种Linux发行版.slim-jessie
是使用docker-slim瘦身后的jessie
镜像
几种基础镜像
主流发行版的镜像
主流的一些发行版就是类似于Debian
, Ubuntu
, Centos
这种, 这些镜像
中规中矩, 但就是有点大, 动辄几百M.
Alpine
alpine linux是linux发行版的一种, 使用musl libc与BusyBox构建. 这种镜像虽然只有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的占用率是最高的, 比其他几种加起来还要多, 可能空间占用率低真的很诱人吧.
个人角度
如果一个项目已经使用了Docker, 并且依赖于基础镜像, 那么还是保持现状比较好
新的项目, 我觉得考虑一下alpine也是可以的, 你可以按需安装软件, 可以用最少的 依赖让项目跑起来, 而且如果你去Docker hub上翻看基础镜像, 几乎每个基础镜像 下面的tag都会有几个是用alpine构建的.
编译型语言Golang就用alpine, 镜像体积能保持很小, 真的清爽(K8s 好多镜像甚至都直接用scratch, 这种镜像是给所有人用的, 所以会考虑压缩体积). 其实我觉得这个语言本身设计就是为了跑在不同的发行版上, 使用Docker的时候只是为了隔离宿主机环境, 使用alpine也是合适的.
Python的话, 用普通debian就行了, slim什么没必要, 因为你总会装很多包, 有的还要gcc编译, 镜像的体积根本小不了
平时工作不用 C++/Java, 要是给我的话, 估计它两都是分步构建+debian 做基础镜像. 既然使用了分步构建, 那么每个镜像差别不会很大, 真正 pull 的层也不多. 另外的话从开发者心理上讲 debian 稳一点, 更接近普通 Linux 环境.
参考文档
Docker hub Python官方镜像 Docker hub Golang官方镜像 Docker hub Node官方镜像