毫无疑问,容器是 DevOps 世界一个突破性的技术。镜像创建对于部署和发布环节都非常重要。那么如何效率地创建和使用镜像来提升部署速度呢?以下是作者的经验和分享,大家不妨一试——
通常部署需要从 Internet 下载成百上千 MB 的数据。因此部署常受到网速慢或者断网的困扰。
而缓存得越多,部署得就会越快。最终的目标是实现 Docker 镜像离线一键部署。
Docker 很强力,但是我们也有很多 VM 或者裸机部署。为了避免供应商锁定,通常需要选择是否用 Docker 支持部署,最好两种场景都实施部署持续集成。
举例来说,如果使用 kitchen 来做持续集成。默认情况下,使用自定义 Docker 镜像来测试。当 IMAGE_NAME 指定为 ubuntu:14.04 时,可以很肯定 ubuntu:14.04 系统对于部署非常适用。
从镜像起一个 Docker 容器,然后列出并检查所有安装的包 /服务。
为什么要这么做?首先我们希望 Docker 镜像尽可能地小,镜像交付就会很快速。其次,包 /服务越多,问题也会越多,例如包冲突, TCP 端口占有问题。一些服务的安装后脚本甚至会改变关键性的全局配置文件或者留下不可预期的 flagfile 。所以最好让 Docker 镜像保持傻傻的单纯。
如果不这么做,服务会在 Docker 镜像的最后阶段被杀掉。在 /var/lock/*下的服务的 lockfile 如果没有被正确使用,当测试新建镜像的部署时,服务可能会启动失败,导致测试无效。
当有改变发生时,我们时不时需要重构 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 <[email protected]>
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} \
[email protected]: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/docker_deployment.html