一場史詩級的冒險——Docker命令大航海!

各位親愛的開發者、運維勇士、以及所有對現代化軟件部署充滿好奇的小伙伴們!今天,我們將開啟一場史詩級的冒險——Docker命令大航海!我們將乘坐“Docker號”巨輪,駛向容器化技術的星辰大海。

這不是一篇枯燥的說明書,而是一份充滿活力、深入淺出、甚至有點好玩的終極指南。我們將用超過30000字的篇幅,把Docker的常用命令掰開了、揉碎了,配上生動的比喻、實戰的場景、以及那些官方文檔可能沒告訴你的“騷操作”和“坑爹陷阱”,讓你不僅看得明白,更能用得瀟灑。

準備好了嗎?系好安全帶,我們的Docker奇幻之旅,正式起航!


<摘要>

Docker,這個席卷全球的容器化技術,早已不是運維的專屬玩具,而是每一位現代開發者必須掌握的利器。本文將以一場趣味橫生的“大航海”為主題,將Docker的核心概念化為海洋與船只,系統性地解析其最常用、最核心的命令。從最基本的docker run啟航,到復雜多容器編排的docker compose遠征;從鏡像構建的docker build造船廠,到網絡與數據管理的港口與倉庫。我們將不僅講解命令的語法,更深入剖析其背后的原理、使用場景、最佳實踐以及常見陷阱。本文旨在成為一份集教程、手冊、秘籍于一體的終極指南,讓讀者在輕松愉快的閱讀中,真正掌握Docker的強大力量,成為一名自信的“容器船長”。


<解析>

第一章:起錨!—— Docker基礎與安裝驗證

在我們開始指揮(輸入命令)之前,得先確保我們的“船長室”(命令行終端)和“Docker引擎”都準備就緒。

1.1 世界觀設定:容器 vs 虛擬機

想象一下,你要運送一批玩具。

  • 虛擬機 (Virtual Machine):相當于買了幾臺全新的大卡車,每臺卡車上都要安裝一個完整的操作系統(司機、發動機、油箱一應俱全),然后再把玩具和玩具的運行環境(比如一個小架子)放進去。笨重、耗油(資源)、啟動慢。
  • 容器 (Container):相當于使用了標準化集裝箱。所有玩具和它需要的小架子都打包在一個集裝箱里。這個集裝箱可以放在任何一艘大船(主機操作系統) 上,由船上的統一引擎(Docker Engine)來管理和運輸。輕便、高效、秒級啟動。

Docker就是這套集裝箱系統的發明者和標準制定者。 它包含了:

  • Docker Daemon ( dockerd ): 船的引擎室,常駐后臺的核心程序,負責干重活(構建、運行、分發容器)。
  • Docker Client ( docker ): 船長的對講機,我們通過它向引擎室發送命令。
  • Docker Registry: 世界的集裝箱倉庫(比如最大的公共倉庫 Docker Hub),用于存儲和分享鏡像。
  • Image集裝箱的藍圖。它是一個只讀的模板,包含了運行所需的一切:代碼、運行時、庫、環境變量等。
  • Container根據藍圖實例化出來的、正在運行的集裝箱。藍圖是靜態的,容器是動態的。
1.2 安裝Docker引擎

不同的操作系統,安裝方式不同。我們的“Docker號”巨輪需要在不同的海域(系統)中航行。

  • Linux (Ubuntu/CentOS): 通常通過官方源安裝,過程最純粹。

    # Ubuntu 示例
    sudo apt-get update
    sudo apt-get install docker.io
    # 或者使用官方安裝腳本(總是獲取最新版)
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    
  • macOS / Windows: 下載并安裝 Docker Desktop。這是一個“全家桶”,包含了Docker引擎、客戶端、圖形化界面、以及必需的Linux虛擬機(因為Mac/Windows內核不是Linux,需要一個小型VM來運行容器)。安裝后,一個可愛的鯨魚圖標會出現在你的狀態欄。

1.3 驗證安裝與Hello World

安裝完成后,打開你的終端(對講機),喊出你的第一道命令:

docker --version

如果安裝成功,它會告訴你Docker的版本號,證明“對講機”和“引擎室”連接正常。

接下來,讓我們拉起第一個集裝箱,一個最經典的“Hello World”:

docker run hello-world

