iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0

DockerFile簡介

1. Dockerfile 是什麼?

Dockerfile 是一個用來定義 Docker Image 的文本文件,它包含了一系列指令,指示 Docker 如何從零構建一個完整的映像。每個指令都會在構建過程中執行,最終生成一個可以部署的 Docker Image。

2. Dockerfile 的工作原理

當你執行 docker build 命令時,Docker 會依據 Dockerfile 的每一行指令,逐步構建 Image。這些指令通常是分層構建的,這意味著每一條指令會生成一個新的層,最終所有層一起組成完整的 Image。層化的好處是提高了構建的效率,因為 Docker 可以快取每一層的結果,如果有些層已經沒有變化,則不需要重新執行。

Dockfile 欄位&指令說明

在 Dockerfile 中,沒有強制要求的必要欄位。但有一些欄位是幾乎所有 Dockerfile 都會使用的,這些欄位幫助你正確地構建和運行映像。

以下是常見且建議使用的欄位和指令,但並非「必要」的:

1. FROM

  • 功能:指定基礎映像,是構建 Docker 映像的起點。
  • 必要性:幾乎所有 Dockerfile 都會有這一行。它指定了映像的基礎環境,沒有 FROM 的話,Dockerfile 無法運行。
  • 範例
    FROM ubuntu:20.04
    
  • 重要性:強烈建議使用,因為它定義了映像的基礎環境。

2. LABEL

  • 功能:用來添加一些元數據,如作者信息或版本號,方便管理。
  • 必要性:不是必須的,但有助於記錄映像的相關信息。
  • 範例
    LABEL maintainer="you@example.com"
    

3. RUN

  • 功能:用來在構建時執行命令,比如安裝軟件包、配置環境等。
  • 必要性:可選,但大多數 Dockerfile 都會用到它來執行一些安裝或配置的任務。
  • 範例
    RUN apt-get update && apt-get install -y nginx
    

4. COPYADD

  • 功能:將本地文件或目錄複製到容器的指定位置。COPY 用於簡單的文件複製,ADD 具有更多的功能,比如自動解壓 tar 文件。
  • 必要性:可選,如果你需要把本地文件複製到映像中,才會用到。
  • 範例
    COPY ./my-app /app
    

5. CMDENTRYPOINT

  • 功能
    • CMD:指定容器啟動時的默認命令或參數。可以被 docker run 的命令行覆蓋。
    • ENTRYPOINT:指定容器啟動時的主命令,通常與 CMD 配合使用,用來設置默認參數。
  • 必要性:大多數 Dockerfile 都會設置一個 CMDENTRYPOINT,來確保容器啟動時有默認的操作。如果沒有設置這些指令,容器啟動後會退出。
  • 範例
    CMD ["nginx", "-g", "daemon off;"]
    

6. EXPOSE

  • 功能:告訴 Docker 映像會使用哪些端口,這樣在運行時可以對應這些端口進行映射。但這不會自動打開端口,必須在 docker run 時明確指定。
  • 必要性:可選,但如果你的應用程序使用特定端口來提供服務(例如 Web 服務器),建議指定。
  • 範例
    EXPOSE 80
    

7. WORKDIR

  • 功能:設定容器內部的工作目錄。之後的命令都會在這個目錄下執行。
  • 必要性:可選,但如果你有特定的工作目錄需求,設置 WORKDIR 可以減少手動切換目錄的需要。
  • 範例
    WORKDIR /app
    

8. ENV

  • 功能:設定環境變數,可以在容器運行時使用這些變數。
  • 必要性:可選,但如果應用需要某些環境變數來運行,這個指令非常有用。
  • 範例
    ENV MYSQL_ROOT_PASSWORD=my-secret-pw
    

範例 Dockerfile

以下是一個常見的 Dockerfile 範例,它使用了部分上面提到的指令:

# 基礎映像
FROM ubuntu:20.04

# 添加作者信息
LABEL maintainer="you@example.com"

# 安裝必要軟件
RUN apt-get update && apt-get install -y nginx

# 複製應用程序文件
COPY ./my-app /var/www/html

# 設定工作目錄
WORKDIR /var/www/html

# 設定環境變數
ENV APP_ENV=production

# 暴露端口
EXPOSE 80

# 設定容器啟動時的命令
CMD ["nginx", "-g", "daemon off;"]

vscodeDockerfile

小結:

  • 必要的欄位:在技術上沒有完全強制的必要欄位,但 FROM 幾乎是必須的,因為它定義了映像的基礎環境。
  • 常見的欄位:其他如 RUNCOPYCMD 也是大多數 Dockerfile 都會使用的,因為它們用來配置和定義容器的行為。

今天Dockfile學習到這邊,明天來執行Docker Build!


上一篇
Day06-利用Docker快速建置工作所需環境
下一篇
Day08-客製化Docker Image
系列文
從零開始的DevOps猴!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言