Docker 入門與實戰:從安裝到容器管理的完整指南

🚀 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 --versiondocker -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 服務在宿主機啟動時自動運行,需要將其設置為開機自啟。以下是具體操作步驟:

  1. 檢查 Docker 服務狀態

    systemctl status docker
    
  2. 啟用 Docker 服務開機自啟
    如果未啟用開機自啟,執行以下命令:

    sudo systemctl enable docker
    
  3. 驗證設置是否生效
    重啟宿主機后,檢查 Docker 服務是否已自動啟動:

    systemctl is-enabled docker
    

    輸出示例:

    enabled
    

📊 Docker 常用命令

命令描述
docker --versiondocker -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總是重啟容器,除非容器被手動停止。
設置容器的重啟策略
  1. 創建容器時設置重啟策略
    在運行容器時,可以通過 --restart 參數設置重啟策略。例如:

    docker run -d --name my_container --restart always my_image
    

    上述命令將容器的重啟策略設置為 always,即無論容器因何種原因停止,都會自動重啟。

  2. 修改現有容器的重啟策略
    如果容器已經創建,可以通過 docker update 命令修改其重啟策略。例如:

    docker update --restart always my_container
    
  3. 驗證容器的重啟策略
    使用以下命令查看容器的重啟策略:

    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-downloads10最大并發下載數,控制同時下載的層數量。
max-concurrent-uploads5最大并發上傳數,控制同時上傳的層數量。
default-shm-size"1G"容器默認共享內存大小,建議設置為較大的值以避免內存不足問題。
debugtrue是否啟用調試模式,啟用后會輸出更詳細的日志信息。
experimentalfalse是否啟用實驗性功能,建議保持禁用狀態以確保穩定性。
Docker 鏡像源列表
鏡像源地址說明
https://<阿里云加速器ID>.mirror.aliyuncs.com阿里云官方鏡像,穩定且速度快
https://dockerhub.icu第三方鏡像,適合國內用戶
https://docker.chenby.cn社區維護鏡像,更新頻率較高
https://docker.1panel.live開源項目提供的鏡像服務
https://docker.awsl9527.cnAWS 相關鏡像,適合 AWS 用戶
https://docker.anyhub.us.kg多地區鏡像,支持全球訪問
https://dhub.kubesre.xyzKubernetes 社區推薦鏡像

重啟 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:注銷并重新登錄

為了使組更改生效,需要注銷并重新登錄系統。在注銷之前,請確保保存并關閉所有打開的應用程序,然后執行以下命令:

logoutexit

重新登錄后,組成員身份將更新。


步驟 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_PROXYHTTPS_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設置進度輸出的格式。支持的值包括 autottyplainjsonquietdocker 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 之旅提供幫助!🚀

如果你有任何問題或建議,歡迎在評論區留言交流!💬

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70107.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 插入替換語句(replace into statement)

我們日常使用 insert into 語句向表中插入數據時&#xff0c;一定遇到過主鍵或唯一索引沖突的情況&#xff0c;MySQL的反應是報錯并停止執行后續的語句&#xff0c;而replace into語句可以實現強制插入。 文章目錄 一、replace into 語句簡介1.1 基本用法1.2 使用set語句 二、注…

基于SpringBoot+Vue的智慧校園管理系統設計和實現(源碼+文檔+部署講解)

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 .&#x1f680; 技術架構技術棧全景 &#x1f3af; 功能模塊功能矩陣表&#x1f4ca; 數據庫設計核心ER關系圖 &#x1f4bb; 核心…

【Three.js】JS 3D library(一個月進化史)

#春節過完了&#xff0c;該繼續投入學習了~ 作為一個平面開發者&#xff0c;想要增進更多的技能&#xff0c;掌握web3D開發# Day 1 了解熟悉Three.js&#xff0c;著重基礎理論 學習資源&#xff1a; 前端可視化從0-1 Day 2 寫一個簡易demo 搭建環境-->安裝包-->創建…

moveable 一個可實現前端海報編輯器的 js 庫

目錄 緣由-胡扯本文實驗環境通用流程1.基礎移動1.1 基礎代碼1.1.1 data-* 解釋 1.2 操作元素創建1.3 css 修飾1.4 cdn 引入1.5 js 實現元素可移動1.6 圖片拖拽2.縮放3.旋轉4.裁剪 懶得改文案了&#xff0c;海報編輯器換方案了&#xff0c;如果后面用別的再更。 緣由-胡扯 導火…

Apollo 9.0 速度動態規劃決策算法 – path time heuristic optimizer

文章目錄 1. 動態規劃2. 采樣3. 代價函數3.1 障礙物代價3.2 距離終點代價3.3 速度代價3.4 加速度代價3.5 jerk代價 4. 回溯 這一章將來講解速度決策算法&#xff0c;也就是SPEED_HEURISTIC_OPTIMIZER task里面的內容。Apollo 9.0使用動態規劃算法進行速度決策&#xff0c;從類名…

【Day41 LeetCode】單調棧問題

一、單調棧問題 單調棧問題通常是在一維數組中尋找任一個元素的右邊或者左邊第一個比自己大或者小的元素的位置。 1、每日溫度 739 這題的目的是對于當天&#xff0c;找到未來溫度升高的那一天&#xff0c;也就是當前元素的右邊第一個比自己大的元素。所以我們需要維護一個單…

Cherno C++ P55 宏

