One - One Code All

Blog Content

docker镜像 alpine 坑的讨论

Linux-Mac 容器化   2020-03-15 11:25:10

很多官方 docker 镜像都出了基于 alpine 的版本,相较于正常的版本, alpine 版会有什么坑吗?


如果 alpine 版本的没有任何坑,那么相较于那些基于 Debian,Ubuntu,CentOS 的镜像,有体积大小的绝对优势。 那那些版本还有什么存在的必要?而且很多都会把那些作为默认的(例如 latest ) tag,而 alpine 版的后面还要跟上-alpine 的 tag



1. 单独的服务有优势,但是如果在一台机子上部署 N 个服务的话,alpine 便没有优势

 另外,如果涉及编译的话,alpine 用的是 musl libc,这一点要注意


2. 相比于 alpine,你提到的那些系统有更加丰富的软件库、系统各种特性用法的普及度更高,在已有镜像基础上去安装新的程序成本更低。


3. 拿来单独当服务器也挺好玩的版本,真的很快,还默认源里就有。


4。 docker 镜像是共享的,

也就是所有底层是 ubuntu1804 的 nginx、php 镜像共用一个 ubuntu1804,单个看着空间占用大,但是平均起来并没有多少。

所以只要还有一个依赖于 ubuntu,那么其他的即使换成 alpine 并不会减小总空间占用,还会增加 alpine 的占用,意义就不是很大了。


5. alpine 没用过几次,ubuntu 的库还是比 alpine 齐全,资料也好查。


6. 像有些镜像就没有 alpine 版本,比如 MySQL。 

直接使用的话其实没啥区别,区别只在于你要使用它作为自己的镜像的 From 的时候,alpine 版本可能无法提供你所需要的东西

 

7. 目前碰到一个坑,就是没有内置信任的 https 根证书

解决:

https://hackernoon.com/alpine-docker-image-with-secured-communication-ssl-tls-go-restful-api-128eb6b54f1f


FROM alpine:latest

RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*

COPY ./mycert.crt /usr/local/share/ca-certificates/mycert.crt

RUN update-ca-certificates

 

8. 如果是 python 就没太大必要用了,因为很可能要装一大堆依赖,不但浪费时间,也可能有不可预见的问题,因为 musl,最重要的是得到的镜像大小并没有差别很大


apline 的 musl 在 /etc/resolv.conf 里不支持全部 option set, 对 dns 有特殊要求的可能有问题.


还有 apline 里面是 busybox, 有些程序如果用 shell 调用一些系统命令, 可能参数不一样会出错(比如 fluentd 的某个版本调用 gzip)

 

> 但是如果多个镜像(包括每个镜像运行的多个容器)使用了同一个基础镜像,是不会花费额外的空间的

> 也就是所有底层是 ubuntu1804 的 nginx、php 镜像共用一个 ubuntu1804


理想情况是这样

实际上 docker hub 的每个镜像的 FROM ubuntu:latest 未必是同一个,几十个 ubuntu:latest 和几十个 alpine:latest 可能会有不小差距

每个 image 都自己从头 build 且统一更新的可以忽略这点

 

9. 由于 glibc,所以好多通用软件没法直接用。比如 jdk,当时被坑了一晚上。找了 zulu 专门对 apline 编译过的 openjdk。虽然 alpine 的源里就有。当时没配置好网络,没法用 apk 安装

 

10. 缺 glibc 主要坑就是效率问题。

 

主要参考:https://www.v2ex.com/amp/t/581888


上一篇:docker-compose up和restart的区别
下一篇:docker 打包制作镜像报错returned a non-zero code: 1

The minute you think of giving up, think of the reason why you held on so long.