Docker 入門教程(3)——Dockerfile


Dockerfile

Dockerfile是一個文本文件,用來定制鏡像。

鏡像是分層存儲的,前一層會是下一層的基礎。而鏡像的定制就是定制每一層鏡像在上一層做了什么改變。

Dockerfile其內包含一條條指令,每條指令構建一層,定義對上一層做了什么改變。

以定制spring cloud的eureka注冊中心為例:

工程結構為idea默認生成的eureka工程,使用maven package 生成jar包:

Dockerfile如下:

#以java8為父鏡像
FROM java:8

#將maven打包的jar包復制到/register.jar
ADD ./target/register-0.0.1-SNAPSHOT.jar /register.jar

#暴露容器的8761端口
EXPOSE 8761

#執行java -jar /register.jar命令
CMD ["java", "-jar", "/register.jar"]

在當前目錄執行docker build -t register .

可以看到每一條指令都生成了一個鏡像,我們可以使用docker images -a查看所有的鏡像。

但我們再次執行docker build -t register .時會發現每一條指令都顯示Using cache,這就是鏡像分層存儲的意義——構建緩存。

常用指令

  1. FROM 指定基礎鏡像
  2. RUN 執行命令
    1. RUN ,如: RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    2. RUN ["可執行文件", "參數1", "參數2"]
  3. COPY 復制文件
    1. COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
    2. 源路徑可以是多個,甚至可以是通配符,其通配符規則要滿足 Go 的 filepath.Match 規則
  4. ADD 更高級的復制文件
    1. ADDCOPY基本一致,區別在ADD源路徑可以是url,且如果 <源路徑> 為一個 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,ADD 指令將會自動解壓縮這個壓縮文件到 <目標路徑> 去。
    2. 在 Docker 官方的 Dockerfile 最佳實踐文檔 中要求,盡可能的使用 COPY,因為 COPY 的語義很明確,就是復制文件而已,而 ADD 則包含了更復雜的功能,其行為也不一定很清晰。最適合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合。
  5. CMD 容器啟動命令
  6. ENTRYPOINT 入口點
    1. ENTRYPOINTCMD的目的一樣,都是指定容器啟動程序與參數。
    2. 當指定了 ENTRYPOINT 后,CMD 的含義就發生了改變,不再是直接的運行其命令,而是將 CMD 的內容作為參數傳給 ENTRYPOINT 指令
  7. ENV 設置環境變量
  8. ARG 構建參數
  9. VOLUME 定義匿名卷
  10. EXPOSE 暴露端口

詳細介紹,可以查看Docker——從入門到實踐

鏡像構建上下文

上面我們構建鏡像時使用docker build -t register ..就是在指定構建的上下文,其作用在於執行docker build 命令時會將該目錄下的內容打包交給 Docker 引擎,以便后續的ADD/COPY找到需要復制的文件。

下圖紅線標記可以看出發送了43mb的文件給Docker引擎。

ps:只會打包構建上下文下的文件和文件夾,不會打包父目錄,所以使用ADD ../register.jar會報找不到文件。

參考資料

Docker——從入門到實踐

Docker,一個傲嬌的男人


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM