[Dockerfile構建鏡像]
[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 [email protected]
MAINTAINER Jusername [email protected]
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 [email protected] # 備註資訊
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 //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 構建鏡像時候不使用快取