1. 程式人生 > >Docker 核心技術之Dockerfile

Docker 核心技術之Dockerfile

原本 環境變量 lis 使用 基礎 就會 uil 其他 windows

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