Docker 核心技術之Dockerfile
Dockerfile 簡介
什麽是Dockerfile
Dockerfile其實就是根據特定的語法格式撰寫出來的一個普通的文本文件
利用docker build命令依次執行在Dockerfile中定義的一系列命令,最終生成一個新的鏡像(定制鏡像)
Dockerfile 示例與使用
Dockerfile使用命令 – docker build
作用:
- 根據dockerfile創建鏡像
命令格式:
- docker build [OPTIONS] PATH | URL | -
命令參數:
- PATH Dockerfile所在路徑(文件夾路徑),文件名必須是Dockerfile
- URL Dockerfile所在URL地址
- OPTIONS:
- -t, --tag list 為鏡像設置名稱和tag
- -f, --file string 指定Dockerfile的路徑(這是可以使用其他名稱命名Dockerfile)
案例演示
mkdir Dockerfile-dir cd Dockerfile-dir/ vi Dockerfile
輸入以下內容
# 註釋 FROM centos RUN echo ‘這是一個測試的docker file‘
執行 docker file 目錄
docker build /root/Dockerfile-dir
可以在上面看到新創建的鏡像沒有 名稱和 TAG 信息 , 使用 -t 參數指定
docker build /root/Dockerfile-dir -t test:v1.0
docker build 默認指定docker file 所在的目錄,它會自動的尋找其下面的Dockerfile文件,那麽我們在其目錄下dockerfile不是以 Dockerfile命名的話,就會報錯
可以使用 -f 參數解決這個問題
docker build . -f /root/Dockerfile-dir/test_docker_file -t test2:v1.0
對一個 docker 文件多次 build 可以發現以下規律
cat Dockerfile
docker build . -t test
可以發現多次 build 一個docker file 使用過的命令不在執行
在 docker file 中新增一條命令
vi Dockerfile
# 註釋 FROM centos RUN echo ‘這是一個測試的docker file‘ RUN echo ‘這是一個在後面添加‘
再次 build
docker build . -t test
可以發現,在後面新增的執行,以前舊的使用的是緩存不執行
在 docker file 前面添加一條命令
# 註釋 FROM centos RUN echo ‘這是一個在前面添加‘ RUN echo ‘這是一個測試的docker file‘ RUN echo ‘這是一個在後面添加‘
再次build
docker build . -t test
可以發現所有命令都執行
由此可以得出這樣的一個結論,在一個步奏修改了內容,前面的不變,後面的都會被執行
通過查看鏡像的歷史記錄可以知道,執行一條命令都會在原有的基礎上增加一層,所以在寫docker file 的時候要盡量在後面添加東西,這樣就不會把前面的層重新構建
doker file 底層就是調用 docker commit 把容器變成一個鏡像
Dockerfile 特征
查看官方的 Dockerfile:https://github.com/docker-library/docs
Dockerfile 構建特征(二)
Dockerfile必須具備一個FROM命令來進行構建
每一個Dockerfile命令都會構建一層鏡像(本質上是每一層都會啟動一個容器,執行完命令後,將容器進行提交後,產生新的鏡像層)
通過查看下載下來的鏡像,發現歷史層信息的層ID是missing,其實是因為原本的層id只存在於構建鏡像的宿主機上,一旦轉移鏡像後,歷史層消息中將只保留最新一層的ID
Dockerfile 命令概述(一)
查看完整介紹
https://docs.docker.com/engine/reference/builder/#usage
FROM: 指定基礎鏡像
RUN: 構建鏡像過程中需要執行的命令。可以有多條。docker build
CMD:添加啟動容器時需要執行的命令。多條只有最後一條生效。可以在啟動容器時被覆蓋和修改。
ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。
:為鏡像添加對應的數據。
MLABELAINTAINER:表明鏡像的作者。將被遺棄,被LABEL代替。
EXPOSE:設置對外暴露的端口。
ENV:設置執行命令時的環境變量,並且在構建完成後,仍然生效
ARG:設置只在構建過程中使用的環境變量,構建完成後,將消失
ADD:將本地文件或目錄拷貝到鏡像的文件系統中。能解壓特定格式文件,能將URL作為要拷貝的文件
COPY:將本地文件或目錄拷貝到鏡像的文件系統中。
VOLUME:添加數據卷
USER:指定以哪個用戶的名義執行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:設置工作目錄
Dockerfile 命令概述(二)
ONBUILD:如果制作的鏡像被另一個Dockerfile使用,將在那裏被執行Docekrfile命令
STOPSIGNAL:設置容器退出時發出的關閉信號。
HEALTHCHECK:設置容器狀態檢查。
SHELL:更改執行shell命令的程序。Linux的默認shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。
備忘:
- Docker 容器與鏡像之間的關系(尤其commit命令的作用和效果)
- Dockerfile 的書寫規則和使用規則
-
查看官方的 Dockerfile:https://github.com/docker-library/docs (看看官方的案例)
Docker 核心技術之Dockerfile