前言
这阵子我发现只要带着alpine前缀的镜像,相比于其它的镜像,体积都相对较小,例如下面这些
java:alpinenginx:alpine
后面通过了解,发现了其实这些java镜像,或者nginx镜像都依赖于某个linux操作系统,我们常见的操作系统有 ubuntu、centos、debian。而这个alpine其实也是一个新的操作系统。但是它比其它的操作系统而言,体积更小,所以在他们的基础之上做的镜像,体积也会更小,常见的linux操作系统体积大小,如下所示
REPOSITORY TAG IMAGE ID VIRTUAL SIZEalpine latest 4e38e38c8ce0 4.799 MBdebian latest 4d6ce913b130 84.98 MBubuntu latest b39b81afc8ca 188.3 MBcentos latest 8efe422e6104 210 MB
我们也就发现了 alpine的大小远远小于 其它的操作系统,因此制作出来的镜像大小也远远小于其它的
Alpine操作系统
Alpine操作系统主要是面向安全的轻量级Linux发行版,它和其它的发行版不同之处在于,Alpine采用了musllibc 和 busybox以减少系统体积和运行时资源消耗,但功能上比busybox又完善的多 ,因此越来越得到开源社区的青睐。在保持瘦身的同时,Alpine还提供了自己的包管理工具【CentOS是yum,ubuntu是 apt-get】,可以通过 Alpine包查询网站 ,来进行查看,例如下图所示,搜索自己需要安装的包进行查看
然后通过 apk add vim 来进行安装即可。
Alpine Docker镜像也继承了Alpine Linux发行版的优势,相比于其它的Docker镜像,它的容量体积非常小,仅仅只有5MB,我们通过打开 DockerHub中 Alpine的官网
可以发现,它提供了只有5MB的系统镜像可供我们进行下载使用
# 下载alpine镜像docker pull alpine
同时,它还列举了一个例子 【通过制作一个mysql镜像】
使用Alpine 和 Ubuntu 制作出来的镜像一个是 36.8MB 一个是 145MB,相差4倍多
目前Docker官方已经开始推荐Alpine替代之前的Ubuntu作为基础镜像环境,这样所带来的好处包括:镜像下载速度更快、镜像安全性提高、主机之间的切换更方便、占用内存更少等特点。
使用Alpine镜像
我们通过下面命令,能够非常快的运行一个Alpine容器【本地不存在会去官方下载】,并输出 hello alpine
docker run alpine echo "hello alpine"
迁移至Alpine
目前,大部分Docker官方镜像,都已经提供了Alpine版本镜像的支持,我们非常容易镜像迁移
例如,通过Nginx的 官方DockerHub地址,我们可以看到,也专门有 alpine稳定版本
还有其它一些官方镜像也都提供了alpine版本,我们可以在
ubuntu/debian -> alpinepython:2.7 -> python:2.7-alpineruby:2.3 -> ruby:2.3-alpine
另外,如果我们想要在alpine的基础上进行一些软件的安装,可以使用下面的命令
apk add --no-cache <package>
思考
本段来源于V2EX上的 提问
上面其实我们已经提到了很多关于alpine的优势,比如体积小,并且很多官方的Docker镜像都提供了基于alpine的版本。那如果alpine版本没有任何坑的话,从体积小,并且能满足使用正常使用的话,这相比于CentOS、Ubuntu和Debian的镜像,就拥有非常大的优势了,那么以后这些发行版的进行也就没有存在的必要,真实是这样的么?
下面是针对上述问题,最后的总结
- 首先在基于alpine的操作系统上编写Dockerfile制作新镜像,并不会像其他操作系统一样方便,甚至会出现alpine中不存在的情况。
- 虽然每个单个的基于alpine的软件镜像是明显少于其他操作系统,但是如果多个镜像【包括每个镜像运行的多个容器】,使用 了同一个基础镜像,是不会花费额外的空间【归结于docker的Overlay文件系统】
- 有些软件没办法在Alpine中运行,因为alpine不像其它发行版那样使用CGLIBC【MySQL没有Alpine镜像】
参考
Alpine
官网:http://alpinelinux.org/Alpine
官方仓库:https://github.com/alpinelinuxAlpine
官方镜像:https://hub.docker.com/_/alpine/Alpine
官方镜像仓库:https://github.com/gliderlabs/docker-alpine