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

2017-01-05 15:32:51 +08:00
 dataman

毫无疑问,容器是 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/docker_deployment.html

2752 次点击
所在节点    Docker
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/332415

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX