1. 程式人生 > 其它 >Docker入門(五):Dockerfile

Docker入門(五):Dockerfile

1. Docker 映象原理

  • Docker映象本質是什麼?
  • Docker中一個centos映象為什麼只有200MB,而一個centos作業系統的iso檔案要幾個G?
  • Docker中一個tomcat映象為什麼有500MB, 而一個tomcat安裝包只有70MB?
作業系統組成部分
  • 程序排程子系統
  • 程序通訊子系統
  • 記憶體管理子系統
  • 裝置管理子系統
  • 檔案管理子系統
  • 網路通訊子系統
  • 作業控制子系統

Linux檔案系統由bootfs和rootfs兩部分組成

  • bootfs: 包含bootloader(引導載入程式)和kernel(核心)

  • rootfs: root檔案系統,包含的就是典型Linux系統中的/dev. /proc, /bin, /etc等標準目錄和檔案

  • 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu, centos等

原理
  • Docker映象是由特殊的檔案系統疊加而成

  • 最底端是bootfs, 並使用宿主機的bootfs

  • 第二層是root檔案系統rootfs, 稱為base image

  • 然後再往上可以疊加其他的映象檔案

映象製作
  1. 容器轉為映象
  • docker commit 容器id 映象名稱:版本號
  • docker save -o 壓縮檔名稱 映象名稱:版本號
  • docker load -i 壓縮檔名稱

2)Dockerfile

2. Dockerfile概念及作用

  • Dockerfile是一個文字檔案
  • 包含了一條條指令
  • 每一條指令構建一層,基於基礎映象,最終構建出一個新的映象
  • 對於開發人員:可以為開發團隊提供一個完全一致的開發環境
  • 對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了
  • 對於運維人員:在部署時,可以實現應用的無縫移植

3. Dockerfile關鍵字

關鍵字 作用 備註
FROM 指定父映象 指定dockerfile基於哪個image構建
MAINTAINER 作者資訊 用來標明這個dockerfile誰寫的
LABEL 標籤 用來標明dockerfile的標籤 可以使用Label代替Maintainer 最終都是通過docker image基本資訊中可以檢視
RUN 執行命令 執行一段命令,預設是/bin/sh 格式:RUN command或者RUN ["command", "param1", "param2"]
CMD 容器啟動命令 提供啟動容器時候的預設命令 和ENTRYPOINT配合使用,格式 CMD command param1 param2或者 CMD ["command", "param1", "param2"]
ENTRYPOINT 入口 一般在製作一些執行就關閉的容器中會使用
COPY 複製檔案 build的時候複製檔案到image中
ADD 新增檔案 build的時候新增檔案到image中 不僅僅侷限於當前build上下文 可以來源於遠端服務
ENV 環境變數 指定build時的環境變數 可以在啟動的容器的時候 通過-e 覆蓋 格式 ENV name=value
ARG 構建引數 只在構建的時候使用的引數 如果有ENV 那麼ENV的相同名字的值始終覆蓋arg的引數
VOLUME 定義外部可以掛載的資料卷 指定構建的映象那些目錄可以啟動的時候掛載到檔案系統中 啟動容器的時時候使用-v繫結 格式VOLUME["目錄"]
EXPOSE 暴露埠 定義容器執行的時候監聽的埠,啟動容器的使用-p來繫結暴露埠,格式EXPOSE 8080或者 EXPOSE 8080/udp
WORKDIR 工作目錄 指定容器內部的工作目錄,如果沒有建立則自動建立,如果指定/使用的是絕對地址,如果不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行使用者 指定構建或者啟動的時候使用者,在RUN CMD ENTRYPOINT執行的時候的使用者
HEALTHECK 健康檢查 指定監測當前容器的健康監測的命令,基本上沒用,因為很多時候,應用本身有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的映象作為基礎映象的時候,當執行FROM完成之後,會執行ONBUILD命令,但是不影響當前映象,用處也不怎麼大
STOPSIGNAL 傳送訊號量到宿主機 該STOPSIGNAL指令設定將傳送到容器的系統呼叫訊號以退出
SHELL 指定執行指令碼的shell 指定RUN CMD ENTRYPOINT執行命令的時候使用的shell

4. 案例

  • 部署Springboot專案

    建立dockerfile

      FROM openjdk:8
      
      ADD springboot.jar app.jar
    

    EXPOSE 8080

    CMD java -jar app.jar

      docker build -f ./springboot_dockerfile -t myimage:1.0 .