發生了什么?魔法!

  1. docker: 你拿起了對講機。
  2. run: 你下達了“運行”的指令。
  3. hello-world: 你要運行的集裝箱藍圖(鏡像)的名字。
  4. 執行流程
    • 船長(Client)通過對講機告訴引擎室(Daemon):“我們要運行hello-world!”
    • 引擎室一看,本地倉庫沒有名叫hello-world的藍圖(鏡像)。
    • 引擎室立刻聯系遠方的公共倉庫(Docker Hub):“嘿,給我一份hello-world的藍圖!”
    • 倉庫把藍圖下載到本地(Pull complete)。
    • 引擎室根據藍圖,制造并啟動一個集裝箱(容器)。
    • 這個集裝箱里只有一個簡單的程序,它的任務就是打印出一段歡迎信息和一些學習資料,然后任務完成,集裝箱停止運行。

恭喜你,你已經成功運行了第一個Docker容器!你已經成為了一名見習水手!

第二章:造船廠與藍圖庫 —— 鏡像(Image)管理命令

鏡像(Image)是容器的基礎。就像沒有藍圖造不出集裝箱一樣,沒有鏡像也跑不起容器。這一章,我們學習如何獲取、查看、制作和管理這些寶貴的“藍圖”。

2.1 docker search - 在倉庫里搜尋藍圖

在建造之前,我們先看看倉庫里有沒有現成的、別人已經做好的藍圖。

docker search [OPTIONS] TERM
  • 例子:我想找一個Nginx(一個流行的Web服務器)的鏡像。
    docker search nginx
    
  • 輸出解讀
    • NAME: 鏡像的名字。
    • DESCRIPTION: 簡要描述。
    • STARS: 星星數,類似于GitHub的Star,代表受歡迎程度。
    • OFFICIAL: [OK] 表示是官方鏡像,由Docker官方或項目原團隊維護,通常最可靠。
    • AUTOMATED: 表示是自動構建的,通常由Docker Hub鏈接GitHub倉庫自動生成鏡像。
  • 常用選項
    • --filter is-official=true: 只顯示官方鏡像。
    • --limit 5: 只顯示前5個結果。
2.2 docker pull - 下載藍圖到本地船廠

docker run會自動下載不存在的鏡像,但有時我們想提前下載好,比如為了預緩存或確保版本一致。

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • 鏡像名與標簽(TAG): 鏡像名通常由 [倉庫URL/]用戶名/鏡像名 組成。如果不指定用戶名和倉庫URL,默認從Docker Hub拉取。
    • nginx -> 等價于 library/nginx (Docker Hub官方庫)
    • bitnami/nginx -> Docker Hub上bitnami用戶發布的nginx鏡像
    • harbor.mycompany.com:5000/myapp:v1.2 -> 從私有倉庫harbor.mycompany.com:5000拉取myapp鏡像的v1.2版本
  • 標簽(TAG): 相當于藍圖的版本號。如果不指定,默認使用:latest標簽。
    • :latest: 并不一定代表“最新”,它只是一個默認標簽名。在生產環境中永遠不要使用:latest,因為它今天和明天拉取的可能是不同的版本,導致環境不一致。
    • 明確版本:1.21, :1.21-alpine, :v2.1.0
    • 系統變體-alpine(基于極小的Alpine Linux系統),-slim-buster(基于Debian)
  • 例子
    docker pull nginx:1.21-alpine          # 拉取一個特定版本、輕量級的Nginx
    docker pull ubuntu:20.04               # 拉取Ubuntu 20.04的基礎鏡像
    docker pull mysql:8.0                  # 拉取MySQL 8.0系列的最新版本
    
2.3 docker images - 查看本地船廠里的所有藍圖

下載了那么多鏡像,怎么查看我本地都有啥呢?

docker images [OPTIONS] [REPOSITORY[:TAG]]
  • 例子
    docker images
    
  • 輸出解讀
    • REPOSITORY: 鏡像倉庫源(名字)。
    • TAG: 標簽。
    • IMAGE ID: 鏡像的唯一ID(摘要),是鏡像的唯一標識。
    • CREATED: 創建時間。
    • SIZE: 鏡像大小。
  • 常用選項
    • -q, --quiet: 只顯示鏡像的ID。這在寫腳本時非常有用。
      docker images -q
      # 輸出: 1a184f6f0f3a
      #         d434d6d5e5b2
      
    • --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}": 用Go模板自定義輸出格式。
    • --filter dangling=true: 顯示懸虛鏡像(后面會講)。
2.4 docker rmi - 拆除廢棄的藍圖

本地磁盤空間是寶貴的,需要定期清理不用的鏡像。

docker rmi [OPTIONS] IMAGE [IMAGE...]
  • 例子
    docker rmi nginx:1.21-alpine   # 刪除指定標簽的鏡像
    docker rmi 1a184f6f0f3a        # 通過ID刪除,可以只寫ID的前幾位,只要能唯一區分即可
    docker rmi $(docker images -q) # 危險!刪除所有鏡像!$(...)是命令替換,先執行里面的命令
    
  • 注意: 如果一個鏡像有多個標簽,docker rmi只是刪除指定的標簽。只有當最后一個標簽被刪除時,鏡像本身才會被真正刪除。如果鏡像正在被容器使用,則需要先刪除容器才能刪除鏡像。
  • 常用選項
    • -f, --force: 強制刪除,即使有容器正在使用它(不推薦,可能導致“懸虛容器”)。
2.5 docker build - 自己動手,繪制藍圖

最強大的部分來了!我們不能總是用別人的藍圖,我們要學會自己制作。

docker build 命令用于從一個 Dockerfile 文件構建鏡像。Dockerfile是一個文本文件,里面包含了一條條指令,告訴Docker如何一步步構建我們的鏡像。

一個簡單的Dockerfile示例:

# 使用官方的Python輕量級鏡像作為藍圖的基礎
FROM python:3.9-alpine# 在容器內設置工作目錄
WORKDIR /app# 將當前目錄下的所有文件復制到容器的 /app 目錄下
COPY . .# 安裝項目所需的依賴
RUN pip install -r requirements.txt# 告訴Docker,當容器啟動時,運行這個命令
CMD ["python", "app.py"]

構建命令:

docker build [OPTIONS] PATH | URL | -
  • PATH: 構建上下文路徑。Docker會把PATH下的所有文件打包發送給Docker引擎(所以不要在PATH下放無關文件,用.dockerignore過濾)。通常使用當前目錄 .
  • 例子
    # 在當前目錄(包含Dockerfile)構建鏡像,并命名為my-python-app:v1.0
    docker build -t my-python-app:v1.0 .# 從Git倉庫構建
    docker build -t my-app https://github.com/user/repo.git#branch:subdir# 使用不同的Dockerfile文件構建
    docker build -f Dockerfile.prod -t my-app:prod .
    
  • 常用選項
    • -t, --tag list: 為鏡像打標簽,格式是name:tag
    • -f, --file string: 指定要使用的Dockerfile路徑(默認是PATH/Dockerfile)。
    • --no-cache: 構建時不使用緩存,從頭開始每一步。常用于確保依賴的最新版本。
    • --build-arg: 設置構建時的變量。
2.6 docker image prune - 船廠大掃除

清理那些不再使用的鏡像,釋放磁盤空間。

docker image prune [OPTIONS]
  • 例子
    docker image prune        # 交互式地刪除所有懸虛鏡像
    docker image prune -a     # 刪除所有未被任何容器使用的鏡像(危險!)
    docker image prune -a --filter "until=24h" # 刪除24小時前創建的、未使用的鏡像
    
  • 懸虛鏡像 (Dangling Images): 指的是沒有標簽的鏡像,通常是構建新鏡像時產生的舊層。它們通常可以被安全地清理掉。

第三章:揚帆!—— 容器(Container)生命周期管理命令

有了藍圖(鏡像),我們就可以制造和運行集裝箱(容器)了!這是最核心、最常用的部分。

3.1 docker run - 制造并啟航一個集裝箱!

這是最最最核心的命令。它從一個鏡像創建并啟動一個容器。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

選項多如牛毛,我們分類講解:

A. 基礎運行模式:

  • -d, --detach后臺運行。讓容器在后臺以“守護進程”模式運行。否則容器會占據你的終端(前臺運行)。
    docker run -d nginx:alpine  # 在后臺啟動一個Nginx
    
  • -it交互式終端。這是兩個選項的組合 -i (保持標準輸入打開) 和 -t (分配一個偽終端)。這讓你可以進入容器內部,與它的Shell進行交互。通常用于運行/bin/bash/bin/sh
    docker run -it ubuntu:20.04 /bin/bash  # 啟動一個Ubuntu容器并進入它的bash shell
    # 你現在就在容器內部了!可以執行ls, pwd, apt-get等命令
    # 輸入 exit 可以退出并停止容器
    
  • --rm容器停止后自動刪除。非常適合做臨時測試,避免產生一堆停止的容器垃圾。
    docker run --rm -it alpine /bin/sh # 運行一個Alpine容器,退出后自動刪除它
    

B. 命名與標識:

  • --name string給容器起一個名字。如果不指定,Docker會隨機分配一個有趣的名字(如angry_borg, sleepy_turing)。起名字后更容易管理。
    docker run -d --name my_webserver nginx:alpine
    

C. 網絡與端口映射(非常重要!):
默認情況下,容器內的網絡是與外界隔離的。我們需要手動“挖洞”,把容器內的端口映射到宿主機的端口上。

  • -p, --publish list端口映射。格式是 [主機IP:][主機端口:]容器端口
    docker run -d -p 80:80 nginx:alpine
    # 將容器的80端口映射到宿主機的80端口
    # 現在訪問 http://localhost 就能看到Nginx歡迎頁docker run -d -p 8080:80 nginx:alpine
    # 將容器的80端口映射到宿主機的8080端口
    # 訪問 http://localhost:8080docker run -d -p 127.0.0.1:3306:3306 mysql:8.0
    # 將容器的3306端口映射到宿主機的127.0.0.1的3306端口(只能本機訪問)
    
  • --network string連接網絡。默認連接到bridge網絡(橋接網絡)。可以連接到自定義網絡以實現容器間通過容器名通信。
    docker run -d --network my-network --name web nginx:alpine
    

D. 數據持久化(Volume Mount & Bind Mount):
容器內的文件是臨時的,容器一刪除,文件就沒了。我們必須把重要數據(如數據庫文件、日志、配置文件)存到容器外部。

  • -v, --volume list掛載卷。格式是 [主機路徑:][容器路徑:][模式]這是最重要的數據持久化方式!
    • 匿名卷(Anonymous Volume): 只寫容器路徑。Docker會自動在主機上創建一個隨機目錄來掛載。
      docker run -d -v /var/lib/mysql mysql:8.0 # MySQL數據存到匿名卷
      
    • 命名卷(Named Volume): 使用卷名。需要先用docker volume create創建,或者Docker會自動創建。管理更方便,推薦方式。
      docker run -d -v mysql_data:/var/lib/mysql mysql:8.0
      
    • 綁定掛載(Bind Mount): 直接指定主機路徑。用于開發時同步代碼,或者使用主機上的特定配置文件。
      # 開發場景:將主機當前目錄代碼掛載到容器中,實現代碼實時同步
      docker run -d -v $(pwd):/app my-python-app# 配置掛載:使用主機上的nginx.conf覆蓋容器內的默認配置
      docker run -d -v /path/on/host/nginx.conf:/etc/nginx/nginx.conf nginx:alpine
      

E. 環境變量:

  • -e, --env list設置環境變量。許多鏡像通過環境變量來配置。
    # 啟動MySQL并設置root密碼
    docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:8.0# 啟動一個Web應用,設置運行環境為生產環境
    docker run -d -e NODE_ENV=production my-node-app
    

一個綜合性的docker run例子:

docker run -d \                  # 后臺運行--name my_app \                # 容器名叫my_app-p 8080:3000 \                 # 映射主機8080到容器3000端口-v app_data:/usr/src/app/data \ # 掛載命名卷用于數據持久化-e DATABASE_URL=postgresql://... \ # 設置數據庫連接字符串--network my_bridge_network \  # 連接到自定義網絡my-app:prod                    # 使用的鏡像
3.2 docker ps - 查看正在航行的集裝箱

docker ps 用于列出當前正在運行的容器。

docker ps [OPTIONS]
  • 例子
    docker ps        # 查看正在運行的容器
    docker ps -a     # 查看所有容器(包括已停止的)
    
  • 輸出解讀
    • CONTAINER ID: 容器的唯一短ID。
    • IMAGE: 使用的鏡像。
    • COMMAND: 容器啟動時運行的命令。
    • CREATED: 創建時間。
    • STATUS: 狀態(Up 5 minutes: 運行了5分鐘; Exited (0) 2 days ago: 2天前退出,退出碼為0)。
    • PORTS: 端口映射情況。
    • NAMES: 容器名。
  • 常用選項
    • -a, --all: 顯示所有容器(默認只顯示運行的)。
    • -q, --quiet: 只顯示容器ID。
    • -f, --filter: 按條件過濾。
      docker ps -f name=my_  # 查找名字包含`my_`的容器
      docker ps -f status=exited # 查找已停止的容器
      docker ps -f ancestor=nginx # 查找由Nginx鏡像創建的容器
      
3.3 docker stop / docker start / docker restart - 暫停與重啟集裝箱
  • docker stop [OPTIONS] CONTAINER [CONTAINER...]停止一個或多個運行中的容器。發送SIGTERM信號,允許容器優雅地關閉。
    docker stop my_webserver
    docker stop 1a184f6f0f3a
    
  • docker start [OPTIONS] CONTAINER [CONTAINER...]啟動一個或多個已停止的容器。它會保留容器第一次運行時的所有參數。
    docker start my_webserver
    
  • docker restart [OPTIONS] CONTAINER [CONTAINER...]重啟容器。相當于stop后再start
    docker restart my_webserver
    
3.4 docker rm - 拆除已停泊的集裝箱

刪除已停止的容器,釋放資源。

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • 例子
    docker rm sleepy_turing  # 刪除指定容器
    docker rm $(docker ps -aq) # 危險!刪除所有已停止的容器
    docker ps -aq | xargs docker rm # 同上,另一種寫法
    
  • 常用選項
    • -f, --force強制刪除一個運行中的容器(發送SIGKILL)。
    • -v, --volumes: 刪除容器的同時,刪除與之關聯的匿名卷(不會刪除命名卷)。
3.5 docker logs - 查看集裝箱的航行日志

容器在后臺運行時,我們需要查看它內部應用程序打印的日志。

docker logs [OPTIONS] CONTAINER
  • 例子
    docker logs my_webserver      # 查看日志
    docker logs -f my_webserver   # 實時追蹤日志(像tail -f)
    docker logs --tail 100 my_webserver # 查看最后100行
    docker logs --since 2024-01-01T00:00:00 my_webserver # 查看某個時間點之后的日志
    
  • 常用選項
    • -f, --follow: 跟蹤日志輸出。
    • --tail string: 從日志末尾顯示多少行(默認是全部)。
    • -t, --timestamps: 顯示時間戳。
    • --since string: 顯示某個時間戳之后的日志。
    • --until string: 顯示某個時間戳之前的日志。
3.6 docker exec - 進入一個正在航行的集裝箱內部

有時我們需要進入一個正在運行的容器,進行一些操作,比如檢查文件、調試問題、執行命令。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • 例子
    # 在容器my_webserver中執行`ls /`命令
    docker exec my_webserver ls /# 以交互模式(-it)進入容器內部,啟動一個bash shell
    docker exec -it my_webserver /bin/bash
    # 現在你就在一個正在運行的容器內部了!可以隨意操作。
    # 注意:exit退出不會停止容器,只會結束當前的exec會話。
    
  • exec vs run
    • docker run創建并啟動一個新容器。
    • docker exec在已運行的容器內執行額外命令。
3.7 docker cp - 在船和集裝箱之間傳送貨物

在主機和容器之間復制文件/文件夾。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
  • 例子
    # 從容器復制文件到主機
    docker cp my_webserver:/etc/nginx/nginx.conf ./nginx.conf.bak# 從主機復制文件到容器
    docker cp ./config.json my_webserver:/app/config.json
    

第四章:組建艦隊 —— Docker Compose 多容器編排

現實中的應用很少是只有一個容器的。通常是一個“艦隊”,比如一個Web應用容器 + 一個數據庫容器 + 一個緩存容器。用docker run一個個啟動和管理它們太麻煩了。Docker Compose 就是用來解決這個問題的。

它允許你用一個 docker-compose.yml 文件來定義和運行多個相關聯的容器。這個文件就是你的“艦隊編隊指令”。

4.1 安裝Docker Compose

Docker Desktop for Mac/Windows 已經包含了它。在Linux上,你需要單獨安裝:

# 下載最新版本的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 賦予執行權限
sudo chmod +x /usr/local/bin/docker-compose# 驗證安裝
docker-compose --version
4.2 編寫 docker-compose.yml

這是一個經典的WordPress(博客系統)示例,它包含一個wordpress容器和一個mysql容器。

# 版本號(注意:版本語法有變化,現代Compose建議使用 version: '3.8' 或根本不寫)
version: '3.8'# 定義我們的服務(容器艦隊)
services:# 第一個服務:數據庫db:image: mysql:8.0volumes:- db_data:/var/lib/mysql # 使用命名卷持久化數據restart: alwaysenvironment: # 設置環境變量MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpress# 第二個服務:WordPress網站wordpress:depends_on: # 表明它依賴于db服務,會等待db啟動后再啟動- dbimage: wordpress:latestports:- "8000:80" # 將主機的8000端口映射到wordpress容器的80端口restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306 # 注意這里直接用服務名`db`來訪問另一個容器!WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpressvolumes:- ./wp-content:/var/www/html/wp-content # 綁定掛載,用于主題/插件開發# 定義在外部聲明的命名卷
volumes:db_data: {}
4.3 Compose 常用命令

