1. 程式人生 > 其它 >Docker之dockerfile小結

Docker之dockerfile小結

Docker學習之dockerfile

Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。

基礎知識

指令語句

指令語句可以大致分為兩種:配置指令和操作指令

指令不區分大小寫。但是,使用中我們約定大寫,以便更輕鬆地將它們與引數區分開。

這些指令基本上都可以在 docker run命令中使用用相關引數來覆蓋掉 Dockerfile相關的值,docker run 的引數優先順序高

  • 指令語句的基礎知識:
    • 每條保留字指令都必須是大寫字母並且後面要跟隨至少一個引數
    • 指令按照從上到下,順序執行
    • # 表示註釋
    • 每條指令的執行都會建立一個新的映象層,注意:過多無意義的層,會造成映象膨脹過大。

上下文路徑

上下文路徑:指 docker 在構建映象時,如果需要使用到本機的檔案(比如複製),docker build 命令得知這個路徑後,會將該路徑下的所有內容打包

解析:由於 docker 的執行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。

如果未說明最後一個引數,那麼預設上下文路徑就是 Dockerfile 所在的位置。

注意:上下文路徑下不要放無用的檔案,因為會一起打包傳送給 docker 引擎,如果檔案過多會造成過程緩慢。

製作dockerfile

基於已有的映象建立

docker commit :從容器建立一個新的映象

#語法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]

常用引數:

  • -a :提交的映象作者;
  • -c :使用Dockerfile指令來建立映象;
  • -m :提交時的說明文字;
  • -p :在commit時,將容器暫停。

例如:結合docker cp命令自定義nginx的index頁面

docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v1
cd /data
echo "laowan" > /data/index.html
docker cp /data/index.html nginx:/usr/share/nginx/html/index.html
curl localhost
docker container commit -m "update index.html file" -a "laowan" nginx
192.168.1.214:5000/zhsl/nginx:v2
docker images
docker rm -f nginx
docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v2
curl localhost
docker push 192.168.1.214:5000/zhsl/nginx:v2

官網地址

https://docs.docker.com/engine/reference/builder/

Dockerfile其實就是我們用來構建Docker映象的原始碼,當然這不是所謂的程式設計原始碼,而是一些命令的集 合,只要理解它的邏輯和語法格式,就可以很容易的編寫Dockerfile。簡單點說,Dockerfile可以讓使用者 個性化定製Docker映象。因為工作環境中的需求各式各樣,網路上的映象很難滿足實際的需求。

Dockerfile的基本結構

Dockerfile是一個包含用於組合映像的命令的文字文件。可以使用在命令列中呼叫任何命令。 Docker通
過讀取Dockerfile中的指令自動生成映像

docker build命令用於從Dockerfile構建映像。可以在docker build命令中使用 -f 標誌指向檔案系統中任
何位置的Dockerfile。

Dockerfile由一行行命令語句組成,並且支援以#開頭的註釋行

Dockerfile分為四部分:基礎映象資訊、維護者資訊、 映象操作指令和容器啟動時執行指令

Dockerfile檔案說明

Docker以從上到下的順序執行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲 明以 # 字元開頭則被視為註釋。可以在Docker檔案中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。

Dockerfile常見命令

命令 解釋
FROM 指定基礎映象,必須為第一個命令
MAINTAINER 維護者(作者)資訊
ENV 設定環境變數
RUN 構建映象時執行的命令
CMD 構建容器後呼叫,也就是在容器啟動時才進行呼叫
ENTRYPOINT 指定執行容器啟動過程執行命令,覆蓋CMD引數 ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋 ENTRYPOINT,而docker run命令中指定的任何引數,都會被當做引數再次傳遞 給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆 蓋前面的設定,而只執行最後的ENTRYPOINT指令。
ADD 將本地檔案新增到容器中,tar型別檔案會自動解壓(網路壓縮資源不會被解壓), 可以訪問網路資源,類似wget
COPY 功能類似ADD,但是是不會自動解壓檔案,也不能訪問網路資源
WORKDIR 工作目錄,類似於cd命令
ARG 用於指定傳遞給構建執行時的變數
VOLUMN 用於指定持久化目錄
EXPOSE 指定於外界互動的埠
USER 指定執行容器時的使用者名稱或 UID,後續的 RUN 也會使用指定使用者。使用USER指 定使用者時,可以使用使用者名稱、UID或GID,或是兩者的組合。當服務不需要管理 員許可權時,可以通過該命令指定執行使用者。並且可以在之前建立所需要的使用者

我最近在做canal同步就遇到一個問題,需要同步一個UTC時區的資料到我的資料庫中來,所以需要修改mysql官網映象時區

FROM mysql:8.0.28
# 作者資訊
MAINTAINER mysql from date Asia/Shanghai by UTC "laowan" 
ENV TZ UTC

build命令

docker build 命令用於使用 Dockerfile 建立映象。

docker build [OPTIONS] PATH | URL | -

常用引數

build命令引數特別多。這裡只給大家介紹幾個常用的引數,如果小夥伴們想了解更多內容,請參考 docker官網手冊。

  • --build-arg=[] :設定映象建立時的變數;
  • -f :指定要使用的Dockerfile路徑;
  • --rm :設定映象成功後刪除中間容器;
  • --tag, -t: 映象的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中為一個映象設定 多個標籤。

製作映象

docker build --rm -t 192.168.1.214:5000/zhsl/mysql:8.0.28
docker images

執行映象

docker run -itd --name mysql --restart always -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=123456 192.168.1.214:5000/zhsl/mysql:8.0.28
docker logs -f mysql
docker exec -it mysql bash
date

測試mysql連線

docker exec -it mysql bash