- Docker 教程
- Docker - 首頁
- Docker - 概述
- Docker - 在 Linux 上安裝
- Docker - 安裝
- Docker - Hub
- Docker - 映象
- Docker - 容器
- Docker - 倉庫
- Docker - Compose
- Docker - 使用容器
- Docker - 架構
- Docker - 層
- Docker - 容器 & 主機
- Docker - 配置
- Docker - 容器 & Shell
- Docker - Dockerfile
- Docker - 構建檔案
- Docker - 公共倉庫
- Docker - 管理埠
- Docker - Web 伺服器
- Docker - 命令
- Docker - 容器連結
- Docker - 資料儲存
- Docker - 卷
- Docker - 網路
- Docker - 安全
- Docker - 工具箱
- Docker - 雲
- Docker - 構建雲
- Docker - 日誌記錄
- Docker - 持續整合
- Docker - Kubernetes 架構
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 託管
- Docker - 最佳實踐
- Docker 設定服務
- Docker - 設定 Node.js
- Docker - 設定 MongoDB
- Docker - 設定 NGINX
- Docker - 設定 ASP.Net
- Docker - 設定 MySQL
- Docker - 設定 Go
- Docker - 設定 Rust
- Docker - 設定 Apache
- Docker - 設定 MariaDB
- Docker - 設定 Jupyter
- Docker - 設定 Portainer
- Docker - 設定 Rstudio
- Docker - 設定 Plex
- Docker 設定 - Flame
- Docker 設定 - PostgreSql
- Docker 設定 - Mosquitto
- Docker 設定 - Grafana
- Docker 設定 - Nextcloud
- Docker 設定 - Pawns
- Docker 設定 - Ubuntu
- Docker 設定 - RabbitMQ
- Docker - 設定 Python
- Docker - 設定 Java
- Docker - 設定 Redis
- Docker - 設定 Alpine
- Docker - 設定 BusyBox
- Docker 設定 - Traefik
- Docker 設定 - WordPress
- Docker 有用資源
- Docker - 快速指南
- Docker - 有用資源
- Docker - 討論
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 .
- -t my-node-app:v1 - 要構建的映象將名為“my-node-app”,標籤為“v1”。
- .(點) - 指定構建上下文,即包含 Dockerfile 的當前目錄。
列出 Docker 映象
此命令將列出當前系統上的所有 Docker 映象。
$ docker images
這將顯示所有映象的列表,以及它們的標籤、大小和建立時間。
標記映象
您可以使用 docker tag 命令將現有映象標記到另一個標籤或倉庫名稱。
$ docker tag my-node-app:v1 my-registry/my-node-app:v1
- 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
這將返回正在執行的容器列表,以及它們的 ID、狀態、埠和名稱。
停止正在執行的容器
要停止正在執行的容器,請使用 docker stop 命令,後跟容器 ID 或名稱 -
$ docker stop <container-id or container-name>
您可以將“<container-id 或 container-name>”替換為您要停止的容器的實際 ID 或名稱。
刪除映象
要從系統中刪除映象,可以使用 docker rmi 命令。這將採用映象 ID 或標籤作為引數。
$ docker rmi my-node-app:v1
什麼是 .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 建立和構建映象的充分能力。