【docker虛擬化技術】dockerfile詳解與實踐
阿新 • • 發佈:2019-02-15
什麼是dockerfile?
Dockerfile是為基於已有映象快速構建docker image(映象)而設計的,當你使用docker build命令的時候,docker 會讀取當前目錄下的命名為Dockerfile(首字母大寫)的純文字檔案並執行裡面的指令構建出一個docker image。
建立Dockerfile檔案
dockerfile是純文字檔案,並且命名為"Dockerfile”(無需字尾名,必須首字母大寫!),而且docker的工作目錄必須為Dockerfile的儲存路徑。
在Linux系統下,可以使用vi編輯器進行建立:
MacdeMBP:Desktop mac$ vi Dockerfile
進入vi編輯器以後,便可以進行Dockerfile命令的編寫了。
Dockerfile命令詳解(命令必須大寫)
*From 映象名或映象名:標籤
在dockerfile中的第一行必須為FROM 命令,用於指明所使用的映象,即基於那個映象建立新映象,可以使用多個From指令,在dockerfile中操作多個映象;
FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位於本地倉庫。
Maintainer 郵箱/維護者資訊:
構建指令,用於將image的製作者相關的資訊寫入到image中。當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。
Run:構建指令,RUN可以執行任何被基礎image支援的命令。如基礎image選擇了ubuntu,那麼軟體管理部分只能使用ubuntu的命令。
該指令有兩種格式:
- RUN <command> (the command is run in a shell - `/bin/sh -c`)
- RUN ["executable", "param1", "param2" ... ] (exec form)
CMD(設定container啟動時執行的操作)
設定指令,用於container啟動時指定的操作。該操作可以是執行自定義指令碼,也可以是執行系統命令。該指令只能在檔案中存在一次,如果有多個,則只執行最後一條。 該指令有三種格式:- CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
- CMD command param1 param2 (as a shell)
- CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
(5)ENTRYPOINT(設定container啟動時執行的操作)
設定指令,指定容器啟動時執行的命令,可以多次設定,但是隻有最後一個有效。 兩種格式:- ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
- ENTRYPOINT command param1 param2 (as a shell)
- # CMD指令將不會被執行,只有ENTRYPOINT指令被執行
- CMD echo “Hello, World!”
- ENTRYPOINT ls -l
- FROM ubuntu
- CMD ["-l"]
- ENTRYPOINT ["/usr/bin/ls"]
(6)USER(設定container容器的使用者)
設定指令,設定啟動容器的使用者,預設是root使用者。- # 指定memcached的執行使用者
- ENTRYPOINT ["memcached"]
- USER daemon
- 或
- ENTRYPOINT ["memcached", "-u", "daemon"]
(7)EXPOSE(指定容器需要對映到宿主機器的埠)
設定指令,該指令會將容器中的埠對映成宿主機器中的某個埠。當你需要訪問容器的時候,可以不是用容器的IP地址而是使用宿主機器的IP地址和對映後的埠。要完成整個操作需要兩個步驟,首先在Dockerfile使用EXPOSE設定需要對映的容器埠,然後在執行容器的時候指定-p選項加上EXPOSE設定的埠,這樣EXPOSE設定的埠號會被隨機對映成宿主機器中的一個埠號。也可以指定需要對映到宿主機器的那個埠,這時要確保宿主機器上的埠號沒有被使用。EXPOSE指令可以一次設定多個埠號,相應的執行容器的時候,可以配套的多次使用-p選項。 格式:- EXPOSE <port> [<port>...]
- # 對映一個埠
- EXPOSE port1
- # 相應的執行容器使用的命令
- docker run -p port1 image
- # 對映多個埠
- EXPOSE port1 port2 port3
- # 相應的執行容器使用的命令
- docker run -p port1 -p port2 -p port3 image
- # 還可以指定需要對映到宿主機器上的某個埠號
- docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
(8)ENV(用於設定環境變數)
構建指令,在image中設定一個環境變數。 格式:- ENV <key> <value>
(9)ADD(從src複製檔案到container的dest路徑)
構建指令,所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0;如果是一個目錄,那麼會將該目錄下的所有檔案新增到container中,不包括目錄;如果檔案是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);如果<src>是檔案且<dest>中不使用斜槓結束,則會將<dest>視為檔案,<src>的內容會寫入<dest>;如果<src>是檔案且<dest>中使用斜槓結束,則會<src>檔案拷貝到<dest>目錄下。 格式: <src> 是相對被構建的源目錄的相對路徑,可以是檔案或目錄的路徑,也可以是一個遠端的檔案url; <dest> 是container中的絕對路徑(10)VOLUME(指定掛載點))
設定指令,使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令。 格式:- VOLUME ["<mountpoint>"]
- FROM base
- VOLUME ["/tmp/data"]
- docker run -t -i -rm -volumes-from container1 image2 bash
(11)WORKDIR(切換目錄)
設定指令,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效。 格式:- WORKDIR /path/to/workdir
- # 在 /p1/p2 下執行 vim a.txt
- WORKDIR /p1 WORKDIR p2 RUN vim a.txt
(12)ONBUILD(在子映象中執行)
- ONBUILD <Dockerfile關鍵字>