Docker入門(五):Dockerfile
阿新 • • 發佈:2022-03-29
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
-
然後再往上可以疊加其他的映象檔案
映象製作
- 容器轉為映象
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 .