核心概念
Docker
Docker
docker --version意思
一個用於打包和運行應用程序的工具,應用程序運行在隔離的容器中。
使用時機
當您希望應用程式在不同機器上使用相同的 OS 套件、運行時環境和依賴項時,使用它。
範例
docker --version請求範例
說明這個專案是否可以使用 Docker 運行。
程式設計
整理 Docker 映像檔、容器、Dockerfile、Compose、連接埠、磁碟區、日誌與常見問題的搜尋型指南。
33 個項目
核心概念
Docker
docker --version一個用於打包和運行應用程序的工具,應用程序運行在隔離的容器中。
當您希望應用程式在不同機器上使用相同的 OS 套件、運行時環境和依賴項時,使用它。
docker --version說明這個專案是否可以使用 Docker 運行。
核心概念
Docker daemon
無法連接到 Docker 守護進程構建映像並執行容器的背景服務。
如果 Docker 命令無法連接,Docker Desktop 或 Docker 服務可能未啟動。
無法連接到 Docker 守護進程檢查為什麼 Docker 命令無法連接到 Daemon。
核心概念
Image
node:20-alpine一個可重複使用的模板,用於創建容器。
圖片定義了容器啟動時包含的內容,例如 OS、運行時環境、函式庫和應用程式檔案。
node:20-alpine請告訴我,這個 Dockerfile 使用哪個基礎映像。
核心概念
Container
docker ps一個從映像檔創建的正在運行的或已停止的實例。
使用容器來執行應用程式、資料庫、快取或工作進程,以在隔離的環境中運行。
docker ps列出正在運行的容器,並解釋每個容器的作用。
核心概念
Registry
docker pull postgres:16一個儲存和下載 Docker 映像的伺服器。
Docker Hub and private registries are used to share base images or deployable app images.
docker pull postgres:16說明這個映像檔將從哪個位置下載。
Dockerfile
Dockerfile
Dockerfile一個定義如何構建 Docker 映像的文件。
用於安裝依賴項、複製應用程式檔案,並定義啟動應用程式的命令。
Dockerfile讀取此 Dockerfile 並總結構建步驟。
Dockerfile
FROM
FROM node:20-alpineDockerfile 指令,用於選擇基礎映像。
它決定了啟動的 OS 層級,並且通常是運行時版本。
變更基礎映像檔可能會影響可用的命令、安全更新和映像大小。
FROM node:20-alpine說明此 FROM 映像包含的內容。
Dockerfile
WORKDIR
WORKDIR /app設定映像檔內部的資料夾,後續的命令將在此資料夾中執行。
確保 COPY、RUN 和 CMD 命令從可預測的應用程式資料夾執行。
WORKDIR /app說明這個 Dockerfile 使用哪個資料夾作為應用程式目錄。
Dockerfile
COPY
COPY package.json package-lock.json ./將檔案從建構環境複製到映像檔中。
用於將依賴檔案、原始程式碼和靜態資源添加到映像檔中。
COPY package.json package-lock.json ./請告訴我,這個 COPY 步驟將哪些檔案添加到映像中。
Dockerfile
RUN
RUN npm ci在建立映像檔時,執行指令。
使用它來安裝 OS 套件、安裝依賴項或構建應用程式檔案。
RUN 在映像構建時發生,而不是在容器啟動時。
RUN npm ci區分 Dockerfile 中的構建時命令和容器啟動時的命令。
Dockerfile
CMD
CMD ["npm", "run", "start"]定義容器啟動時執行的預設命令。
運用它來啟動網頁伺服器、API 伺服器、工作進程或腳本。
CMD ["npm", "run", "start"]請告訴我此容器啟動時使用的命令。
Dockerfile
EXPOSE
EXPOSE 3000记录容器化应用程序预期的监听端口。
將其用作提示,然後使用 `docker run -p` 或 Compose 端口發布端口。
僅僅使用 EXPOSE 並不能讓應用程式從您的瀏覽器訪問。
EXPOSE 3000說明這個已公開的端口是否實際上已經被啟用。
Dockerfile
.dockerignore
node_modules一個從 Docker 構建上下文排除路徑的文件。
用於將本地依賴項、構建輸出、密碼和臨時檔案排除在映像檔構建之外。
node_modules檢查此 .dockerignore 是否排除不安全或不必要的檔案。
Dockerfile
Build context
docker build -t my-app .在图像构建过程中发送到 Docker 的文件夹。
在 Docker 构建中,最后的点通常表示当前文件夹是构建上下文。
較大的上下文會減慢構建速度,並且可能意外包含私有文件。
docker build -t my-app .說明此 Docker 構建可用的檔案。
Docker Compose
Docker Compose
docker compose up一個用於從一個 YAML 文件運行多個 Docker 服務的工具。
用於應用程式、資料庫、快取、工作器或本地開發堆疊。
docker compose up說明此 compose 檔案啟動的服務。
Docker Compose
services
services: web: db:在組件文件中定義的命名應用程式部分。
一個 Web 服務可能運行應用程序,而一個數據庫服務運行 PostgreSQL。
services: web: db:列出此 compose 文件中的服務以及每個服務的作用。
Docker Compose
docker compose up
docker compose up -d啟動在 Compose 文件中定義的服務。
當您希望服務在後台執行時,使用 -d 選項。
docker compose up -d啟動 Compose 服務,並顯示哪些服務正在運行。
Docker Compose
docker compose down
docker compose down停止並刪除由 Compose 創建的容器。
在完成本地開發堆疊時使用。
命名卷通常會保留,除非您明確刪除卷。
docker compose down停止此 Compose 堆疊,而無需刪除持久性資料。
指令
docker build
docker build -t my-app .從 Dockerfile 和上下文構建 Docker 映像。
在編寫 Dockerfile 或更改應用程式依賴項之後,使用它。
docker build -t my-app .構建此 Docker 映像,並總結任何構建錯誤。
指令
docker run
docker run --name my-app -p 3000:3000 my-app從映像檔建立並啟動一個容器。
在希望直接啟動一個容器,而無需使用 compose 時使用。
docker run --name my-app -p 3000:3000 my-app執行此圖像,並解釋瀏覽器 URL。
指令
docker ps
docker ps顯示正在執行的容器。
使用 `docker ps -a` 命令,當您也需要查看已停止的容器時。
docker ps顯示正在執行的容器及其發布的埠。
指令
docker stop
docker stop my-app停止正在運行的容器。
在刪除容器或釋放端口之前,使用它。
docker stop my-app使用 3000 端口停止容器。
指令
docker logs
docker logs my-app打印容器中的日誌。
運用它,當容器退出、崩潰,或應用程式沒有回應時。
docker logs my-app讀取此容器的日誌,並找到第一個錯誤。
指令
docker exec
docker exec -it my-app sh在已運行的容器內部執行指令。
用於檢查容器內部的檔案、環境變數或已安裝的工具。
在容器內手動進行的變更,當容器被重新建立時可能會消失。
docker exec -it my-app sh在這個容器中開啟一個 shell,並檢查其環境變數。
Port 與網路
ports
3000:3000將您機器上的埠映射到容器內的埠。
確保瀏覽器可以訪問運行在容器內的 Web 應用程式。
左侧是主机端口,右侧是容器端口。
3000:3000說明我應該打開哪個 URL 以配置這些端口設置。
Port 與網路
localhost in Docker
host.docker.internal在 Docker 中,localhost 可能指的是容器本身,而不是您的主机。
在 compose 網路中使用服務名稱,或者在容器需要連接到主機時,使用 host.docker.internal。
host.docker.internal說明為什麼 localhost 無法從這個容器訪問到資料庫。
檔案與資料
Volume
db-data:/var/lib/postgresql/dataDocker-managed storage that can persist data outside a container's lifecycle.
使用卷(volumes)來儲存資料庫資料或其他應在容器重新創建後仍然存在的檔案。
移除音量可能會刪除持久性資料。
db-data:/var/lib/postgresql/data請告訴我,哪些 compose 卷儲存了持久性資料。
檔案與資料
Bind mount
./src:/app/src將一個主機資料夾直接連接到容器路徑。
在開發期間使用它,以便主機上的代碼編輯出現在容器內部。
一個綁定掛載可以隱藏複製到映像中的檔案,這些檔案位於相同的路徑下。
./src:/app/src說明這個卷是命名卷還是綁定掛載。
檔案與資料
environment
DATABASE_URL=postgres://db:5432/app傳遞到容器的配置值。
使用環境變數來配置資料庫 URL、端口、模式、功能標誌和運行時設置。
不要將密碼嵌入到公開的映像檔中,也不要提交真實的密碼值。
DATABASE_URL=postgres://db:5432/app檢查這個容器需要哪些環境變數。
疑難排解
port is already allocated
綁定到 0.0.0.0:3000 失敗:埠已被分配。Docker cannot publish a host port because another process or container is already using it.
找到使用該埠的進程或容器,然後停止它或選擇不同的主機埠。
綁定到 0.0.0.0:3000 失敗:埠已被分配。找到哪些正在使用此 Docker 埠,並建議一個安全的解決方案。
疑難排解
container name is already in use
衝突。容器名稱 "/my-app" 已在使用中。已經存在同名的容器。
列出現有的容器,然後重用、刪除或重命名舊容器。
衝突。容器名稱 "/my-app" 已在使用中。在不意外刪除資料的情況下,解決此容器名稱衝突。
疑難排解
Build cache
docker build --no-cache -t my-app .Docker can reuse previous build layers to make builds faster.
如果更改似乎被忽略,請檢查 Dockerfile 的順序,或嘗試在不使用快取的情況下重新構建,以進行診斷。
--no-cache 參數可能會降低建置速度,請謹慎使用。
docker build --no-cache -t my-app .說明 Docker 構建快取是否可能隱藏了我的更改。
安全操作
docker system prune
docker system prune移除未使用的 Docker 資料,例如已停止的容器、未使用的網路和懸空的映像。
運用它,當 Docker 使用過多的磁碟空間,並且您了解將會移除哪些內容時。
使用額外的標誌,修剪功能可能會刪除您仍然關心的圖片或磁碟區。
docker system prune在修剪 Docker 之前,請顯示將會刪除什麼以及哪些數據是安全的。