介绍
Docker image是实现应用的分发载体,其依赖于很多底层的技术,包括联合文件系统,写时复制等等,还涉及到多种可以选择的存储驱动,下面这张图很好的概括了镜像以及容器的文件系统.
容器镜像的制作
本身容器镜像的制作过程中可优化的地方可以从以下几个方面考虑:
- 镜像的存储:镜像采用分层存储,不同镜像里面相同的层将只需要存储一份
- 镜像的分发:容器启动的时候,会首先将镜像下载到本地,需要从仓库中下载镜像到本地,所以期望镜像的大小能够尽量的小
- 镜像启动的容器的运行效率:镜像启动容器的时候,采用联合挂载,期望镜像的层数能够尽量的少
- Dockerfile的可读性:Dockerfile是需要人来维护的,所以可读性也很重要,Dockerfile中每个语句都对应的是镜像里面的层,所以可以通过将多个语句合并写在一起,但是这样必然会导致降低Dockerfile的易读性.
最佳实践
- 合理的合并Dockerfile中语句,减少镜像的分层
例如我们在制作镜像的时候,将相同功能的语句写在一起
RUN mkdir -p /var/www/cgi-bin/cinder \
&& cp -a /usr/bin/cinder-wsgi /var/www/cgi-bin/cinder/cinder-wsgi \
&& sed -i -r 's,^(Listen 80),#\1,' /etc/httpd/conf/httpd.conf \
&& sed -i -r 's,^(Listen 443),#\1,' /etc/httpd/conf.d/ssl.conf
- 执行yum/dnf/apt等安装软件包的时候,需要清理一下不需要的内容
FROM centos:6
RUN \
yum -y install epel-release && \
yum -y install boost-devel bzip2 cmake\
yum clean all && rm -rf /var/lib/yum/yumdb && rm -rf /var/lib/yum/history
- 优化基础镜像,基础镜像是其他镜像的基础
* 基础镜像中应该包含了其他基于该基础镜像都需要使用的基础软件,并且镜像保持的足够的小,并且会完成如小工作:
* 配置RPM源,MAVEN源等需要涉及的安装工具的源,采用统一管理安装工具的源
* 配置时区以及系统的公共的配置文件 - 通过docker history imageID来查看镜像的层次关系,了解镜像的分层的情况,来优化镜像的制作过程.
- 对镜像进行安全扫描,部署自动化流程,能够自动的更新镜像并推送到仓库中,在仓库中通过tag的方式来管理镜像.
FAQ
- 常见的存储驱动的选择
主要有AUFS、OverlayFS,Device Mapper,前两种驱动都是基于文件,它的原理就是需要修改一个文件的时候把整个文件复制上去做修改, Device Mapper更偏底层一点,它是基于块设备的,它的好处在于当我想要修改一个文件的时候,我不会将整个文件拷上去,我会将文件修改的一些存储块拷上去做一些修改,当我有一些大文件想要修改的时候,Device Mapper会比AUFS、OverlayFS好很多。所以AUFS和OverlayFS就比较适合传统的WEB应用,它的文件操作不会很多,但是它可能对我们的应用启动速度会有一些要求,但是对于文件修改的一些效率我不是很关心,那可以使用基于文件的驱动,当我们是一些计算密集型的应用时候,我们就可以选择Device Mapper,虽然启动比较慢,但是它的运行效率相对表现要好一些。
History
2017/12/23 init doc