在包含docker-compose.yml文件的目錄下執行以下命令:

  • docker-compose up創建并啟動所有服務
    • -d: 后臺運行。
    docker-compose up -d
    
  • docker-compose down停止并刪除所有容器、網絡
    • -v: 同時刪除匿名卷(在Compose中定義的卷不會被刪除)。
    • --rmi all: 同時刪除Compose創建的所有鏡像。
    docker-compose down -v
    
  • docker-compose ps: 列出本項目下的所有容器。
  • docker-compose logs: 查看所有容器的日志。
    • -f: 跟蹤日志。
    • service_name: 查看指定服務的日志,如 docker-compose logs wordpress
  • docker-compose exec: 進入某個服務的容器。
    docker-compose exec db /bin/bash # 進入db服務的容器
    
  • docker-compose restart / docker-compose stop / docker-compose start: 重啟、停止、啟動服務。
  • docker-compose build: 如果服務是用build: .定義的,這個命令可以重新構建鏡像。

Compose的優勢

  1. 一鍵啟停: 一個命令管理整個應用棧。
  2. 配置即代碼docker-compose.yml文件記錄了整個環境配置,易于版本控制和共享。
  3. 服務發現: 容器之間可以使用服務名(如上面的db)直接通信,Compose會自動創建內部網絡并配置DNS。

第五章:港口與航線 —— 網絡與數據管理

5.1 網絡(Network)

Docker提供了幾種網絡模式,讓容器之間、容器與外部世界之間能夠通信。

  • 查看網絡
    docker network ls
    
  • 創建網絡
    docker network create my-network
    
  • 將容器連接到網絡
    docker network connect my-network my-container
    
  • 斷開連接
    docker network disconnect my-network my-container
    
  • 刪除網絡
    docker network rm my-network
    
  • 網絡模式
    • bridge默認模式。每個容器分配一個私有IP,通過網橋與主機通信。端口需要映射到主機才能被外部訪問。
    • host主機模式。容器直接使用主機的網絡命名空間,沒有自己的IP,容器端口直接暴露在主機上。性能更好,但隔離性差。
    • none無網絡。容器內沒有網絡棧。
    • overlay: ** overlay 網絡**。用于Docker Swarm集群中不同主機上的容器通信。
5.2 數據卷(Volume)

數據卷是保存Docker容器生成和使用的數據的首選機制。

  • 查看卷
    docker volume ls
    
  • 創建卷
    docker volume create my-named-volume
    
  • 檢查卷的詳細信息
    docker volume inspect my-named-volume
    # 會顯示卷在主機上的實際存儲位置(Mountpoint)
    
  • 刪除卷
    docker volume rm my-named-volume
    docker volume prune # 刪除所有未被使用的卷
    

第六章:實戰演習與故障排查

6.1 實戰:部署一個簡單的Python Web應用
  1. 項目結構

    my-app/
    ├── app.py
    ├── requirements.txt
    └── Dockerfile
    
  2. app.py:

    from flask import Flask
    app = Flask(__name__)@app.route('/')
    def hello():return "Hello from Dockerized Flask App!"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
    
  3. requirements.txt:

    Flask==2.0.1
    
  4. Dockerfile:

    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY . .
    CMD ["python", "app.py"]
    
  5. 構建并運行

    cd my-app
    docker build -t my-flask-app .
    docker run -d -p 5000:5000 --name flask-container my-flask-app
    

    訪問 http://localhost:5000 查看結果。

6.2 常見問題排查(Debugging)
  1. 容器啟動后立即退出

    • 原因: 通常是因為容器內前臺進程執行完畢退出了。
    • 排查
      docker logs flask-container # 查看日志,看有什么錯誤
      docker run -it my-flask-app /bin/bash # 以交互模式運行,檢查鏡像內容
      
  2. 端口被占用

    • 錯誤Bind for 0.0.0.0:80 failed: port is already allocated
    • 解決: 換一個主機端口 -p 8080:80,或者停止正在占用端口的容器。
  3. 權限問題(尤其在Bind Mount時)

    • 現象: 容器內應用無法寫入掛載的目錄。
    • 解決: 了解Linux文件權限,或者使用命名卷(Docker會自動處理權限)。
  4. docker: Error response from daemon: ...

    • 萬能排查法仔細閱讀錯誤信息! 99%的答案都在錯誤信息里。Docker的錯誤提示通常非常明確。

終章:遠征的繼續

恭喜你,船長!你已經完成了這次Docker命令的大航海,從單槍匹馬的容器操作,到指揮一支Compose艦隊,你已經具備了在容器化世界中航行的基本能力。

