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