Docker – 構建檔案



Dockerfile 本質上是一組用簡單文字格式編寫的指令,Docker 基於這些指令構建 Docker 映象。例如,它包含必須開始使用的基礎映象、軟體安裝指令、庫、依賴項、檔案複製以及應用程式環境中必要的執行命令。

可以把它想象成容器的食譜,列出食材和執行的烹飪步驟,最終生成一個可執行的 Docker 映象,就像一道美味佳餚。

閱讀本章以瞭解 Dockerfile 及其如何構建以建立和執行 Docker 映象。

Dockerfile 指令

Dockerfile 指令是在構建 Docker 映象過程中使用的一組命令。新增到 Dockerfile 中的每個指令都概述了最終執行應用程式的容器的環境和行為。

此處列出了**10 個基本的 Dockerfile 指令**以及示例,展示瞭如何使用它們 -

指令 描述
FROM 指定構建的基礎映象
RUN 在當前映象的新層上執行命令並提交
COPY 將檔案或目錄從主機檔案系統複製到映象檔案系統
WORKDIR 為任何後續指令設定工作目錄。
ENV 設定環境變數
EXPOSE 通知 Docker 容器在執行時對特定網路埠感興趣
CMD 為容器提供預設命令和/或引數
ENTRYPOINT 將容器配置為可執行檔案執行
VOLUME 建立具有指定路徑的掛載點,並將其標記為儲存外部掛載的卷
USER 設定執行映象時要使用的使用者名稱或 UID

示例

讓我們為一個簡單的 Node.js 應用程式建立一個 Dockerfile -

# Use the official Node.js image as a base
FROM node:14

# Set the working directory
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose port 3000 to the outside world
EXPOSE 3000

# Set environment variables
ENV NODE_ENV=production

# Default command to run when the container starts
CMD ["node", "index.js"]

此 Dockerfile 構建了一個 Node.js 應用程式的映象,設定了環境,安裝了依賴項,公開了埠,並定義瞭如何啟動應用程式。

如何從 Dockerfile 構建映象?

您可以使用一些重要的 Docker 命令透過 Docker 的命令列介面或 CLI 從 Dockerfile 構建 Docker 映象。

讓我們檢查一下根據上述示例 Dockerfile 使用基本 Docker 命令構建、標記和執行映象的分步指南。

構建 Docker 映象

要從 Dockerfile 構建 Docker 映象,請使用 docker build 命令 -

$ docker build -t my-node-app:v1 .
Build Docker Image
  • -t my-node-app:v1 - 要構建的映象將名為“my-node-app”,標籤為“v1”。
  • .(點) - 指定構建上下文,即包含 Dockerfile 的當前目錄。

列出 Docker 映象

此命令將列出當前系統上的所有 Docker 映象。

$ docker images
List Docker Images

這將顯示所有映象的列表,以及它們的標籤、大小和建立時間。

標記映象

您可以使用 docker tag 命令將現有映象標記到另一個標籤或倉庫名稱。

$ docker tag my-node-app:v1 my-registry/my-node-app:v1
Tagging an Imag
  • my-node-app:v1 - 映象名稱和當前標籤。
  • my-registry/my-node-app:v1 - 新倉庫和標籤的名稱。

執行 Docker 容器

要基於特定映象執行容器,請使用 docker run 命令 -

$ docker run -p 3000:3000 my-node-app:v1
  • -p 3000:3000 - 這會將主機的 3000 埠對映到容器內的 3000 埠(埠繫結)。
  • my-node-app:v1 - 這將是您要執行的映象的名稱以及該特定映象的標籤。

列出正在執行的容器

要檢視當前正在執行的容器,可以使用 docker ps 命令 -

$ docker ps
List the Running Containers

這將返回正在執行的容器列表,以及它們的 ID、狀態、埠和名稱。

停止正在執行的容器

要停止正在執行的容器,請使用 docker stop 命令,後跟容器 ID 或名稱 -

$ docker stop <container-id or container-name>
Stop a Running Container

您可以將“<container-id 或 container-name>”替換為您要停止的容器的實際 ID 或名稱。

刪除映象

要從系統中刪除映象,可以使用 docker rmi 命令。這將採用映象 ID 或標籤作為引數。

$ docker rmi my-node-app:v1 
Removing an Image

什麼是 .dockerignore 檔案?

.dockerignore 檔案與 .gitignore 的作用相同,定義了在 Docker 構建上下文中應忽略的檔案和目錄的模式。

當 Docker 構建映象時,它會將整個上下文目錄(使用 Docker build 命令指定)傳送到 Docker 守護程序。這意味著,使用“.dockerignore”排除不需要的檔案和目錄可以加快構建速度並減小最終映象的大小。

語法和用法

  • 在 Docker 構建上下文的根目錄中建立一個“.dockerignore”檔案。
  • 列出您希望 Docker 在構建過程中忽略的檔案和目錄(每行一個)。

示例 .dockerignore 檔案

以下是 Node.js 應用程式的示例“.dockerignore”檔案 -

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git

解釋

  • node_modules - 由於您希望將 npm install 用作構建的一部分,因此這會排除 node_module 目錄,避免將所有不需要的依賴項複製到 Docker 映象中。
  • npm-debug.log - 忽略 npm 除錯日誌,這些日誌在 Docker 映象中是不必要的。
  • Dockerfile - 這可以防止實際的 Dockerfile 本身被複制到 Docker 映象中。
  • .dockerignore - 它有助於防止 .dockerignore 檔案本身包含在構建上下文中。
  • .git - 排除 .git 目錄,以避免複製不必要的 Git 倉庫資訊。

最佳實踐

  • 包含特定檔案 - 僅將容器中構建和執行應用程式在 Docker 中所需的那些檔案和目錄包含在內。
  • 使用萬用字元 - 星號 (*) 和雙星號 (**) 可用於匹配檔案和目錄的萬用字元模式。
  • 保持簡潔 -“.dockerignore”本身應儘可能簡潔,以防止意外刪除檔案。

Dockerfile 中 COPY 和 ADD 指令的區別

COPY 和 ADD 都用於將檔案從主機複製到 Docker 映象中。但是,在大多數情況下,COPY 是更好的選擇;它更加透明。如果您只需要將檔案從源複製到映象中的目標,則應使用 COPY 指令。

ADD 具有其他功能,例如自動解壓縮檔案和從遠端 URL 獲取檔案的能力,但它會增加潛在的意外行為和可能的安全風險。如果您不需要這些功能,則 COPY 是首選指令,可以提高 Docker 檔案的清晰度和可維護性。

結論

在本章中,我們討論了 Dockerfile 的複雜性、使用它們的原因以及構建 Docker 映象所需的幾個重要的 Dockerfile 指令。

然後我們瞭解了一個 Dockerfile 的示例,以建立 NodeJs Docker 映象以及可用於構建和標記映象、執行容器、列出映象和容器等的各種命令。

最後,我們討論了為什麼在構建上下文中使用 Dockerignore 檔案是必要的。您現在已經具備了從 Dockerfile 建立和構建映象的充分能力。

廣告

© . All rights reserved.