但這僅僅是開始。Docker的生態浩瀚無垠,前方還有更廣闊的領域等待你去探索:

  • Docker Swarm / Kubernetes: 用于在生產環境中管理和編排超大規模容器集群的“航母戰斗群指揮系統”。
  • CI/CD集成: 將Docker融入GitLab CI、Jenkins等持續集成/持續部署流程。
  • 更安全的鏡像構建: 使用多階段構建(multi-stage build)減少鏡像體積,避免在鏡像中包含構建工具。
  • 容器安全: 掃描鏡像漏洞,使用非root用戶運行容器。

記住,最好的學習方式就是不斷實踐。從今天起,嘗試把你本地開發的環境用Docker容器跑起來,把你下一個項目用Dockerfiledocker-compose.yml描述出來。

愿你的容器之旅,一帆風順!

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

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

相關文章

告別依賴混亂:Spring IoC 容器與 DI 依賴注入入門精講

目錄 什么是 IoC IoC 介紹 傳統開發思路 解決方法 IoC 優勢 DI IoC & DI 使用 IoC 詳解 Bean 的存儲 Controller&#xff08;控制器存儲&#xff09; 獲取 bean 對象的其他方法 bean 命名 面試題之 ApplicationContext pk BeanFactory Service&#xff08;服…

視頻理解學習筆記

目錄 VideoRefer VideoPrism 核心解密&#xff1a;通用視頻編碼器的力量 VideoRefer VideoRefer 是由浙江大學和阿里達摩院聯合推出的視頻對象感知與推理技術&#xff0c;增強視頻大型語言模型&#xff08;Video LLMs&#xff09;的空間-時間理解能力。簡單一點來說就是可以…

P1198題解

題目鏈接 開題第一件事看數據范圍.這里的范圍是二十萬,支持O(nlogn). 這是一個RMQ問題,同時要加點,我們因此考慮ST表或者線段樹.這里用線段樹是核彈打蚊子,沒有意義,我們因此考慮ST表.我們注意到如果加點操作需要改動ST表原來的東西ST表就會炸掉,我們就要考慮更高級的數據結構…

使用yolov8對視頻進行目標檢測

使用 Ultralytics 的 YOLO 模型對視頻進行逐幀目標檢測非常簡單&#xff0c;以下是完整的實現方法&#xff1a; 我們的輸入視頻是這樣的 視頻目標檢測輸入視頻這里是天津市和平區天津大學附近&#xff0c;感興趣的小伙伴來天津玩哈&#xff01;&#xff01; 1. 安裝依賴 確保已…

Edge瀏覽器的自動化點擊系統

Tag_click_openclose_V6 開發與使用注意事項 網頁自動化點擊系統 一個基于Python和CustomTkinter開發的桌面應用程序&#xff0c;通過Selenium實現對Edge瀏覽器的自動化控制。點擊Tag_click_openclose_V6進入Github自取&#xff0c;記得點贊收藏嗷。 功能介紹 連接到已打開…

Python股票數據分析與預測系統 LSTM神經網絡算法 股票價格預測 Tensorflow深度學習 機器學習 Flask框架 東方財富(建議收藏)?

博主介紹&#xff1a;?全網粉絲50W&#xff0c;前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室&#xff0c;專注于計算機相關專業項目實戰6年之久&#xff0c;累計開發項目作品上萬套。憑借豐富的經驗與專業實力&#xff0c;已幫助成千上萬的學生順利畢業&#xff0c;…

英萊科技焊縫跟蹤系統亮相德國埃森焊接展,激光視覺點亮世界舞臺

9月15-19日&#xff0c;每4年一屆的德國埃森焊接與切割展覽會&#xff08;SCHWEISSEN & SCHNEIDEN&#xff09;即將盛大開幕。作為焊接行業最具規模及權威性的盛會之一&#xff0c;英萊科技將攜全新PF系列激光視覺焊縫跟蹤系統驚艷亮相&#xff0c;為全球智能化焊接貢獻中國…

嵌入式基本概念:什么是指令集,微架構,IDE,DFP等等是什么意思,有什么關系???

注&#xff1a;下面是指令集和微框架的分類圖&#xff0c;后面我會以ARM的M4舉例子。 一.什么是指令集 大概的可以看這個視頻 https://www.bilibili.com/video/BV1uXzbYBEy2/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&vd_source406ed…

Spring Cloud之服務入口Gateway之自定義過濾器

目錄 過濾器執行順序 自定義過濾器 自定義GatewayFilter 定義GatewayFilter 配置過濾器 啟動服務并訪問 自定義GlobalFilter 定義GlobalFilter 啟動服務并訪問 服務部署 過濾器執行順序 如果?個項?中, 既有GatewayFilter, ?有 GlobalFilter時, 執?的先后順序是什…

