50) 構建完美Docker映象

2022-08-10 11:39:11 字數 2535 閱讀 7958

需要一定程度的獨立性、可控性以及安全性

乙個docker映象也可以繼承另外乙個映象,或者「擴充套件」,它就可以擁有這個映象的所有功能。同時,它也可以替換或者覆蓋這個基礎映象的功能。

優點

docker映象的檔案系統基於不同linux系統的發行版。

小的映象通常意味著相對比較少的檔案,較少檔案也會降低發生惡意行為的機率。

在乙個映象的底層,作業系統的層級往往從標準的alpine linux發行版擴充套件而來。在docker社群已經贏得很好的口碑,它是非盈利,高效資源以及安全的。

案例:

from alpine:3.10.2

label relenteny.repository.url=

label relenteny.repository.tag=3.10.2

label relenteny.alpine.version=3.10.2

run set -x && \

addgroup -g 1000 -s alpine && \

adduser -u 1000 -g alpine -h /home/alpine -d alpine && \

apk add –no-cache curl bind-tools

user alpine

workdir /home/alpine

entrypoint [「/bin/sh」, 「-l」]

cmd

案例說明:

選擇體積最小的基礎映象可有效降低映象體積。如:alpine、busybox等

當dockerfile的指令執行完成後,刪除映象不需要用的的檔案。如使用yum安裝元件,最後可使用yum clean all映象清理不需要的檔案或者使用系統rm命令刪除不需要的原始檔等。

映象是乙個分層儲存的檔案,並且映象對層數也是有一定數量的限制,當前映象的層數最高是127層,如果不多加注意,將會導致映象越來越臃腫。在使用dockerfile構建映象時,dockerfile中的每一條指令都會生成乙個層,因此可以通過合併dockerfile中可合併的指令,減少最終生成映象的層數。

例如:在dockerfile中使用run執行shell命令是,可以用"&&"將多條命令連線起來。

利用構建的快取來加快映象構建速度,docker構建缺省會開啟快取,快取生效有三個關鍵點,映象父層沒有發生變化,構建指令不變,新增檔案校驗和一致。只要乙個構建指令滿足這三個條件,這一層映象構建就不會再執行,它會直接利用之前構建的結果。

某一層的映象快取失效之後,它之後的映象層快取都會失效。我們應該把變化最少的部分放在dockerfile的前面,這樣可以充分利用映象快取。dockerfile中有可能導致快取失效的命令workdir、cmd、env、add等,像這些命令最好放到dockerfile底部,以便在構建映象過程中最大限度使用快取。

編寫.dockerignore檔案過濾構建過程中不必要的檔案或者建立單獨的目錄,並且目錄中僅存在映象構建過程中需要使用的檔案。

docker 在執行時分為 docker 引擎(也就是服務端守護程序)和客戶端工具。docker 的引擎提供了一組 rest api,被稱為 docker remote api,而如 docker 命令這樣的客戶端工具,則是通過這組 api 與 docker 引擎互動,從而完成各種功能。因此,雖然表面上我們好像是在本機執行各種 docker 功能,但實際上,一切都是使用的遠端呼叫形式在服務端(docker 引擎)完成。docker build 命令構建映象,其實並非在本地構建,而是在服務端,也就是 docker 引擎中構建的。

構建映象時,docker需要先準備context ,將所有需要的檔案收集到程序中。預設的context包含dockerfile目錄中的所有檔案。如果目錄中的存在大量不相關的檔案,不僅會導致構建緩慢,而且還會導致映象體積增大。

.dockerignore示例如下:

在乙個git專案中,我們並不需要.git目錄等內容。可以在.dockerignore檔案中加入以下內容:

.git/

.dockerignore 的作用和語法類似於 .gitignore,可以忽略一些不需要的檔案,這樣可以有效加快映象構建時間,同時減少docker映象的大小。

使用一些映象源或者在dockerfile中使用網際網路上的url時,去用一些網路比較好的開源站點,這樣可以節約時間、減少失敗率

盡量使用絕對路徑

切換目錄的時候盡量使用 workdir, 而不是使用 run cd /data

如果容器中的應用程式執行時不需要特殊的許可權, 可以通過 user 指令把應用程式的所有者設定為非 root 使用者。

在映象中避免使用sudo 命令. 應為該命令使用的 tty 不確定, 對接收訊號量也會造成影響. 如果確實需要使用 sudo 功能, 則可是使用 gosu 命令替代

可以用 root 使用者初始化乙個 daemon, 然後用非 root 使用者啟動這個 daemon

為了減少映象體積, 應該避免不必要的使用者切換

在 bridge 模式下, 這些容器內部的埠會對映到宿主機的埠上, 建議在容器內部不要更改應用原生的埠號

docker構建映象

做映象就是構建映象!提交容器更改,生成新的映象!docker commit 容器名 新映象的名字 tag 例如 將web2容器提交為乙個新的映象,新映象的名字為nginx 1.1 在docker中映象的儲存方式是分層儲存的!每個映象都會有不同層數!映象的層數只能增加不能減少!映象是唯讀的!裡面的記憶...

docker構建映象

建立docker映象有兩種方法。1。docker commit 這種不推薦,就不介紹了。2。用docker build命令和dockerfile檔案 下面構建乙個nginx小應用。建立資料夾 mkdir static web 進入這個資料夾 cd static web 建立dockerfile檔案 ...

Docker 構建映象

docker 構建映象 1 首先,在專案的根目錄下,新建乙個文字檔案.dockerignore,寫入下面的內容。git node modules npm debug.log 2 然後在專案的根目錄下,新建乙個文字檔案 dockerfile,寫入下面的內容。run npm install regist...