這篇文章我們講一下C當中的宏。其實接觸過大型項目的朋友可能都被詭異的宏折磨過。 宏是在預處理當中&#xff0c;通過文本替換的方式來實現一些操作&#xff0c;這樣可以不用反復的輸入代碼&#xff0c;幫助我們實現自動化。至于預處理的過程&#xff0c;其實就是文本編輯&am…

web第三次作業

彈窗案例 1.首頁代碼 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>綜合案例</title><st…

深入解析LVS命令參數及DR模式下的ARP抑制原理

深入解析LVS命令參數及DR模式下的ARP抑制原理 一、LVS簡介 Linux Virtual Server (LVS) 是基于Linux內核的高性能負載均衡解決方案&#xff0c;支持NAT、DR&#xff08;Direct Routing&#xff09;和TUN&#xff08;IP Tunneling&#xff09;三種模式。其中&#xff0c;ipvsad…

阿里云一鍵部署DeepSeek-V3、DeepSeek-R1模型

目錄 支持的模型列表 模型部署 模型調用 WebUI使用 在線調試 API調用 關于成本 FAQ 點擊部署后服務長時間等待 服務部署成功后&#xff0c;調用API返回404 請求太長導致EAS網關超時 部署完成后&#xff0c;如何在EAS的在線調試頁面調試 模型部署之后沒有“聯網搜索…

Win10環境借助DockerDesktop部署大數據時序數據庫Apache Druid

Win10環境借助DockerDesktop部署最新版大數據時序數據庫Apache Druid32.0.0 前言 大數據分析中&#xff0c;有一種常見的場景&#xff0c;那就是時序數據&#xff0c;簡言之&#xff0c;數據一旦產生絕對不會修改&#xff0c;隨著時間流逝&#xff0c;每個時間點都會有個新的…

【第13章:自監督學習與少樣本學習—13.1 自監督學習最新進展與實現方法】

凌晨三點的實驗室,博士生小王盯著屏幕里正在"自娛自樂"的神經網絡——這個沒有吃過一張標注圖片的模型,正在通過旋轉、拼圖、填色等游戲任務,悄悄掌握著理解世界的秘訣。這種魔法般的修煉方式,正是當今AI領域最炙手可熱的技術:自監督學習。 一、打破數據枷鎖:自…

數據庫報錯1045-Access denied for user ‘root‘@‘localhost‘ (using password: YES)解決方式

MySQL 報錯 1045 表示用戶root從localhost連接時被拒絕訪問&#xff0c;通常是因為密碼錯誤、權限問題或配置問題。以下是解決該問題的常見方法&#xff1a; 方法一&#xff1a;檢查用戶名和密碼 ? 確認用戶名和密碼是否正確&#xff1a; 確保輸入的用戶名和密碼完全正確&am…

八大排序——簡單選擇排序

目錄 1.1基本操作&#xff1a; 1.2動態圖&#xff1a; 1.3代碼&#xff1a; 代碼解釋 1. main 方法 2. selectSort 方法 示例運行過程 初始數組 每輪排序后的數組 最終排序結果 代碼總結 1.1基本操作&#xff1a; 選擇排序&#xff08;select sorting&#xff09;也…

與傳統光伏相比 城電科技的光伏太陽花有什么優勢?

相比于傳統光伏&#xff0c;城電科技的光伏太陽花有以下優勢&#xff1a; 一、發電效率方面 智能追蹤技術&#xff1a;光伏太陽花通過內置的智能追蹤系統&#xff0c;采用全球定位跟蹤算法&#xff0c;能夠實時調整花瓣&#xff08;即光伏板&#xff09;的角度&#xff0c;確…

FPGA的星辰大海

編者按 時下風頭正盛的DeepSeek,正值喜好宏大敘事的米國大統領二次上崗就業,OpenAI、軟銀、甲骨文等宣布投資高達5000億美元“星際之門”之際,對比尤為強烈。 某種程度上,,是低成本創新理念的直接落地。 包括來自開源社區的諸多贊譽是,并非體現技術有多“超越”,而是…

Elasticsearch:15 年來致力于索引一切,找到重要內容

作者&#xff1a;來自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 剛剛 15 歲了&#xff01;回顧過去 15 年的索引和搜索&#xff0c;并展望未來 15 年的相關內容。 Elasticsearch 剛剛成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章&#xff08;帶有標志性的…

嵌入式軟件、系統、RTOS(高軟23)

系列文章目錄 4.2嵌入式軟件、系統、RTOS 文章目錄 系列文章目錄前言一、嵌入式軟件二、嵌入式系統三、嵌入式系統分類四、真題總結 前言 本節講明嵌入式相關知識&#xff0c;包括軟件、系統。 一、嵌入式軟件 二、嵌入式系統 三、嵌入式系統分類 四、真題 總結 就是高軟筆記…

數據結構 day02

3. 線性表 3.1. 順序表 3.1.3. 順序表編程實現 操作&#xff1a;增刪改查 .h 文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define N 10 typedef struct seqlist {int data[N];int last; //代表數組中最后一個有效元素的下標 } seqlist_t;//1.創建一個空的順序表 seq…

數據恢復-01-機械硬盤的物理與邏輯結構

磁盤存儲原理 磁盤存儲數據的原理&#xff1a; 磁盤存儲數據的原理是利用磁性材料在磁場作用下的磁化性質&#xff0c;通過在磁盤表面上劃分成許多小區域&#xff0c;根據不同的磁化方向來表示0和1的二進制數據&#xff0c;通過讀寫磁頭在磁盤上的移動&#xff0c;可以實現數據…