[Dockerfile構建映象]
構建映象
構建映象的特徵(前提)
1、需要基礎環境
2、可執行命令
3、啟動命令
Dockerfile
Dockerfile 由一行行命令語句組成, 並且支援以 # 開頭的註釋行。一般而言, Dockerfile 主體內容分為四 部分:基礎映象資訊、 維護者資訊、 映象操作指令和容器啟動時執行指令。
Docker 以從上到下的順序執行 Dockerfile 的指令。為了指定基本映像,第一條指令必須是 FROM。一個聲 明以#字元開頭則被視為註釋。可以在 Docker 檔案中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令。
1、Dockerfile命名:Dockerfile
2、Dockerfile是由指令組成(Dockerfile指令必須大寫)
3、實現基礎環境:FROM
4、可執行命令:RUN
5、啟動命令(指定命令必須執行在前臺):CMD # 映象啟動後執行的命令
6、開始構建:docker build -t [映象名稱] . ( . 指代的就是Dockerfile檔案所在路徑)
7、docker build --no-cache 是禁止構建映象使用快取
Dockerfile指令
FROM :指定基礎映象
以什麼映象為基礎來構建自己的映象,必須指定
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注: tag 或 digest 是可選的,如果不使用這兩個值時,會使用 latest 版本的基礎映象
MAINTAINER :維護者資訊
可以備註一些資訊,名字、聯絡方式等等一些資訊,可以不寫
格式:
MAINTAINER <info>
示例:
MAINTAINER username
MAINTAINER username@163.com
MAINTAINER Jusername username@163.com
RUN :執行一個命令
構建映象的時候,執行什麼命令!執行的命令結果可以在構建的映象中體現。
如果 執行 echo 命令,則會構建映象中 列印 echo 列印的資訊,也可以安裝一些 rpm 包,映象啟動後,容器中就會帶有安裝好的 rpm 。
格式:
RUN <command>
注意:
RUN 的每次執行應該是以根目錄為當前位置
RUN 指令建立的中間映象會被快取,只要不改變並會在下次構建中使用。如果不想使用這些快取映象,可以在構建 時指定--no-cache 引數,如:docker build --no-cache
CMD:設定一個啟動命令
構建的映象 run 後呼叫,也就是在容器啟動時才進行呼叫
格式:
CMD command(執行的命令)
注:
CMD 不同於 RUN,CMD 用於指定在容器啟動時所要執行的 命令,而RUN 用於映象指定構建時所要執行的命令。
WORKDIR:設定工作目錄
容器啟動後,預設所在的目錄位置,進入容器就在這個目錄
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a)
WORKDIR b (這時工作目錄為/a/b)
WORKDIR c (這時工作目錄為/a/b/c)
注:
通過 WORKDIR 設定工作目錄後,Dockerfile 中其後的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執行。在使用 docker run 執行容器時,可以通過-w 引數覆蓋構建時所設定的工作目錄。
ENV:設定容器內預設的環境變數
格式:
ENV <key> <value>
#<key>之後的所有內容均會被視為其<value>的組成部分,因此,一次只能設定 一個變數
ENV <key>=<value> ...
#可以設定多個變數,每個變數為一個"<key>=<value>"的鍵值對,如果 <key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用於續行
示例:
ENV myName liudehua
ENV myName=wuyanzu
EXPOSE:指定於外界互動的埠
對外暴露(開放)的埠 可以跟多個埠 也可指定協議
格式:
EXPOSE <port> [<port>...多個埠號]
示例:
EXPOSE 80
EXPOSE 8080 9998
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE 並不會讓容器的埠訪問到主機。要使其可訪問,需要在 docker run 執行容器時通過-p 來 釋出這些埠,或通過-P 引數來發布 EXPOSE 匯出的所有埠.
如果不使用EXPOSE指定埠,使用-大P也不會對映埠,只有-小p才能指定埠
VOLUME : 指定儲存卷
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data", "/var/log", "/mnt"]
注:
還是需要 -v 對映掛載才可以使用,VOLUME 指定的是容器的路徑,有個提示的作用,告訴我們需要掛載到容器內哪些目錄來使用這個映象。
檢視掛載點
df -h
ARG : 指定執行時變數
用於指定構建映象中執行的變數
格式:
ARG 變數名=預設的變數值(可以不寫)
示例:
ARG NAME
ARG username=liudehua
使用場景:
定義一個構建映象的模板,不知道以後要裝什麼東西,可以先在構建映象的Dockerfile檔案裡面定義變數名,構建映象的時候傳入引數(自己想要安裝的rmp包名),比較方便。
ONBUILD : 觸發器
噹噹前的映象作為基礎映象時執行
格式:
ONBUILD 指令(ADD、RUN之類的)
示例:
ONBUILD ADD . /app/src
ONBUILD RUN rm -rf /
注:
構建自己的映象的時候,在構建映象的檔案中加入ONBUILD 指令,這樣你構建的映象被人當作基礎映象時候的時候,就會觸發你設定的ONBUILD 指令。如果不想別人使用你的映象,便可以這樣操作。
ADD:新增檔案到映象
可以把本地的檔案新增到映象中,tar 型別檔案會自動解壓。也可以訪問網路資源,但是網路壓縮資源不會被解壓
格式:
ADD hom* /mydir/ # 支援使用 * 表示hom開頭的都新增
ADD hom?.txt /mydir/ # hom開頭 .txt結尾的都新增
ADD 宿主主機路徑 映象路徑
COPY:複製檔案到映象
功能類似 ADD,但是是不會自動解壓檔案,也不能訪問網路資源
語法:
COPY 宿主主機路徑 映象路徑
提示:
指令邏輯和 ADD 十分相似,映象路徑可以是一個絕對路徑,也可以是相對路徑(相對路徑的物件是WORKDIR的路徑)。
ADD和COPY之間的區別<
1、ADD 支援解壓(tar型別的壓縮包),COPY不支援
ADD 從宿主主機新增到容器目錄裡面的檔案如果是壓縮包,ADD新增到容器中會自動解壓,COPY則不會自動解壓,COPY新增什麼就是什麼。
2、ADD支援網路下載(不支援解壓),COPY不支援
COPY 後面第一個引數跟 URL 會直接提示來源不能是一個 URL ,ADD 則可以下載 網路資源,支援網路的下載 ,但是下載是壓縮檔案也不會自動解壓。
3、ADD和COPY : 當映象中目錄不存在時,需要加/結尾。當映象中目錄存在時,則沒有區別。
如果映象目錄不存在,也沒有 / 結尾,宿主主機的檔案,會在容器中改成映象指定目錄的名字。如果映象目錄最後 / 結尾,宿主主機的檔案則會在容器的映象指定目錄下,也就是說 / 結尾 容器中如果不存在映象指定目錄,會先建立目錄,然後再把宿主的檔案放在目錄下。
Dockerfile 構建映象案例
FROM centos7 # 基礎映象
MAINTAINER Alvin alvincy@qq.com # 備註資訊
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 執行指令
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 執行指令
RUN yum makecache # 執行指令
RUN yum update -y # 執行指令
RUN yum install python3 -y # 執行指令
RUN pip3 install django # 執行指令
COPY docker /root/docker # 複製宿主主機目錄 到 映象
WORKDIR /root/docker # 設定容器的預設目錄
EXPOSE 8080 # 對外開放埠
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"] # 設定啟動命令
docker build 開始構建映象
docker build 引數 PATH | URL | -
其中PATH代表含有Dockfile的目錄,當然也可以是URL中含有Dockerfile
常用引數:
-t --tag list 指定生成映象標籤,格式為name:tag
docker bulid -t django:998 .
-f, --file string 單獨指定Dockerfile檔案位置
docker build -t django:998 -f mysql(構建映象使用的檔名) .
--build-arg list 設定構建時的變數
docker build --build-args=NAME=liudehua
docker build --build-args=STR='python3 httpd-tools'
--no-cache 構建映象時候不使用快取