构建Docker Image的五个建议

如何有效快速构建和使用Docker的image以便能加速部署?这对于开发和发布循环是非常重要,下面是一些经验分享:

1.尽可能缓存需要互联网下载的内容,部署需要从互联网下载几百兆数据,非常频繁,因此遭遇缓慢互联网连接是经常有的事情,因此,越多使用缓存,就能越快提高部署速度。总体目标是离线,以所有都打包在一起方式部署。

2.将Docker Image看成普通操作系统Image,虽然Docker很强的,但是同时也会有其他类似Docker的选择,为了支持部署环境需要或不需要Docker,我们应该对CI部署配置面对这两种场景。

3.对Docker Image中所有包和安装服务进行审计。我们是从Image启动Docker 容器,Docker会列表和检查所有包和安装服务,为什么?首先需要保持Docker image尽可能小,image传输会更快,其次,个更多包和服务激活,我们会了解到更多情况,比如包冲突或争夺TCP端口等情况会发生,最好保持Docker image简单而stupid。

4.在每次Docker构建完成后,清除关闭所有服务,如果你不这么做,服务会在Docker image生命周期结束后才会被杀死,服务的锁文件/var/lock/*会出现不正常情况,当我们在每次新构建image后测试部署时,便会出现服务无法启动的情况,从而导致无法启动有效测试工作。

5.增加验证步骤,当情况变化,我们需要重新构建Docker image,为了确认每件事都完美,我们可以增加自动验证逻辑到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"]
##################################################

Five Tips for Building Docker Images - DZone DevOp