構建Docker Image的五個建議

banq發表於2016-08-11
如何有效快速構建和使用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"]
##################################################
<p class="indent">


Five Tips for Building Docker Images - DZone DevOp

相關文章