您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何寫Dockerfile”,在日常操作中,相信很多人在如何寫Dockerfile問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何寫Dockerfile”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
應用最好不要跑在特權用戶( root )底下
Docker 默認所有的應用都會跑在容器的 root user 底下,但是這樣會造成一些潛在的安全隱患。在 production 環境跑的 Container 最好是通過 USER 命令跑在非特權用戶底下。
隱患在哪,求補充。
安全隱患是說如果這個 container 被 compromise 了,那么如果是 root 在跑這個 container 更可能使系統出現問題。但是用 root user 本身應該是沒問題的。
是指的如果用 root 跑 container 會有問題嗎?那為什么推薦用 USER 命令來改變 docker 的非 root ?
就是 Docker 的隔離效力有限,如果一個 container 里的應用是惡意的,而且是 root ,那如果它改了系統配置( root 權限,比如 unload 某個系統 module ,更改了某個系統文件),也會影響其他的 container ( share 一個 kernel )。
避免使用 apt-get upgrade
Upgrade 命令是用來升級當前基礎鏡像的。非特權用戶無法 Upgrade 一些核心的應用。而且 Upgrade 命令會打亂已經緩存的鏡像,使得編譯時間加長。在一般情況下,選用正確的基礎鏡像是不需要升級的,如果真的需要,最好聯系基本鏡像的維護方,這樣所有使用者都能從中獲益。如果只是需要更新某個程序 foo ,那么使用 apt-get install – y foo 就能到達這個目的。
盡量合并命令
Dockerfile 中的每一個命令都會創建一個新的 layer ,而一個容器能夠擁有的最多 layer 數是有限制的。所以盡量將邏輯上連貫的命令合并可以減少 layer 的層數,合并命令的方法可以包括將多個可以合并的命令( EXPOSE , ENV , VOLUME , COPY )合并。
Dockerfile 中的每一個命令都會創建一個新的 layer ,而一個容器能夠擁有的最多 layer 數是有限制的。所以盡量將邏輯上連貫的命令合并可以減少 layer 的層數,這也可以加快編譯速度?
將多個可以合并的命令( EXPOSE , ENV , VOLUME , COPY )合并,比如:
使用“&&”來連接 RUN 命令,比如:
不過過度合并命令可能會影響 Dockerfile 的可讀性,所以需要在優化代碼和可讀性之間做出權衡。
合理安排命令的順序
命令的順序會影響編譯所需要的時間。每一個命令都會產生一個 layer 。如果一個 layer 已經在緩存中,那么生成這個 layer 所需要的時間就很短。從第一個不在緩存的 layer 起,所有以后的命令都會被重新編譯。因為這個原因,我們推薦將不常變動的命令放在前面,這樣可以使得更多的 layer 被成功緩存,從而減少編譯時間。
避免在容器中存儲數據
容器需要是無狀態的,這樣方便啟動新的 Container 來替代 down 掉的 Container 。如果容器中包含狀態,那么就需要額外的運維人員來恢復 down 掉 Container 的狀態。
使用.dockerignore
使用.dockerignore 可以減少拷貝不必要的文件到 Container ,這樣可以減少鏡像大小。比如很多地方都有.git 文件,但是這個文件就不需要拷貝到 Container 里面。
避免安裝不必要的軟件
安裝不必要的軟件既浪費空間又增加編譯時間。比如一個數據庫的 Container 就沒有必要安裝文字編輯軟件。 更進一步,如果程序能夠在本地編譯,那么就不用在 Container 里安裝編譯程序所需要的軟件和 lib 了。直接把本地編譯好的 binary 拷貝到 Container 里就好。
到此,關于“如何寫Dockerfile”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。