【Docker進階】Dockerfile最佳實踐(二)
本文是 Docker 入門教程第三章-DockerFile 的進階篇第二部分。作者主要介紹了 Docker 的變化、常用指令以及基礎鏡像的最佳用法。
自從我上一篇 Dockerfile 最佳實踐后,Docker 發生了很大變化。上一篇會繼續保留用于造福 Docker 新手,這篇文章將介紹 Docker 有什么變化以及你現在應當做什么。
1:不要開機初始化
容器模型是進程而不是機器。即使你認為你需要開機初始化,那么你就錯了。2:可信任構建
即使你不喜歡這個題目但它是很棒的一功能。我把大部分 gihub 倉庫添加到可信任構建,因此當我提交一個新鏡像之后不久,正在等待索引。另外,我不必再創建單獨的 Dockerfile 倉庫與他人分享,它們都在同一個地方。請記住,這不是你嘗試新東西的試驗場。在你推送之前,請在本地先構建一下。Docker 可以確保你在本地的構建和運行,與你推送到任何地方的構建和運行是一樣的。本地開發和測試、提交和推送、以及等待索引上的官方鏡像都是建立在可信任構建的基礎之上的。
3:不要在構建中升級版本
更新將在基礎鏡像里,你不需要在您的容器內來apt-get upgrade更新。因為隔離情況下,如果更新時試圖修改 init 或改變容器內的設備,更新可能會經常失敗。它還可能會產生不一致的鏡像,因為你不再有你的應用程序該如何運行以及包含在鏡像中依賴的哪種版本的正確源文件。如果基礎鏡像需要安全更新,那么讓上游的知道,讓他們給大家更新,并確保你再次構建的一致性。
4:使用小型基礎鏡像
有些鏡像比其他的更臃腫。我建議使用debian:jessie作為你的基礎鏡像。如果你熟悉 ubuntu,你將發現一個更輕量和巧妙的自制 debian,它足夠小并且沒有包含任何不需要的包。5:使用特定的標簽
對于你的基礎鏡像這是非常重要的。Dockerfile 中FROM應始終包含依賴的基礎鏡像的完整倉庫名和標簽。比如說FROM debian:jessie而不僅僅是FROM debian。6:常見指令組合
您的apt-get update應該與apt-get install組合。此外,你應該采取\的優勢使用多行來進行安裝。#Dockerfile for https://index.docker.io/u/crosbymichael/python/ FROM debian:jessieRUN apt-get update && apt-get install -y \ git \ libxml2-dev \ python \ build-essential \ make \ gcc \ python-dev \ locales \ python-pip
RUN dpkg-reconfigure locales && \ locale-gen C.UTF-8 && \ /usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8</pre>
謹記層和緩存都是不錯的。不要害怕過多的層,因為緩存是大救星。當然,你應當盡量使用上游的包。
7:使用自己的基礎鏡像
我不是在談論運行 debbootstrap 來制作自己的 debian。你不是 tianon(Tianon Gravi),沒有人想要你認為別人需要的你的 500mb 的狗屎垃圾基礎鏡像。我說的是,如果你要運行 python 應用程序需要有一個python基礎鏡像。前面示例中用于構建crosbymichael/python的 Dockerfile 也被用于其他很多構建 Python 應用程序的鏡像。
FROM crosbymichael/pythonRUN pip install butterfly RUN echo "root\nroot\n" | passwd root
EXPOSE 9191 ENTRYPOINT ["butterfly.server.py"] CMD ["--port=9191", "--host=0.0.0.0"]</pre>
另一個:FROM crosbymichael/pythonRUN pip install --upgrade 油Tube_dl && mkdir /download WORKDIR /download ENTRYPOINT ["油Tube-dl"] CMD ["--help"]</pre>
正如你看到的,這使得使用你的基礎鏡像非常小,從而使你集中精力在應用程序上。
讓我知道你在想什么,或者如果您有任何其它問題,可以在評論中留言。
原文鏈接:Dockerfile Best Practices - take 2 (翻譯:田浩 審校:葉可強)
來自:http://dockerone.com/article/132