V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dataman
V2EX  ›  Docker

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

  •  
  •   dataman · 2017-01-05 15:32:51 +08:00 · 2753 次点击
    这是一个创建于 2871 天前的主题,其中的信息可能已经有所发展或是发生改变。

    毫无疑问,容器是 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 <[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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.