學習Docker就應該掌握的dockerfile語法與指令

2021-12-26 霍格沃茲測試學院

收錄於話題 #測試開發實戰乾貨 | 原創合輯 113個



在日常的工作中,常常需要製作自己的項目的鏡像,一般通過以下兩種方式製作鏡像: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 1

3.構建鏡像


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%+!

⬇️ 點擊「閱讀原文」,提升測試核心競爭力!

相關焦點

  • Dockerfile企業實戰教程
    Docker通過讀取Dockerfile中的指令自動生成映像。一、dockerfile語法詳解Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。基於Dockerfile構建鏡像可以使用docker build命令。
  • Dockerfile 最佳實踐
    無論我們是學習 Docker 還是 Kubernetes,寫出一份非常優秀的 Dockerfile 文件就是我們的基本功,也是需要我們必須掌握的技能
  • Dockerfile 文件全面詳解
    如果您省略其中任何一個,構建器默認使用一個 latest 標籤。如果找不到該 tag 值,構建器將返回錯誤。--platform 標誌可用於在 FROM 引用多平臺鏡像的情況下指定平臺。例如,linux/amd64、linux/arm64、 或 windows/amd64。
  • 編寫Dockerfiles最佳實踐(Docker 18.09) | 附PDF下載
    .RUN cat /somefile.txtEOF...Step 2/3 :COPY somefile.txt .COPY failed:stat /var/lib/docker/tmp/docker-builder249218248/somefile.txt: no such file ordirectory3.使用stdin的Dockerfile從本地上下文構建鏡像使用此語法使用本地文件系統上下文構建鏡像
  • Docker用法
    ;Docker的啟動與停止systemctl 命令是系統服務管理器指令#啟動dockersystemctl start docker#停止dockersystemctl stop docker#重啟dockersystemctl restart docker#查看docker狀態systemctl
  • 編寫 Dockerfile 最佳實踐
    這裡,給你提供5點編寫建議,可幫助你編寫高效易用的Dockerfile。 1、減少鏡像層一次RUN指令形成新的一層,儘量Shell命令都寫在一行,減少鏡像層。/configure --prefix=/usr/local/php \    make -j 4 && make install && \    cd / && rm -rf php*至少能節省幾十M,甚至幾百M。
  • 製作一個超級精簡的 Docker 鏡像只需7步
    那好,接下來就請跟隨我來學習怎麼製作精簡 Docker 鏡像。鏡像層(Layers)在開始製作鏡像之前,首先了解下鏡像的原理,而這其中最重要的概念就是鏡像層(Layers)。鏡像層依賴於一系列的底層技術,比如文件系統(filesystems)、寫時複製(copy-on-write)、聯合掛載(union mounts)等,幸運的是你可以在很多地方學習到這些技術[1],這裡就不再贅述技術細節。
  • 新手入門系列之-React / Vue 應用持續集成Docker 化
    樸素的Dockerfile 首先準備一個有標準運行指令的Web應用,用腳手架creat-react-app或Vue CLI等生成的即可。dockerfile: Dockerfile volumes: - '.
  • Docker命令大整理,附示例!
    簡單舉例:docker run是docker container run的簡寫。三項--cpuset="0-2" 或 --cpuset="0,1,2"   # 綁定容器到指定CPU運行--dns 8.8.8.8          #指定容器使用的DNS伺服器,默認和宿主一致--dns-search example.com  # 指定容器DNS搜索域名,默認和宿主一致-e username="ritchie"  # 設置環境變量--env-file
  • Docker操作必看,原來這才是正確打開Docker的新方式!
    使用 docker rmi 命令,如下圖所示:docker rmi nginxdocker rmi 鏡像名稱 / docker rm 鏡像ID四、Dockerfile 自定義鏡像這裡我們以部署一個 jar 文件為例子,簡單說一下 Dockerfile 的使用方式,首先準備好一個普通 SpringBoot 的 jar 包,並且上傳至 Linux 伺服器。
  • Docker 基礎用法和命令幫助
    an image from a Dockerfile              # 通過 Dockerfile 定製鏡像commit    Create a new image from a container's changes # 提交當前容器為新的鏡像cp Copy files/folders from the containers filesystem to the
  • 自製GreatSQL Docker鏡像
    製作docker鏡像的環境基於CentOS 7.9:[root@greatsql]# cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)[root@greatsql]# uname -aLinux GreatSQL 3.10.0-1160.11.1.el7.x86_64 #1 S
  • 12個docker常用命令!以tomcat為例
    的學習,以下總結了docker常用的一些命令和操作從docker命令使用出發,梳理出如下命令結構圖:7:結束/停止 docker 容器$ docker stop tomcat8# 或$ docker kill tomcat9:重新啟動$ docker
  • 從rm命令來認識docker容器的刪除
    前言學習了解linux的朋友都知道,rm在linux中被用來刪除文件或者文件夾,如果是刪除一個文件,那麼命令是「rm -f XXXXX」,XXXXX為文件的地址,如果要刪除的是文件夾,那麼命令就會是「rm -rf XXXXX」,XXXXX為文件夾的地址。
  • SAST Weekly | Docker--新興的虛擬化技術
    -sSL https://get.daocloud.io/docker | sh2.3 測試Docker是否安裝成功可以輸入以下指令:(指令前面$或者#表示指令的輸入, 不需要用戶輸入)$ sudo docker run hello-world或者你先進入root用戶模式再輸入docker run hello-world也行
  • 經驗總結 | Docker 使用筆記
    /docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composedocker-compose --version3、Docker 設置國內鏡像源
  • 0863-如何使用Docker在Windows下快速構建Impala4.0環境
    本次發布一共包含700多個JIRA,新增了很多特性,包括但不限於:支持所有TPC-DS 99個查詢的語法,查詢不再需要重寫就可以在Impala上執行。新增的語法主要有GroupBy語句裡支持 ROLLUP、CUBE 和 GROUPING SETS (IMPALA-7204)SelectList中支持非關聯子查詢 (IMPALA-8954)支持 INTERSET 和 EXCEPT 集合操作 (IMPALA-9943、IMPALA-4974)透明的查詢重試 (IMPALA-9124)
  • Docker - 常用命令
    鏡像管理# 查看所有鏡像$ docker images# 搜索鏡像$ docker search nginx
  • 如何利用Docker快速建置OpenVINO Toolkit開發環境
    2018年5月INTEL有鑑於邊緣智能(EdgeAI)設備的硬體效能遠低於雲端機房,且不同硬體、開發工具間存在嚴重差異,造成工程師學習上極大的困擾,因此推出開放(免費)計算機視覺推論及神經網絡(深度學習)優化工具包「OpenVINO」(Open Visual Inference & Neural Network Optimization Toolkit)。
  • DOCKER 部署 NSQ
    nsq docker 部署nsq 主要有三個組件: nsqlookupd, nsqd, nsqadmin。