五个小技巧,快速创建Docker镜像

lnkToKing 2019-06-21

毫无疑问,容器是DevOps世界一个突破性的技术。镜像创建对于部署和发布环节都非常重要。那么如何效率地创建和使用镜像来提升部署速度呢?以下是作者的经验和分享,大家不妨一试——

1. 尽可能多地缓存网络下载

通常部署需要从Internet下载成百上千MB的数据。因此部署常受到网速慢或者断网的困扰。

而缓存得越多,部署得就会越快。最终的目标是实现Docker镜像离线一键部署。

2. 把Docker镜像看做Plain OS Golden Image

Docker很强力,但是我们也有很多VM或者裸机部署。为了避免供应商锁定,通常需要选择是否用Docker支持部署,最好两种场景都实施部署持续集成。

举例来说,如果使用kitchen来做持续集成。默认情况下,使用自定义Docker镜像来测试。当IMAGE_NAME指定为ubuntu:14.04时,可以很肯定ubuntu:14.04系统对于部署非常适用。

3. 审核Docker镜像里所有包和服务的安装

从镜像起一个Docker容器,然后列出并检查所有安装的包/服务。

为什么要这么做?首先我们希望Docker镜像尽可能地小,镜像交付就会很快速。其次,包/服务越多,问题也会越多,例如包冲突,TCP端口占有问题。一些服务的安装后脚本甚至会改变关键性的全局配置文件或者留下不可预期的flagfile。所以最好让Docker镜像保持傻傻的单纯。

4. Docker构建的最后清理关闭所有服务

如果不这么做,服务会在Docker镜像的最后阶段被杀掉。在/var/lock/*下的服务的lockfile如果没有被正确使用,当测试新建镜像的部署时,服务可能会启动失败,导致测试无效。

5. 添加验证步骤,确保镜像正常

当有改变发生时,我们时不时需要重构Docker镜像。为了确保一切正常,我们可以在Docker构建过程中添加自动验证逻辑。

这是一个简单的例子,实践了上述提到的技巧。

########## How To Use Docker Image ###############
##  docker run -t -d --privileged -p 8022:22 \
##          denny/mydockertest:v1 /usr/sbin/sshd -D
##
##################################################

FROM denny/sshd:v1
MAINTAINER Deny <denny@dennyzhang.com>
ARG devops_branch=master
ARG working_dir=/root/chef
##################################################
# Install basic packages
RUN apt-get -yqq update && \
   apt-get -yqq install curl && \
   apt-get -yqq install openssh-server && \
   apt-get install -y sudo lsb-release && \
   # Install chef
   curl -L https://www.opscode.com/chef/install.sh | bash && \
   # clean up files to make this docker layer smaller
   rm -rf /var/chef/cache/*.plugin && \
   rm -rf /usr/share/doc && \
   apt-get clean && apt-get autoclean
##################################################
# checkout code
RUN bash /root/git_update.sh ${working_dir} \
   git@github.com:DennyZhang/chef_community_cookbooks.git \
   ${devops_branch} && \
   echo "cookbook_path [\"${working_dir}/${devops_branch}/mdmdevops/community_cookbooks\", \
   \"${working_dir}/${devops_branch}/mdmdevops/cookbooks\"]" \
   > /root/client.rb

# Chef all-in-one deployment. This step takes minutes
RUN echo "{\"run_list\": [\"recipe[all-in-one::predownload]\"]}" \
   > /root/client.json && \
   chef-solo --config /root/client.rb -j /root/client.json && \
   # Clean up to make docker image smaller
   rm -rf /tmp/* /var/tmp/* && \
   rm -rf /var/chef/cache/jdk-*.tar.gz && \
   rm -rf /var/chef/cache/*.plugin && \
   rm -rf /usr/share/doc && \
   apt-get clean && apt-get autoclean
##################################################

# Shutdown services
RUN service couchbase-server stop || true && \
   service elasticsearch stop || true && \
   service nagios3 stop || true && \
   service apache2 stop || true && \
   service haproxy stop || true && \
   service nagios-nrpe-server stop || true && \
   rm -rf /run/apache2/apache2.pid && \
   rm -rf /var/log/apache2/* && \
   rm -rf /usr/local/var/run/vagrant_ubuntu_trusty_64.pid && \
   rm -rf /root/docker.rb /root/docker.json

# Verify docker image
RUN test -f /var/chef/cache/couchbase-server-enterprise_4.1.0-ubuntu14.04_amd64.deb && \
   test -f /var/chef/cache/elasticsearch-2.3.3.deb && \
   test -f /etc/apt/sources.list.d/ruby2.1-repo.list && \
   test -f /etc/apt/sources.list.d/haproxy-repo.list && \
   dpkg -s haproxy | grep "1.6.5"

# Clean up to make docker image smaller
RUN rm -rf /tmp/* /var/tmp/* /var/chef/cache/jdk-*.tar.gz && \
   rm -rf /var/chef/cache/*.plugin && \
   rm -rf /usr/share/doc && \
   apt-get clean && apt-get autoclean

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
##################################################

作者:Denny Zhang
文章来源:https://dennyzhang.github.io/...

相关推荐