🚀 Docker 入門與實戰:從安裝到容器管理的完整指南 🌟
📖 簡介
在現代軟件開發中,容器化技術已經成為不可或缺的一部分。而 Docker 作為容器化領域的領頭羊,以其輕量級、高效和跨平臺的特性,深受開發者們的喜愛。本文將帶你從零開始,逐步掌握 Docker 的安裝、配置以及日常使用技巧,并結合實際案例為你提供一份詳實的 Docker 使用指南。無論你是初學者還是有一定經驗的開發者,都能從中受益!🚀
🔧 目錄
- 🚀 **Docker 入門與實戰:從安裝到容器管理的完整指南** 🌟
- 📖 **簡介**
- 🛠 **安裝 Docker**
- **1. 更新系統并安裝依賴**
- **2. 添加 Docker 官方 GPG 密鑰**
- **3. 設置 Docker 存儲庫**
- **4. 安裝 Docker 引擎**
- **5. 查看 Docker 和 Docker Compose 版本**
- **6. 啟動 Docker 服務**
- **方法 1:使用 `service` 命令**
- **方法 2:使用 `systemctl` 命令**
- **7. 驗證安裝**
- **8. 設置 Docker 服務開機自啟**
- 📊 **Docker 常用命令**
- **啟動容器**
- **基礎設置**
- **網絡設置**
- **容器的重啟策略**
- **重啟策略對比表**
- **設置容器的重啟策略**
- 💾 **鏡像與容器管理**
- **1. 查詢鏡像**
- **2. 拉取鏡像**
- **3. 刪除鏡像**
- **4. 啟動容器**
- **5. 進入容器**
- **6. 復制文件**
- **7. 加載鏡像**
- **8. 創建新鏡像**
- **9. 保存鏡像**
- **10. 掛載目錄**
- **11. 重命名鏡像**
- **12. 退出容器**
- ?? **解決常見問題**
- 1. 網絡超時問題
- **配置 DNS**
- **修改 Docker 配置**
- **Docker 配置文件解釋**
- **Docker 鏡像源列表**
- 2. 解決 GPG 公鑰缺失問題
- **適用場景**
- **如果問題仍未解決**
- 3. 解決 Docker 權限問題
- **步驟 1:創建 `docker` 組**
- **步驟 2:將當前用戶添加到 `docker` 組**
- **步驟 3:注銷并重新登錄**
- **步驟 4(可選):立即激活組更改**
- **步驟 5:驗證權限配置**
- **注意事項**
- 4. 配置 Docker 代理以登錄 Docker Hub
- **1. 創建 Docker 服務目錄和代理配置文件**
- **2. 配置代理環境變量**
- **3. 重新加載配置并重啟 Docker 服務**
- **4. 驗證代理配置是否生效**
- **測試 1:登錄 Docker Hub**
- **測試 2:拉取鏡像**
- **5. (可選):排除特定地址的代理**
- **注意事項**
- 5. 解決 Docker 容器無法啟動時的調試與修復方法
- **1. 查看容器日志**
- **2. 檢查容器配置**
- **3. 使用臨時容器掛載故障容器的卷**
- **4. 直接編輯容器文件系統**
- 方法 1:掛載容器的文件系統
- 方法 2:直接修改宿主機上的文件
- **5. 提交容器為鏡像并重新啟動**
- **6. 刪除并重新創建容器**
- **避免類似問題的建議**
- (1) **掛載代碼目錄**
- (2) **分離啟動邏輯**
- (3) **定期提交更改**
- 📋 **Docker Compose 命令詳解**
- **Docker Compose 常用選項**
- 🌟 **實戰案例:運行 Flask 應用**
- **1. 啟動容器**
- **重啟策略**
- **2. 進入容器**
- **3. 制作啟動腳本**
- **4. 保存和加載鏡像**
- **保存鏡像**
- **加載鏡像**
- **從容器創建新鏡像**
- **5. 掛載目錄**
- **6. 退出容器**
- 📚 **參考鏈接**
- 🎉 **總結**
🛠 安裝 Docker
1. 更新系統并安裝依賴
在安裝 Docker 之前,確保你的系統是最新的,并安裝必要的依賴包。
sudo apt-get update
sudo apt-get install ca-certificates curl
2. 添加 Docker 官方 GPG 密鑰
為了確保下載的軟件包安全,我們需要添加 Docker 的官方 GPG 密鑰并設置權限
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
如果遇到網絡問題、防火墻限制或 SSL 配置問題,可以使用國內鏡像源:
curl: (35) OpenSSL SSL_connect: 連接被對方重設 in connection to download.docker.com:443使用國內鏡像源下載 GPG 密鑰。例如,清華大學開源鏡像站:
sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
3. 設置 Docker 存儲庫
接下來,我們將 Docker 的存儲庫添加到系統的 APT 源列表中。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. 安裝 Docker 引擎
更新包索引后,安裝 Docker Engine 和相關工具。
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5. 查看 Docker 和 Docker Compose 版本
在安裝完成后,可以通過以下命令驗證 Docker 和 Docker Compose 是否正確安裝并查看其版本信息:
docker --version 或 docker -v
輸出示例:
Docker version 27.5.1, build 9f9e405
如果你使用的是新版 Docker Compose(從 Docker Desktop 3.4.0 和 Docker Engine 20.10.13 開始,Docker Compose 已被集成到 Docker CLI 中),可以使用以下命令查看版本:
docker compose version
輸出示例:
Docker Compose version v2.32.4
注意:舊版獨立安裝的 Docker Compose 使用
docker-compose --version
查看版本。
6. 啟動 Docker 服務
安裝完成后,Docker 服務通常會默認自啟。如果未啟動,可以通過以下命令手動啟動 Docker 服務。
方法 1:使用 service
命令
sudo service docker start # 啟動 Docker 服務
sudo service docker status # 查詢 Docker 服務狀態
方法 2:使用 systemctl
命令
sudo systemctl start docker.service # 啟動 Docker 服務
sudo systemctl status docker.service # 查詢 Docker 服務狀態
兩種方法的區別:
service
命令:這是一個較老的服務管理工具,兼容性較好,適用于 SysVinit 系統(如較舊的 Ubuntu 版本)。systemctl
命令:這是 systemd 系統的服務管理工具,適用于現代 Linux 發行版(如 Ubuntu 16.04 及更高版本)。推薦在支持 systemd 的系統中使用systemctl
,因為它功能更強大且更靈活。
7. 驗證安裝
通過運行一個簡單的測試鏡像來驗證 Docker 是否安裝成功。
sudo docker run hello-world
如果一切順利,你將看到類似以下的輸出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
8. 設置 Docker 服務開機自啟
為了確保 Docker 服務在宿主機啟動時自動運行,需要將其設置為開機自啟。以下是具體操作步驟:
-
檢查 Docker 服務狀態
systemctl status docker
-
啟用 Docker 服務開機自啟
如果未啟用開機自啟,執行以下命令:sudo systemctl enable docker
-
驗證設置是否生效
重啟宿主機后,檢查 Docker 服務是否已自動啟動:systemctl is-enabled docker
輸出示例:
enabled
📊 Docker 常用命令
命令 | 描述 |
---|---|
docker --version 或 docker -v | 查看 Docker 的版本信息 |
docker images | 查看本地所有鏡像 |
docker pull <image_name> | 從 Docker Hub 拉取鏡像 |
docker rmi <image_id> | 刪除本地鏡像 |
docker ps | 查看正在運行的容器 |
docker ps -a | 查看所有容器(包括已停止的) |
docker run -it <image_id> | 啟動一個新的容器并進入交互模式 |
docker start <container_id> | 啟動已停止的容器 |
docker stop <container_id> | 停止正在運行的容器 |
docker rm <container_id> | 刪除容器 |
docker restart <container_id> | 重啟容器 |
docker exec -it <container_id> /bin/bash [-c '執行的命令'] | 進入正在運行的容器內部并執行命令 |
啟動容器
啟動一個新的容器時,可以使用以下命令,并根據需要設置容器名稱、運行模式、偽終端分配和端口映射等選項:
docker run [OPTIONS] <image_id>
基礎設置
-
指定容器名稱:
--name="name"
為容器指定一個名稱。例如:docker run --name=my_container <image_id>
-
后臺運行:
-d
后臺運行容器,并返回容器 ID。例如:docker run -d <image_id>
-
前臺運行:
-i
和-t
前臺:-i
: 以交互模式運行容器,通常與-t
一起使用。是否分配偽終端:
-t
: 為容器重新分配一個偽輸入終端,通常與-i
同時使用例如:
docker run -it <image_id> /bin/bash
網絡設置
-
端口映射:
-p
指定主機和容器之間的端口映射關系。例如:docker run -p 8000:8000 <image_id>
容器的重啟策略
容器的重啟策略(RestartPolicy
)是一個非常重要的配置項,它決定了容器在退出或宿主機重啟時的行為。以下是對不同重啟策略的詳細說明:
重啟策略對比表
策略名稱 | 行為描述 |
---|---|
no | 默認值,容器不會自動重啟。 |
on-failure | 僅在容器以非零退出碼退出時重啟。可指定最大重試次數(如 on-failure:5 )。 |
always | 無論容器因何種原因停止,都會自動重啟。 |
unless-stopped | 總是重啟容器,除非容器被手動停止。 |
設置容器的重啟策略
-
創建容器時設置重啟策略
在運行容器時,可以通過--restart
參數設置重啟策略。例如:docker run -d --name my_container --restart always my_image
上述命令將容器的重啟策略設置為
always
,即無論容器因何種原因停止,都會自動重啟。 -
修改現有容器的重啟策略
如果容器已經創建,可以通過docker update
命令修改其重啟策略。例如:docker update --restart always my_container
-
驗證容器的重啟策略
使用以下命令查看容器的重啟策略:docker inspect my_container | grep -A 5 RestartPolicy
輸出示例:
"RestartPolicy": {"Name": "always","MaximumRetryCount": 0 },
💾 鏡像與容器管理
1. 查詢鏡像
查看本地所有鏡像:
docker images
2. 拉取鏡像
從 Docker Hub 拉取指定鏡像,例如 hello-world
:
docker pull hello-world
3. 刪除鏡像
刪除本地鏡像(需要先停止并刪除相關容器):
docker rmi <image_id>
4. 啟動容器
啟動一個新的容器,并指定名稱和端口映射:
docker run -it -p 8000:8000 --name my_container <image_id> /bin/bash
5. 進入容器
進入正在運行的容器并執行命令:
docker exec -it <container_id> /bin/bash
6. 復制文件
在容器和主機之間復制文件或目錄:
# 將容器內的文件復制到主機
docker cp <container_id>:/path/to/file /host/path/
# 將主機上的文件復制到容器內
docker cp /host/path/file <container_id>:/path/to/
7. 加載鏡像
在目標計算機上加載鏡像:
docker load -i <鏡像文件>.tar
8. 創建新鏡像
將現有容器保存為一個新的鏡像:
docker commit -m "<提交信息>" -a "<作者>" <容器ID> <新鏡像名稱>
9. 保存鏡像
將鏡像保存為 .tar
文件:
docker save -o <輸出文件名>.tar <鏡像名稱>
10. 掛載目錄
通過 -v
參數掛載本地目錄到容器中:
docker run [OPTIONS] -v [本地目錄]:[容器目錄] IMAGE[:TAG] /bin/bash
例如:
docker run -v /home/user/data:/app/data my_image:latest /bin/bash
11. 重命名鏡像
將鏡像重新命名:
docker tag IMAGE[:TAG] TARGET[:TAG]
例如:
docker tag my_image:latest my_image:v1.0
12. 退出容器
退出容器時,可以使用以下命令:
exit
?? 解決常見問題
1. 網絡超時問題
如果你在拉取鏡像時遇到網絡超時問題(如下所示),可以嘗試配置 DNS 或使用國內鏡像源。
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
配置 DNS
編輯 /etc/resolv.conf
文件,添加以下內容以使用公共 DNS 服務器:
nameserver 114.114.114.114 # 國內常用 DNS
nameserver 8.8.8.8 # Google 公共 DNS
注意:某些系統可能會自動覆蓋
/etc/resolv.conf
文件的更改。如果發現配置被重置,請檢查網絡管理工具或相關服務配置。
修改 Docker 配置
編輯 /etc/docker/daemon.json
文件,添加國內鏡像源以加速鏡像拉取:
{"registry-mirrors": ["https://x9r52uz5.mirror.aliyuncs.com", "https://dockerhub.icu", "https://docker.chenby.cn", "https://docker.1panel.live", "https://docker.awsl9527.cn", "https://docker.anyhub.us.kg", "https://dhub.kubesre.xyz" ],"max-concurrent-downloads": 10, "max-concurrent-uploads": 5, "default-shm-size": "1G", "debug": true, "experimental": false
}
注釋問題 :
JSON 文件本身不支持注釋(如 // 或 /* */)。雖然某些工具可能允許注釋,但 Docker 不會解析帶有注釋的 daemon.json 文件。
并且在 JSON 中,最后一個鍵值對后面不能有逗號。
Docker 配置文件解釋
配置項 | 值 | 說明 |
---|---|---|
registry-mirrors | ["https://vy2wneyx.mirror.aliyuncs.com", "https://dockerhub.icu", ...] | 鏡像加速地址列表,用于加速 Docker Hub 的鏡像拉取。 |
max-concurrent-downloads | 10 | 最大并發下載數,控制同時下載的層數量。 |
max-concurrent-uploads | 5 | 最大并發上傳數,控制同時上傳的層數量。 |
default-shm-size | "1G" | 容器默認共享內存大小,建議設置為較大的值以避免內存不足問題。 |
debug | true | 是否啟用調試模式,啟用后會輸出更詳細的日志信息。 |
experimental | false | 是否啟用實驗性功能,建議保持禁用狀態以確保穩定性。 |
Docker 鏡像源列表
鏡像源地址 | 說明 |
---|---|
https://<阿里云加速器ID>.mirror.aliyuncs.com | 阿里云官方鏡像,穩定且速度快 |
https://dockerhub.icu | 第三方鏡像,適合國內用戶 |
https://docker.chenby.cn | 社區維護鏡像,更新頻率較高 |
https://docker.1panel.live | 開源項目提供的鏡像服務 |
https://docker.awsl9527.cn | AWS 相關鏡像,適合 AWS 用戶 |
https://docker.anyhub.us.kg | 多地區鏡像,支持全球訪問 |
https://dhub.kubesre.xyz | Kubernetes 社區推薦鏡像 |
重啟 Docker 服務以應用更改:
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 解決 GPG 公鑰缺失問題
即使更換了國內鏡像源,仍可能遇到以下錯誤:
由于沒有公鑰,無法驗證下列簽名
這種問題通常是由于系統缺少用于驗證軟件包簽名的 GPG 公鑰導致的。此時可以嘗試手動導入缺失的 GPG 公鑰:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7EA0A9C3F273FCD8
說明:
hkp://keyserver.ubuntu.com:80
:指定密鑰服務器地址。7EA0A9C3F273FCD8
:需要導入的 GPG 公鑰 ID(根據實際錯誤信息替換為對應的公鑰 ID)。
適用場景
該命令通常用于解決因缺少公鑰導致的軟件包驗證失敗問題。例如,在安裝 Docker 或其他軟件時,可能會因為公鑰缺失而無法完成安裝。
如果問題仍未解決
- 確保網絡連接正常,并能夠訪問密鑰服務器。
- 如果仍然無法解決問題,可以嘗試跳過此步驟或參考其他解決方案(如手動下載并安裝相關軟件包)。
3. 解決 Docker 權限問題
默認情況下,Docker 命令需要 root
權限才能運行。為了避免每次使用 Docker 命令時都需要加 sudo
,可以將當前用戶添加到 docker
用戶組中。以下是具體步驟:
步驟 1:創建 docker
組
如果系統中尚未創建 docker
組,可以通過以下命令創建:
sudo groupadd docker
注意:大多數情況下,安裝 Docker 時會自動創建
docker
組。如果已經存在,此命令不會產生任何影響。
步驟 2:將當前用戶添加到 docker
組
將當前用戶添加到 docker
組中,以便無需 sudo
即可運行 Docker 命令:
sudo usermod -aG docker $USER
$USER
是當前登錄用戶的環境變量。如果你希望為其他用戶添加權限,請將$USER
替換為實際的用戶名。
步驟 3:注銷并重新登錄
為了使組更改生效,需要注銷并重新登錄系統。在注銷之前,請確保保存并關閉所有打開的應用程序,然后執行以下命令:
logout 或 exit
重新登錄后,組成員身份將更新。
步驟 4(可選):立即激活組更改
如果你不想注銷并重新登錄,可以通過以下命令在當前會話中立即激活組更改:
newgrp docker
步驟 5:驗證權限配置
運行以下命令驗證是否成功將用戶添加到 docker
組,并確認無需 sudo
即可運行 Docker 命令:
docker run hello-world
如果一切正常,你將看到類似以下的輸出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
注意事項
- 虛擬機環境:如果你在虛擬機中運行 Linux,可能需要重啟虛擬機以使組更改完全生效。
- 安全性:將用戶添加到
docker
組相當于賦予了該用戶root
權限,因為 Docker 容器可以訪問主機的資源。請謹慎操作,尤其是在多用戶環境中。
4. 配置 Docker 代理以登錄 Docker Hub
在某些情況下,Docker 的網絡連接可能會受到防火墻或代理限制的影響,尤其是在需要登錄 Docker Hub 時(如下所示)。
docker login
USING WEB-BASED LOGIN
To sign in with credentials on the command line, use 'docker login -u <username>'
Your one-time device confirmation code is: VGDP-KMZS
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate
Waiting for authentication in the browser…Error response from daemon: Get "https://registry-1.docker.io/v2/ ": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
為了解決這些問題,可以通過配置 Docker 的代理設置來確保網絡請求能夠正常通過。以下是具體操作步驟:
1. 創建 Docker 服務目錄和代理配置文件
首先,我們需要創建一個專門用于存放 Docker 服務配置的目錄,并在其中添加代理配置文件。
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
2. 配置代理環境變量
在打開的 http-proxy.conf
文件中,添加以下內容(請根據實際代理地址和端口進行修改):
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
說明:
HTTP_PROXY
和HTTPS_PROXY
分別用于指定 HTTP 和 HTTPS 請求的代理地址。- 如果你的代理需要身份驗證,可以在地址中包含用戶名和密碼,例如:
http://username:password@proxy-server:port
。
3. 重新加載配置并重啟 Docker 服務
完成代理配置后,需要重新加載 systemd 配置并重啟 Docker 服務以使更改生效。
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 驗證代理配置是否生效
為了確保代理配置已正確應用,可以嘗試登錄 Docker Hub 或拉取鏡像進行測試。
測試 1:登錄 Docker Hub
docker login -u your_username
如果代理配置正確,您應該能夠成功登錄,而不會遇到網絡超時或連接失敗的問題。
測試 2:拉取鏡像
docker pull hello-world
如果鏡像能夠順利下載,則說明代理配置已生效。
5. (可選):排除特定地址的代理
如果您希望某些地址(如本地鏡像倉庫或內網服務)不通過代理訪問,可以在配置文件中添加 NO_PROXY
環境變量。例如:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
說明:
NO_PROXY
用于指定不需要通過代理訪問的地址列表。- 地址可以是域名、IP 地址或通配符(如
.example.com
)。
注意事項
- 代理地址的有效性:確保代理地址和端口正確無誤,并且代理服務正在運行。
- 安全性:如果代理需要身份驗證,請確保用戶名和密碼的安全性,避免泄露敏感信息。
- 多用戶環境:在多用戶環境中使用代理時,請確保所有用戶都能正確訪問代理服務。
5. 解決 Docker 容器無法啟動時的調試與修復方法
在使用 Docker 的過程中,可能會遇到容器因某些錯誤而無法啟動的情況。這種問題可能由配置文件錯誤、端口沖突、依賴缺失等原因引起 [[1]]。當 docker start
命令失敗時,您可能無法直接使用 docker exec
進入容器進行調試。不過,以下幾種方法可以幫助您快速定位并解決問題。
1. 查看容器日志
首先,查看容器的日志是定位問題的關鍵步驟。通過日志,您可以了解容器啟動失敗的具體原因,例如配置文件錯誤、依賴服務未啟動等。
docker logs <container_name_or_id>
示例輸出:
Error: Port 8080 is already in use.
如果日志顯示端口被占用,可以通過修改端口映射或清理占用端口的進程來解決問題 [[4]]。
2. 檢查容器配置
使用 docker inspect
命令可以查看容器的詳細配置信息,包括啟動命令、掛載的卷、環境變量等。這些信息有助于排查潛在問題。
docker inspect <container_name_or_id>
查看啟動命令:
docker inspect <container_id> | grep Cmd
如果發現啟動命令有問題,可以重新創建容器并指定正確的命令。
3. 使用臨時容器掛載故障容器的卷
如果您的容器使用了數據卷來存儲持久數據,可以通過創建一個新的臨時容器來掛載故障容器的數據卷,并在其中進行調試。
docker run -it --volumes-from <faulty_container> --entrypoint /bin/bash <image_name>
示例:
docker run -it --volumes-from LuyeChat --entrypoint /bin/bash ubuntu
--volumes-from
參數允許新容器掛載故障容器的數據卷。<image_name>
是與原容器相同或兼容的鏡像(例如ubuntu
)。/bin/bash
是指定的入口點,用于啟動交互式終端。
在新容器中,您可以訪問和修改故障容器的文件系統。
4. 直接編輯容器文件系統
對于普通存儲,可以直接找到容器存儲的文件系統(通常位于 /var/lib/docker/overlay2/<container_id>/diff
),手動更改相關配置。
方法 1:掛載容器的文件系統
通過掛載容器的文件系統路徑到一個臨時容器中,您可以直接修改文件。
docker run -it --rm -v /var/lib/docker/overlay2/<container_id>/diff:/mnt ubuntu bash
/var/lib/docker/overlay2/<container_id>/diff
是原容器的文件系統路徑。/mnt
是新容器中掛載的目錄。ubuntu
是一個基礎鏡像,用于提供操作環境。
進入后,您可以直接修改掛載的文件。
方法 2:直接修改宿主機上的文件
如果您知道容器的文件存儲位置,可以直接在宿主機上修改文件。但請注意,這種方法可能會導致不穩定性或數據丟失,務必在備份的情況下進行操作 [[5]]。
5. 提交容器為鏡像并重新啟動
如果容器可以短暫啟動(即使很快退出),可以將其保存為鏡像,然后基于該鏡像啟動一個新的容器進行調試。
docker commit <container_id> temp_image
docker run -it temp_image bash
在新容器中,您可以修改代碼或配置文件。
6. 刪除并重新創建容器
如果以上方法都無法解決問題,可以考慮刪除容器并重新創建。
docker rm <container_id>
docker run [options] <image_name>
注意:刪除容器會導致容器內的數據丟失,因此在刪除前確保重要數據已備份。
避免類似問題的建議
為了避免未來再次出現類似問題,可以采取以下措施:
(1) 掛載代碼目錄
將代碼目錄掛載到宿主機上,而不是直接打包到鏡像中。這樣可以在宿主機上修改代碼,而無需重新構建鏡像或重啟容器。
docker run -v /host/path/to/code:/container/path/to/code <image_name>
(2) 分離啟動邏輯
在容器的啟動腳本中添加檢查邏輯,確保即使代碼有問題,容器也能進入調試模式。
#!/bin/bash
if [ ! -f "/path/to/config" ]; thenecho "Config file not found, starting shell for debugging..."exec /bin/bash
fi
exec your_service_command
(3) 定期提交更改
如果您在容器內進行了大量修改,定期使用 docker commit
將容器保存為鏡像,避免意外丟失數據。
docker commit <container_id> backup_image
📋 Docker Compose 命令詳解
命令 | 描述 |
---|---|
docker compose version | 查看 Docker Compose 的版本信息(適用于新版集成到 Docker CLI 的 Compose) |
docker compose up | 創建并啟動所有服務 |
docker compose down | 停止并移除所有容器、網絡和卷 |
docker compose ps | 列出所有容器的狀態 |
docker compose logs | 查看容器的日志輸出 |
docker compose exec <service_name> <command> | 在運行中的容器內執行命令 |
docker compose build | 構建或重新構建服務鏡像 如果你想強制重新構建,可以使用 --no-cache 參數:docker compose build --no-cache |
docker compose pull | 拉取服務所需的鏡像 |
docker compose push | 推送服務鏡像到鏡像倉庫 |
docker compose restart | 重啟服務容器 |
docker compose stop | 停止服務容器 |
docker compose start | 啟動服務容器 |
docker compose rm | 移除已停止的服務容器 |
Docker Compose 常用選項
選項 | 描述 | 示例 |
---|---|---|
--file 或 -f | 指定 Compose 文件的路徑。默認情況下,Docker Compose 會在當前目錄下尋找名為 docker-compose.yml 的文件。 | docker compose -f my-compose-file.yml up |
--project-name 或 -p | 指定項目的名稱。默認情況下,項目名稱是基于當前目錄的名稱。 | docker compose -p my_project up |
--env-file | 指定環境變量文件。默認情況下,Docker Compose 會讀取 .env 文件中的環境變量。 | docker compose --env-file .myenv up |
--profile | 啟用特定的配置文件(profiles)。Compose 文件中可以通過 profiles 定義不同的服務組。 | docker compose --profile dev up |
--progress | 設置進度輸出的格式。支持的值包括 auto 、tty 、plain 、json 和 quiet 。 | docker compose --progress plain up |
🌟 實戰案例:運行 Flask 應用
1. 啟動容器
假設我們有一個 Flask 應用的鏡像 edu/web_flask_server:V2
,我們可以使用以下命令啟動容器:
sudo docker run -it -p 8080:8080 --name web_flask edu/web_flask_server:V2 /bin/bash
說明:
-p 8080:8080
:將主機的 8080 端口映射到容器的 8080 端口。--name web_flask
:為容器指定名稱。/bin/bash
:啟動一個交互式終端。
重啟策略
容器設置 always
策略,確保應用在意外退出后能夠自動恢復:
sudo docker run -d -p 8080:8080 --name web_flask --restart always edu/web_flask_server:V2
說明:
--restart always
:確保容器在任何情況下都會自動重啟。-d
:后臺運行容器。
2. 進入容器
進入容器內部并啟動 Flask 應用:
docker exec -it web_flask /bin/bash -c 'python /work/web_flask/app.py'
說明:
docker exec -it
:在運行中的容器內執行命令。/bin/bash -c 'python /work/web_flask/app.py'
:啟動 Flask 應用。
3. 制作啟動腳本
為了方便操作,可以創建腳本 start_webflask.sh
:
# start_webflask.sh
docker restart web_flask
docker exec -it web_flask /bin/bash -c 'python /work/web_flask/app.py'
4. 保存和加載鏡像
在實際開發中,可能需要將容器的狀態保存為鏡像,或者將鏡像導出為 .tar
文件進行備份或傳輸。
保存鏡像
將鏡像保存為 .tar
文件:
docker save -o web_flask_server_V3.tar edu/web_flask_server:V2
說明:
-o
:指定輸出文件名。edu/web_flask_server:V2
:要保存的鏡像名稱。
執行此命令后,Docker 將會在當前工作目錄下生成一個名為 web_flask_server_V3.tar
的文件。這個文件可以用于備份、傳輸或在其他計算機上加載為 Docker 鏡像。
加載鏡像
在目標計算機上加載 .tar
文件中的鏡像:
docker load -i web_flask_server_V3.tar
說明:
-i
:指定輸入文件。- 加載完成后,該鏡像將出現在本地的 Docker 鏡像列表中。
從容器創建新鏡像
如果需要將容器的當前狀態保存為一個新的鏡像,可以使用以下命令:
docker commit -m "提交信息" -a "作者" web_flask edu/web_flask_server:V2
說明:
-m
:添加提交信息。-a
:指定作者信息。web_flask
:容器 ID 或名稱。edu/web_flask_server:V2
:新生成的鏡像名稱。
執行此命令后,Docker 會將容器的當前狀態保存為一個新的鏡像。這個鏡像可以用于創建新的容器或分享給其他人使用。
5. 掛載目錄
在運行容器時,可以通過 -v
參數掛載本地目錄到容器中,以便實現數據持久化或共享文件:
docker run -it -p 8080:8080 -v /host/path:/container/path --name web_flask edu/web_flask_server:V2 /bin/bash
說明:
-v /host/path:/container/path
:將主機的/host/path
目錄掛載到容器的/container/path
目錄。
6. 退出容器
完成操作后,可以通過以下命令退出容器:
exit
📚 參考鏈接
本文的內容參考了以下優質資源,推薦讀者進一步閱讀以深入了解 Docker 的使用技巧和高級功能:
-
Essential Docker Commands - Linux Handbook
提供了 Docker 常用命令的詳細說明和示例。 -
Docker 安裝指南 - Docker 官方文檔
官方文檔,包含在 Ubuntu 上安裝 Docker 的完整步驟。 -
Linux 中國 - Docker 入門與實踐
針對初學者的 Docker 實踐教程,涵蓋基礎操作和常見問題解決。 -
More Essential Docker Commands - Linux Handbook
進一步擴展了 Docker 命令的使用場景和技巧。 -
2024年最新國內可用的Docker鏡像加速器地址匯總
🎉 總結
通過本文的學習,你應該已經掌握了 Docker 的基本安裝、配置和使用方法。無論是管理鏡像、啟動容器,還是解決常見問題,Docker 都提供了強大的工具集來幫助我們簡化開發流程。希望這篇指南能夠為你的 Docker 之旅提供幫助!🚀
如果你有任何問題或建議,歡迎在評論區留言交流!💬