在日常的工作中,常常需要製作自己的項目的鏡像,一般通過以下兩種方式製作鏡像:Docker commit、Dockerfile。
Docker commit一般用做從一個運行狀態的容器來創建一個新的鏡像。定製鏡像應該使用Dockerfile來完成。
docker commit 容器名 新鏡像名:tag
使用這種方式的缺點是:1.對外不可解釋,不方便排查問題, 2.可維護性差、可閱讀性差。Dockerfile 是由一系列指令和參數構成的腳本,一個 Dockerfile 裡面包含了構建整個鏡像的完整命令。Docker 通過docker build執行 Dockerfile 中的一系列指令自動構建鏡像。以下是 Dockerfile 中一些常用欄位的含義:
todo:下面命令太抽象,而且只是介紹,沒有demo,可以給每個命令引入demo,比如解釋 FROM ubuntu:16.04
FROM:基礎鏡像,FROM 命令必須是 Dockerfile 的首個命令。
LABEL:為鏡像生成元數據標籤信息。原有指令 MAINTAINER 已經放棄使用,用 LABEL maintainer="hogwarts@testing-studio.com" 替代。
USER:指定運行容器時的用戶名或 UID,後續 RUN 也會使用指定用戶。
RUN:RUN 命令是 Dockerfile 執行命令的核心部分。它接受命令作為參數並用於創建鏡像。每條 RUN 命令在當前基礎鏡像上執行,並且會提交一個新鏡像。
VOLUME:定義匿名卷,容器運行時應該儘量保持容器存儲層不發生寫操作,為了防止運行時用戶忘記將動態文件保存的目錄掛載為卷,可以事先指定某些目錄掛載為匿名卷。這樣就不會向容器存儲層寫入大量數據。
WORKDIR:WORKDIR 命令用於設置 CMD 指明的命令的運行目錄。為後續的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目錄。可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。使用 docker exec -it 進入容器後,默認也會進入到 WORKDIR 指定的目錄。
ENV:指定容器啟動時的環境變量(注意,只有在容器啟動時,啟動腳本能讀取到,如果希望其他用戶登錄到容器也生效的話,需要寫入 .bashrc)。
COPY:COPY 命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上複製文件到目標容器的文件系統。
EXPOSE:指定埠轉發
CMD:設置容器創建是執行的默認命令。支持三種格式,默認會被 docker run 指定的參數覆蓋。每個容器只能執行一條 CMD 命令。執行的命令和參數當指定多個時,只有最後一個起效。
- CMD ["executable", "參數1","參數2"]:使用 exec 方式執行,推薦。
- CMD command 參數1 參數2:shell 方式執行。
- CMD ["參數1","參數2"]:提供給 ENTRYPOINT 做默認參數。
ENTRYPOINT:指定容器的「入口」。支持兩種格式,默認不會被 docker run 指定的參數覆蓋。可以指定 --entrypoint 參數去覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
- ENTRYPOINT ["executable", "參數1","參數2"]:使用 exec 方式執行。推薦 - ENTRYPOINT command 參數1 參數2:shell 方式執行。
shell 方式下不能接受 CMD 的參數。
HEALTHCHECK:Docker 1.12版本後引入的判斷容器運行狀態是否正常。
通過上面對指令的了解後,我們最後通過一個小小的 demo 來給大家演示一下怎麼組合使用這些指令。
1.新建一個 index.html 文件,內容
2.新建 Dockerfile 文件
# 基於 nginx:1.17.9 鏡像構建FROM nginx:1.17.9
# 指定信息LABEL maintainer="hogwarts@testing-studio.com>"
# 設置環境變量ENV NGINX_VERSION 1.17.9
# 切換 root 用戶USER root
# 執行命令,安裝 curl 軟體,設置軟連結把 nginx 服務的日誌顯示到終端輸出上。RUN apt-get -yq update && apt-get install -y curl && \ln -sf /dev/stdout /var/log/nginx/access.log && \ln -sf /dev/stderr /var/log/nginx/error.log
# 設置容器內 /data 目錄為匿名卷VOLUME ["/data"]
# 設置工作目錄WORKDIR /data/html/
# 複製 index.html 文件到 WORKDIR 目錄下。COPY index.html .
# 映射 80 埠EXPOSE 80
# 此處 CMD 作為 ENTRYPOINT 的參數。# CMD ["nginx", "-g", "daemon off;"]CMD ["-g", "daemon off;"]
# 設置容器啟動的命令ENTRYPOINT ["nginx"]
# 檢查容器健康,通過訪問 Nginx 服務 80 埠,來判斷容器服務是否運行正常。HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 13.構建鏡像
4.運行容器
docker run --name nv1 -p 8080:80 n:v1啟動後,HEALTHCHECK 就會5秒鐘訪問一次 Nginx 服務,來確保容器運行的狀態。
服務正常的狀態。COMMAND 欄顯示的命令,為 ENTRYPOINT 指令和 CMD 指令合併後的命令。5.進入容器,驗證結果。
- exec:執行命令 - it:交互式 tty 終端 - nv1:容器啟動的名字 - bash:使用的 shell 類型
進入容器後,默認會切換到 /data/html 目錄,這個是 WORKDIR 指令指定的目錄。
可以使用 id 命令查看當前用戶信息,顯示為 root。這個是 USER 指令指定的用戶。
使用 ls 命令來查看當前目錄的文件,會看到 index.html 文件,這個是 COPY 指令複製到容器的文件。
使用 env 命令可以查看當前環境下有一個變量 NGINX_VERSION=1.17.9 這個是 ENV 指令指定的信息。
項目的鏡像的內容就先說到這裡,對Docker commit、Dockerfile是不是有了更多一些的了解了呢?
內容全面升級,4 個月 20+ 項目實戰強化訓練,資深測試架構師、開源項目作者親授 BAT 大廠前沿最佳實踐,帶你一站式掌握測試開發必備核心技能(對標阿里P6+,年薪50W+)!直推 BAT 名企測試經理,普遍漲薪 50%+!
⬇️ 點擊「閱讀原文」,提升測試核心競爭力!