MySQL——視圖、儲儲過程、觸發器

目錄 一、視圖 二、存儲過程 三、觸發器 一、視圖 視圖是一種虛擬存在的表。視圖中的數據并不在數據庫中真實存在&#xff0c;行和列數據來自定義視圖的查詢中使用的表&#xff0c;并且是在使用視圖時動態生成的。通俗的講&#xff0c;視圖只保存了查詢的SQL邏輯&#xff0c…

iOS App 卡頓與性能瓶頸排查實戰 如何定位CPU內存GPU幀率問題、優化耗電與網絡延遲(uni-app開發性能優化全流程指南)

在 iOS 應用開發中&#xff0c;卡頓 是用戶最直觀的負面體驗。 一個 App 如果在頁面切換、滾動、后臺運行時頻繁掉幀或發熱&#xff0c;用戶很快就會放棄使用。 對于 uni-app 跨平臺開發者 來說&#xff0c;卡頓問題更為復雜&#xff1a; JS 與原生層橋接增加了 CPU 負載&#…

騰訊開源多模態 RAG:復雜文檔秒變自建知識庫,支持 API 調用

上篇&#xff0c;分享了 小智AI MCP系列的第一篇&#xff1a; 小智 AI 鬧鐘提醒 定時任務&#xff0c;設備端MCP實現 有朋友問&#xff0c;能否接入知識庫 RAG&#xff1f; 讓小智可以根據企業知識庫&#xff0c;回答客戶的疑問~ 當然可以&#xff0c;接入方式同樣是 MC…

Node.js中的 http 模塊詳解

http 模塊是 Node.js 中的核心模塊之一&#xff0c;專門用于構建基于 HTTP 的網絡應用程序。它允許創建 HTTP 服務器和客戶端&#xff0c;處理網絡請求和響應。1. 核心 API 詳解1.1. http.createServer([options][, requestListener])用于創建 HTTP 服務器的核心方法&#xff0…

LAMP 環境部署

LAMP 環境部署 一、概述 1. 目的 基于 CentOS 7 系統部署 LAMP&#xff08;Linux Apache MySQL PHP&#xff09;環境的完整步驟&#xff0c;通過腳本化操作實現環境快速搭建&#xff0c;適用于運維人員進行測試環境或基礎生產環境的 LAMP 部署 2. 適用環境操作系統&#xff…

用html5仿造nes游戲敲玻璃寫一個敲玻璃游戲

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>敲玻璃游戲</title><style>body {ma…

996引擎-ItemTips特效框層級自定義

996引擎-ItemTips特效框層級自定義 需求場景 ItemTips 中相關方法 創建特效的位置 創建特效框 核心修改 調整視圖,自己加個背景,不用原來的 設置 tipsLayout_bg 的層級 結果預覽 參考資料 需求場景 策劃說我們的tips特效框,遮擋文字。如果按官方說的設為底層又跑到背景框后…

Java 注解與 APT(Annotation Processing Tool)

Java 注解與 APT&#xff08;Annotation Processing Tool&#xff09; 注解&#xff08;Annotation&#xff09;基礎 注解是 Java 語言的一種元數據形式&#xff0c;它可以在代碼中添加標記信息&#xff0c;用于描述代碼的額外信息&#xff0c;但不會直接影響代碼的執行邏輯。注…

Unity 檢測網絡-判斷當前(Android/Windows平臺)設備是否連接了指定WiFi

判斷設備是否連接了特定的網絡1.Unity 腳本2.Unity AndroidManifest.xml文件①改個設置②補充權限語句1.Unity 腳本 using UnityEngine; using System.Collections; using System.Diagnostics; using Debug UnityEngine.Debug; using UnityEngine.UI;#if UNITY_ANDROID &…

通過網絡強化增強混合IT環境的安全

網絡是企業運營的支柱&#xff0c;也是網絡犯罪分子和惡意威脅者的主要目標&#xff0c;他們會破壞IT運營的連續性。隨著混合云基礎設施、遠程辦公和物聯網&#xff08;IoT&#xff09;生態系統的出現&#xff0c;網絡邊界正在不斷擴大&#xff0c;新的漏洞不斷產生&#xff0c…

ACP(四):RAG工作流程及如何創建一個RAG應用

RAG的工作原理 你在考試的時候有可能會因為忘記某個概念或公式而失去分數&#xff0c;但考試如果是開卷形式&#xff0c;那么你只需要找到與考題最相關的知識點&#xff0c;并加上你的理解就可以進行回答了。 對于大模型來說也是如此&#xff0c;在訓練過程中由于沒有見過某個知…