dockerfile 是乙個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。
dockerfile是用來構建docker映象的構建檔案,是由一系列命令和引數構成的指令碼。
簡單來說,dockerfile就是把我們安裝環境的每個步驟和指令,放到乙個檔案,最後一鍵執行,最後做成乙個你想要的環境。
docker構建三步曲:
只支援docker自己定義的一套指令,不支援自定義
大小寫不敏感,但是建議全部使用大寫
根據dockerfile的內容順序執行
from
必須放在dockerfile的第一行,表示從哪個baseimage開始構建
可選的,映象維護者的姓名和郵箱位址
每乙個run指令都會是在乙個新的container裡面執行,並提交為乙個image作為下乙個run的base
乙個dockerfile中可以包含多個run,按定義順序執行
run支援兩種執行方式:
run 《命令列命令》
# 《命令列命令》 等同於,在終端操作的 shell 命令。
run ["可執行檔案", "引數1", "引數2"]
# 例如:
# run ["./test.php", "dev", "offline"] 等價於 run ./test.php dev offline
dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。例如:
from centos
run yum install wget
run wget -o redis.tar.gz ""
run tar -xvf redis.tar.gz
以上執行會建立 3 層映象。可簡化為以下格式:
from centos
run yum install wget \
&& wget -o redis.tar.gz "" \
&& tar -xvf redis.tar.gz
如上,以 && 符號連線命令,這樣執行後,只會建立 1 層映象。
cmd的作用是作為執行container時候的預設行為(容器預設的啟動命令)
當執行container的時候宣告了command,則不再用image中的cmd預設所定義的命令
乙個dockerfile中只能有乙個有效的cmd,當定義多個cmd的時候,只有最後乙個才會起作用
cmd定義的三種方式:
cmd ","",...]
cmd ["","",...] # 這個時候cmd作為entrypoint的引數
僅僅只是宣告埠。
幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。
在執行時使用隨機埠對映時,也就是 docker run -p 時,會自動隨機對映 expose 的埠。
expose 《埠1> [《埠2>...]
類似於 cmd 指令,但其不會被 docker run 的命令列引數指定的指令所覆蓋,而且這些命令列引數會被當作引數送給entrypoint
指令指定的程式。
但是, 如果執行 docker run 時使用了 --entrypoint 選項,此選項的引數可當作要執行的程式覆蓋 entrypoint 指令指定的程式。
優點:在執行 docker run 的時候可以指定 entrypoint 執行所需的引數。
注意:如果 dockerfile 中如果存在多個 entrypoint 指令,僅最後乙個生效。
格式:
entrypoint ["","","",...]
可以搭配 cmd 命令使用:一般是變參才會使用 cmd ,這裡的 cmd 等於是在給 entrypoint 傳參,以下示例會提到。
示例:假設已通過 dockerfile 構建了 nginx:test 映象:
from nginx
entrypoint ["nginx", "-c"] # 定參
cmd ["/etc/nginx/nginx.conf"] # 變參
1、不傳參執行
$ docker run nginx:test
容器內會預設執行以下命令,啟動主程序。
nginx -c /etc/nginx/nginx.conf
2、傳參執行
$ docker run nginx:test -c /etc/nginx/new.conf
容器內會預設執行以下命令,啟動主程序(/etc/nginx/new.conf:假設容器內已有此檔案)
nginx -c /etc/nginx/new.conf
複製指令,從上下文目錄中複製檔案或者目錄到容器裡指定路徑。
格式:
copy [--chown=:] 《源路徑1>... 《目標路徑》
copy [--chown=:] ["《源路徑1>",... "《目標路徑》"]
[--chown=:]:
可選引數,使用者改變複製到容器內檔案的擁有者和屬組。
《源路徑》:原始檔或者源目錄,這裡可以是萬用字元表示式,其萬用字元規則要滿足 go 的 filepath.match 規則。例如:
copy hom* /mydir/
copy hom?.txt /mydir/
《目標路徑》:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。
設定環境變數,定義了環境變數,那麼在後續的指令中,就可以使用這個環境變數。
格式:
env env ==...
以下示例設定 node_version = 7.2.0 , 在後續的指令中可以通過 $node_version 引用:
env node_version 7.2.0
run curl -slo "" \
&& curl -slo ""
用來指定當前工作目錄(或者稱為當前目錄,容器啟動時執行的命令會在該目錄下執行
用 workdir 指定的工作目錄,會在構建映象的每一層中都存在。(workdir 指定的工作目錄,必須是提前建立好的)。
docker build 構建映象過程中的,每乙個 run 命令都是新建的一層。只有通過 workdir 建立的目錄才會一直存在。
格式:
workdir 《工作目錄路徑》
用於指定執行後續命令的使用者和使用者組,這邊只是切換後續命令執行的使用者(使用者和使用者組必須提前已經存在)。
格式:
user 《使用者名稱》[:《使用者組》]
用於延遲構建命令的執行。簡單的說,就是 dockerfile 裡用 onbuild 指定的命令,在本次構建映象的過程中不會執行(假設映象為 test-build)。當有新的 dockerfile 使用了之前構建的映象 from test-build ,這是執行新映象的 dockerfile 構建時候,會執行 test-build 的 dockerfile 裡的 onbuild 指定的命令。
格式:
onbuild 《其它指令》
定義匿名資料卷。在啟動容器時忘記掛載資料卷,會自動掛載到匿名卷。
作用:
volume ["《路徑1>", "《路徑2>"...]
volume 《路徑》
docker映象的製作(一) dockerfile
映象的儲存方式,利用linux的聯合儲存檔案系統,不同的目錄可以掛載在同乙個的檔案系統下,就能形成分層的結構 在同乙個目錄下查詢到其他各個目錄的檔案。在 docker commit 的學習中,我們可以了解到,映象的定製實際上就是定製每一層所 新增的配置 檔案。如果我們可以把每一層修改 安裝 構建 操...
docker學習 8 docker資料卷
我們首先來回顧一下docker的理念,就是將應用和環境打包成乙個映象,那資料呢就存在於容器中,如果容器被刪,那資料就會丟失,因此我們有乙個希望資料可以長久儲存的需求,就算容器被刪,也能找回資料,盡力減少刪庫跑路帶來的損失。實際上容器之間有一種資料共享的技術,使得docker容器產生的資料,直接同步到...
docker安裝mysql8問題
docker中安裝mysql8,出現如下問題 client does not support authentication protocol 解決辦法 1.首先進入mysql容器的bash終端 docker exec it mysql bash2.登陸mysql mysql u root p 接著輸...