0x00 前言简述
描述:前面我们学习并且记录了 Dockerfile 最佳实践的一些规则,但是仅仅停在理论中并不是我的风格,所以出现了本篇文章同时也加深学习;
从最佳实践原则我们知道要缩小镜像大小,与选择的基础镜像是非常有关系的,比如buysbox (工具箱)与alpine (操作系统)
镜像小的您超出您的想象,需要
docker pull alpine # 容器中最小的Linux发行版
docker pull busybox # 嵌入式以及物联网系统中最常用的Linux下的工具箱
docker images | grep -E "busybox|alpine"
busybox latest c7c37e472d31 3 weeks ago 1.22MB
alpine latest a24bb4013296 8 weeks ago 5.57MB
对于刚接触容器的人来说他们很容易被自己构建的 Docker 镜像体积吓到,我只需要一个几 MB 的可执行文件而已,为何镜像的体积会达到 1 GB 以上?
答:相信下面的奇技淫巧会帮助你精简镜像,同时又不牺牲开发人员和运维人员的操作便利性。
0x01 基础环境
实验(实践)环境准备:
[root@k8s-yum-server ~]# cat /etc/system-release
CentOS Linux release 7.8.2003 (Core)
[root@k8s-yum-server ~]# uname -r
5.7.0-1.el7.elrepo.x86_64
0x02 Docker 最佳实践补充
- (1) 建立一个空白目录进行构建上下文准备,切记不要在家里录下创建一个 Dockerfile 紧接着 docker build 一把梭
# 正确做法是为项目建立一个文件夹,把构建镜像时所需要的资源放在这个文件夹下
mkdir /opt/project && cd !$
vi Dockerfile # 编写 Dockerfile
$docker pull debian:buster-slim
$docker pull openjdk:8-slim
$docker images
REPOSITORY TAG SIZE
debian buster-slim 69.2MB
busybox latest 1.22MB # 不建议采用构建太过耗时以及调试
alpine latest 5.57MB # 推荐
centos latest 220MB # 不建议采用基础镜像
-
Tips:由于 openjdk 是基于 debian 的基础镜像构建的,所以向 debian 基础镜像一样后面带个 slim 就是基于 debian:xxx-slim 镜像构建的。
-
Tips:alpine 的 c 库是musl libc
而不是正统的 glibc 库,另外对于一些依赖 glibc 的大型项目像 openjdk 、tomcat、rabbitmq
等都不建议使用 alpine 基础镜像,因为 musl libc 可能会导致 jvm 一些奇怪的问题,这也是为什么 tomcat 官方没有给出基础镜像是 alpine 的 Dockerfile 的原因。
-
(3) 更改为国内镜像软件源,提升容器构建速度目前国内稳定可靠的镜像站主要有,华为云、阿里云、腾讯云、163等。
# alpine 基础镜像修改软件源
RUN echo "http://mirrors.huaweicloud.com/alpine/latest-stable/main/" > /etc/apk/repositories ;\
echo "http://mirrors.huaweicloud.com/alpine/latest-stable/community/" >> /etc/apk/repositories ;\
apk update ;\
# debian 基础镜像修改软件源
sed -i 's/deb.debian.org/mirrors.huaweicloud.com/g' /etc/apt/sources.list ;\
sed -i 's|security.debian.org/debian-security|mirrors.huaweicloud.com/debian-security|g' /etc/apt/sources.list ;\
apt update ;\
# Ubuntu 基础镜像修改软件源
sed -i 's/archive.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
apt update ;\
-
Tips: 建议更新软件源时候RUN指令放在镜像描述后的首条,然后再update软件源以及install相应的软件包;
-
(4) 镜像时区设置由于绝大多数基础镜像都是默认采用UTC的时区与北京时间相差8个小时,将会会导致容器内的时间与北京时间不一致,因而会对一些应用造成一些影响,还会影响容器内日志和监控的数据,可以通过以下操作进行解决;
# 方式1.通过设置环境变量来设定容器内的时区。
-e TZ=Asia/Shanghai
# debian设置两种方式
# -启动时设定环境变量指定时区
docker run --rm -it -e TZ=Asia/Shanghai debian date
# -构建镜像的时候复制时区文件设定容器内时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ;\
echo "Asia/shanghai" > /etc/timezone ;\
- Tips: alpine 基础镜像无法通过 TZ 环境变量的方式设定时区,需要安装 tzdata 来配置时区也可以在 RUN 指令后面追加上时区复制到/etc/localtime命令;
# 方式1
docker run --rm -it -e TZ=Asia/Shanghai alpine date
# 方式2
apk add --no-cache tzdata ;\
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ;\
echo "Asia/Shanghai" > /etc/timezone ;\
apk del tzdata ;\
- (5) 使用URL添加源码,如果不采用分阶段构建对于一些需要在容器内进行编译的项目,最好通过 git 或者 wegt 的方式将源码打入到镜像内,而非采用 ADD 或者 COPY ,因为源码编译完成之后源码就不需要可以删掉了,而通过 ADD 或者 COPY 添加进去的源码已经用在下一层镜像中了是删不掉滴啦;
# centos 7
FROM centos:7
# 添加配置文件
# add profiles
ADD conf/client.conf /etc/fdfs/
ADD