構建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的構建過程中。
下面是作者以上五個建議的實踐構建樣本:
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"> |
相關文章
- 【譯文】構建大型 Redux 應用的五個建議Redux
- Docker映象構建(五)Docker
- 使用nodejs構建Docker image最佳實踐NodeJSDocker
- 推廣Twitter的五個建議
- 網站建設中最佳化五個建議網站
- docker構建Docker
- 構建Docker幾個小技巧Docker
- 24條 Docker 建議Docker
- 構建 Docker 映象的 N 個小技巧Docker
- docker構建映象Docker
- docker 構建自己的映象Docker
- Docker 構建 kubectl 映象Docker
- 使用Docker構建你的第一個服務Docker
- 優化 Webpack 構建效能的幾點建議優化Web
- 優化Webpack構建效能的幾點建議優化Web
- Docker映象構建原理解析(不裝docker也能構建映象)Docker
- [需求建議]外掛建議:建議出一個時間軸外掛
- Docker入門-構建第一個Java程式DockerJava
- 從 0 開始構建知識圖譜的 5 個啟動建議
- 使用Backbone構建精美應用的7條建議
- 高效設計構建軟體的十三條建議
- websocketd | 基於 docker 構建WebDocker
- docker構建php環境DockerPHP
- 用dockerfile構建docker映象Docker
- Docker 映象構建之 DockerfileDocker
- docker 構建java 部署包DockerJava
- Flutter 6 個建議改善你的程式碼結構Flutter
- Valve:在Steam平臺發行遊戲的五個建議遊戲
- docker之手動構建新的映象Docker
- Docker安全部署的17條建議Docker
- 構建Java物件的五種方法Java物件
- Android 優化APP 構建速度的17條建議Android優化APP
- Android 優化 APP 構建速度的 17 條建議Android優化APP
- 從零構建一個基於Docker的Laravel應用DockerLaravel
- 怎樣去構建一個優質的Docker容器映象Docker
- Docker 構建PHP 映象環境DockerPHP
- Docker 分階段構建映象Docker
- Docker 映象分階段構建Docker