從零開始掌握 Docker:核心命令與實踐指南


從零開始掌握 Docker:核心命令與實踐指南

摘要: 本文系統整理了 Docker 的核心概念與常用命令,涵蓋鏡像管理、容器操作、數據存儲、網絡配置、Compose 編排以及 Dockerfile 構建等內容。通過清晰的命令示例和實用說明,幫助開發者快速上手 Docker 容器化技術,提升開發與部署效率。

關鍵詞: Docker, 容器化, 鏡像, 容器, Docker Compose, Dockerfile, 命令手冊


一、 Docker 鏡像管理

鏡像是 Docker 容器運行的基礎模板。

1. 搜索鏡像

在 Docker Hub 或其他注冊中心查找鏡像。

docker search nginx

2. 拉取鏡像

下載鏡像到本地倉庫。推薦指定標簽(如 :latest, :alpine)。

docker pull nginx          # 拉取最新版 (latest)
docker pull nginx:latest   # 顯式指定最新版
docker pull nginx:alpine   # 拉取 Alpine Linux 精簡版

3. 查看本地鏡像

列出所有已下載的鏡像。

docker images
docker image ls  # 等效命令

4. 刪除鏡像

移除不再需要的本地鏡像。注意: 依賴該鏡像的容器必須先刪除或停止。

docker rmi nginx:latest    # 通過倉庫名:標簽刪除
docker rmi <鏡像ID>         # 通過唯一鏡像 ID 刪除 (更精確)

二、 Docker 容器操作

容器是鏡像的運行實例。

1. 運行容器

啟動一個新的容器實例。

docker run nginx                      # 前臺運行 (會占用終端)
docker run -d --name mynginx nginx    # 后臺運行 (-d) 并命名容器 (--name)
docker run -d --name myweb -p 8080:80 nginx  # 后臺運行,并將容器 80 端口映射到宿主機 8080 端口 (-p)
# 常用選項:
#   -d: 后臺運行 (detached mode)
#   --name: 為容器指定一個易記的名稱
#   -p <主機端口>:<容器端口>: 端口映射
#   -it: 交互模式運行 (通常與 /bin/bash 結合進入容器)
#   -e: 設置環境變量
#   --restart=always: 容器退出時自動重啟

2. 查看容器狀態

docker ps          # 查看正在運行的容器
docker ps -a       # 查看所有容器 (包括已停止的)
docker ps -aq      # 查看所有容器的 ID (只顯示 ID, 常用于批量操作)

3. 啟動/停止/重啟容器

docker start <容器名稱|容器ID>    # 啟動已停止的容器
docker stop <容器名稱|容器ID>     # 優雅停止運行中的容器 (發送 SIGTERM)
docker restart <容器名稱|容器ID>  # 重啟容器

4. 查看容器資源使用與日志

docker stats <容器名稱|容器ID>      # 實時查看容器的 CPU、內存、網絡、磁盤等資源使用情況
docker logs <容器名稱|容器ID>       # 查看容器日志 (默認顯示已產生的日志)
docker logs -f <容器名稱|容器ID>    # 持續跟蹤 (follow) 容器日志輸出 (類似 tail -f)

5. 進入運行中的容器

在運行的容器內啟動一個交互式 Shell(通常是 /bin/bash/bin/sh)。

docker exec -it mynginx /bin/bash
# -i: 保持 STDIN 打開
# -t: 分配一個偽終端 (TTY)

6. 刪除容器

移除不再需要的容器。注意: 正在運行的容器需要先停止或使用 -f 強制刪除。

docker rm <容器名稱|容器ID>        # 刪除已停止的容器
docker rm -f <容器名稱|容器ID>     # 強制刪除運行中的容器
docker rm $(docker ps -aq)       # 批量刪除所有已停止的容器 (危險操作!)

三、 構建與分享自定義鏡像

1. 提交容器更改創建新鏡像

基于一個運行中的容器的當前狀態創建新的鏡像層。

docker commit -m "update index.html" mynginx mynginx:v1.0
# -m: 提交信息
# mynginx: 源容器名稱
# mynginx:v1.0: 新鏡像名稱:標簽

2. 保存鏡像為文件

將鏡像導出為 .tar 文件,方便離線傳輸或備份。

docker save -o mynginx.tar mynginx:v1.0
# -o: 指定輸出文件名

3. 從文件加載鏡像

.tar 文件恢復鏡像到本地倉庫。

docker load -i mynginx.tar
# -i: 指定輸入文件

4. 分享鏡像到 Docker Hub (或其他注冊中心)

  1. 登錄:

    docker login  # 默認登錄 Docker Hub, 提示輸入用戶名密碼
    
  2. 標記鏡像: 為本地鏡像添加符合目標倉庫規范的名稱(通常是 <DockerHub用戶名>/<倉庫名>:<標簽>)。

    docker tag mynginx:v1.0 <你的DockerHub用戶名>/mynginx:v1.0
    
  3. 推送鏡像:

    docker push <你的DockerHub用戶名>/mynginx:v1.0
    

四、 Docker 數據管理 (存儲卷 Volumes)

Docker 使用存儲卷 (Volumes) 或綁定掛載 (Bind Mounts) 來持久化容器數據,避免容器刪除后數據丟失。

1. 目錄掛載 (Bind Mounts)

將宿主機上的一個具體目錄直接掛載到容器內指定路徑。文件存在于宿主機文件系統上。

docker run -d -p 80:80 -v /宿主機/絕對路徑/nginxhtml:/usr/share/nginx/html --name myapp nginx
# -v /宿主機路徑:/容器路徑
  • 優點: 直觀,方便在宿主機直接修改文件。
  • 缺點: 依賴宿主機特定目錄結構,移植性稍差。

2. 卷掛載 (Volumes)

使用 Docker 管理的命名卷掛載到容器內路徑。卷存儲在 Docker 管理的區域 (/var/lib/docker/volumes/),與容器生命周期解耦。

docker run -d -p 80:80 -v mynginxconf:/etc/nginx -v mynginxhtml:/usr/share/nginx/html --name myapp nginx
# -v 卷名:/容器路徑
  • 優點: 移植性好,由 Docker 管理生命周期,備份/恢復方便。
  • 缺點: 數據位置不如綁定掛載直觀。

3. 卷管理命令

docker volume ls                 # 列出所有 Docker 管理的卷
docker volume create myvolume    # 創建一個新的命名卷
docker volume inspect myvolume   # 查看指定卷的詳細信息 (包括其物理存儲位置 Mountpoint)
docker volume rm myvolume        # 刪除一個不再使用的卷
# 注意:刪除容器時,使用 -v 選項可以同時刪除關聯的匿名卷 (未命名的卷)。命名卷需要顯式刪除。

五、 Docker 網絡管理

Docker 容器默認通過 docker0 虛擬網橋連接并相互隔離。

1. 查看容器網絡信息

docker container inspect <容器名稱|容器ID>  # 查看容器詳細信息,包括其 IP 地址、網關、網絡配置等

2. 默認網絡 (docker0) 的局限性

  • 容器 IP 地址在重啟或重新創建后可能變化。
  • 默認網絡不支持通過容器名稱進行服務發現(只能通過易變的 IP 地址訪問)。

3. 創建自定義網絡

自定義網絡解決了 docker0 的局限性:

  • 為容器提供穩定的、可預測的 IP 地址段。
  • 支持通過容器名稱作為主機名進行服務發現(容器間可以直接用名字通信)。
docker network create mynet      # 創建一個名為 mynet 的自定義橋接網絡
docker network ls               # 列出所有 Docker 網絡

4. 將容器連接到自定義網絡

docker run -d -p 8081:80 --name app1 --network mynet nginx
docker run -d -p 8082:80 --name app2 --network mynet nginx
  • 現在 app1 可以直接通過 ping app2http://app2 訪問 app2 容器,反之亦然。
  • 使用 docker inspect app1 查看其網絡配置,確認它連接到了 mynet 并獲取了 IP。

5. 刪除網絡

注意: 只能刪除沒有容器連接的網絡。

docker network rm mynet

六、 使用 Docker Compose 編排多容器應用

Docker Compose 使用 YAML 文件 (docker-compose.ymlcompose.yml) 定義和運行多容器 Docker 應用。

1. 上線應用 (啟動服務)

在包含 compose.yaml 文件的目錄下運行:

docker compose -f compose.yaml up -d
# -f: 指定 Compose 文件 (默認為 compose.yml 或 docker-compose.yml 時可省略)
# -d: 后臺運行 (detached)
# up: 創建并啟動所有定義的服務、網絡、卷
  • Compose 只會重建或重啟配置發生變化的容器(智能更新)。

2. 下線應用 (停止并清理)

docker compose -f compose.yaml down      # 停止并移除容器、網絡 (默認保留卷和鏡像)
docker compose -f compose.yaml down --rmi all -v  # 停止并移除容器、網絡,同時刪除所有相關鏡像(--rmi all)和卷(-v)
# --rmi all: 刪除 Compose 文件中定義的服務所使用的所有鏡像
# -v: 刪除 Compose 文件中定義的匿名卷和 compose 創建時指定的命名卷 (謹慎使用!)

七、 使用 Dockerfile 構建鏡像

Dockerfile 是一個文本文件,包含構建 Docker 鏡像所需的一系列指令。

常用 Dockerfile 指令

指令說明示例
FROM指定基礎鏡像。 所有構建都以此為基礎。FROM openjdk:11
LABEL添加元數據 (鍵值對)。 如作者、描述、版本等。LABEL maintainer="liuqi@example.com"
COPY復制文件/目錄。 從構建上下文復制到鏡像內。COPY ./app.jar /app/app.jar
ADD類似 COPY,但功能更多 (支持 URL、自動解壓 tar)。通常優先用 COPY。ADD https://example.com/file.tar.gz /
WORKDIR設置工作目錄。 后續指令 (RUN, CMD, ENTRYPOINT, COPY, ADD) 都在此目錄下執行。WORKDIR /app
RUN執行命令。 在構建過程中運行命令并創建新的鏡像層。常用于安裝軟件包。RUN apt-get update && apt-get install -y curl
EXPOSE聲明運行時容器監聽的端口。 只是一個文檔說明,實際映射需用 -pEXPOSE 8080
ENV設置環境變量。 在構建階段和運行階段都可用。ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk
CMD指定容器啟動時的默認命令。 可以被 docker run 的命令覆蓋。CMD ["java", "-jar", "/app.jar"]
ENTRYPOINT指定容器啟動時的主命令。 CMD 的內容通常作為其參數。更不易被覆蓋。ENTRYPOINT ["java", "-jar"] CMD ["/app.jar"]

示例 Dockerfile (構建 Java 應用鏡像)

# 使用 OpenJDK 11 官方鏡像作為基礎
FROM openjdk:11# 添加維護者信息 (元數據)
LABEL author="liuqi" version="1.0"# 將構建上下文中的 app.jar 復制到鏡像根目錄下
COPY app.jar /app.jar# 聲明應用運行時監聽的端口
EXPOSE 8081# 設置容器啟動時執行的命令 (主進程)
ENTRYPOINT ["java", "-jar", "/app.jar"]

構建鏡像

在包含 Dockerfileapp.jar 的目錄下運行:

docker build -t myjavaapp:v1.0 .
# -t: 指定構建出的鏡像名稱和標簽 (myjavaapp:v1.0)
# . : 指定構建上下文路徑 (當前目錄),Dockerfile 和 COPY 的文件都相對于此路徑

八、 Docker 鏡像分層存儲機制

Docker 鏡像采用分層存儲 (Layer Storage) 機制,這是其高效性和輕量化的核心:

  1. Union File System (聯合文件系統): 如 AUFS, Overlay2 等。這些文件系統允許將多個目錄(稱為“層”)掛載到同一個虛擬目錄下。對用戶呈現的是一個單一的文件系統視圖。
  2. 只讀層 (Read-Only Layers):
    • 鏡像由一系列只讀層疊加組成。
    • 每一層代表 Dockerfile 中的一條指令(如 FROM, RUN, COPY, ADD)所引入的文件系統變化。
    • 這些層是共享的。如果多個鏡像基于同一個基礎鏡像(如 ubuntu:latest),那么它們共享基礎鏡像的所有只讀層,節省磁盤空間。
  3. 容器層 (Container Layer / Read-Write Layer):
    • 當從鏡像啟動一個容器時,Docker 會在所有只讀層之上添加一個薄薄的讀寫層(通常稱為“容器層”或“可寫層”)。
    • 容器運行時的所有文件寫入操作(創建、修改、刪除文件)都只發生在這個讀寫層中。
    • 容器刪除時,這個讀寫層也會被丟棄(除非使用卷持久化數據)。
  4. 寫時復制 (Copy-on-Write - CoW):
    • 如果一個容器需要修改只讀層中的某個文件(例如修改配置文件),CoW 機制會觸發:
      1. 該文件會從底層的只讀層復制到容器的讀寫層。
      2. 后續所有對該文件的修改都只發生在讀寫層的這個副本上
    • 底層的只讀文件保持不變。這保證了基礎鏡像的完整性和可共享性。
    • 只有首次修改時才復制,優化了性能和存儲空間。

圖解:

+---------------------------------------------------+
|                  Container (myapp)                |
| +-----------------------------------------------+ |
| |             Read-Write Layer (R/W)            | | (容器層 - 存儲運行時修改)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| |               Read-Only Layer (n)             | | (鏡像層 - 由 `RUN apt-get install` 添加)
| +-----------------------------------------------+ |
|                     ...                          |
| +-----------------------------------------------+ |
| |               Read-Only Layer (2)             | | (鏡像層 - 由 `COPY app.jar` 添加)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| |               Read-Only Layer (1)             | | (鏡像層 - 由 `FROM openjdk:11` 引入的基礎層)
| +-----------------------------------------------+ |
+---------------------------------------------------+(Union Mount Point - 呈現為單一文件系統視圖)

優勢:

  • 高效構建: 構建鏡像時,如果某層及其之上的層沒有變化,Docker 會直接使用緩存中的層,極大加速構建過程。
  • 節省空間: 多個鏡像和容器共享基礎層。
  • 快速啟動: 啟動容器只需添加一個薄薄的讀寫層,無需復制整個文件系統。
  • 鏡像復用: 公共基礎層只需下載一次。

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

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

相關文章

RDMA簡介7之RoCE v2可靠傳輸

可靠傳輸技術旨在通過多種方法確保數據包在傳輸過程中不會丟失或損壞&#xff0c;同時保證數據包按發送順序到達接收端&#xff0c;其要求在鏈路發生丟包或網絡發生擁塞等情況下能夠完全保證數據包的正確性同時盡可能地提高傳輸速率。RoCE v2協議實現可靠傳輸的技術手段共有三種…

java33

1.特殊文件 屬性文件properties 配置文件xml 注意&#xff1a;XML文件可以直接在瀏覽器里面打開&#xff1a; 了解知識&#xff1a; 2.日志技術 3.單元測試 注意&#xff1a;點擊方法內部再右鍵運行是測試改方法的&#xff0c;點擊類名再右鍵運行才是測試整個測試類的&#xff…

OSI 七層網絡模型

目錄 OSI 七層網絡模型七層模型1. 物理層&#xff08;Physical Layer&#xff09;2. 數據鏈路層&#xff08;Data Link Layer&#xff09;3. 網絡層&#xff08;Network Layer&#xff09;4. 傳輸層&#xff08;Transport Layer&#xff09;5. 會話層&#xff08;Session Layer…

Spring Boot 4.0.0 新特性詳解:深入解讀 Spring Framework 7.0.0

你是否注意到創建新 Spring Boot 項目時出現的最新選項?Spring Boot 4.0.0 預覽版現已發布,基于最新的 Spring Framework 7.0.0 ??。這個版本引入了眾多激動人心的新特性,不僅提升了開發效率,改善了空值安全性,還簡化了 Web 應用程序的開發流程。本文將深入探討這些重要…

從0到1構建高并發秒殺系統:實戰 RocketMQ 異步削峰與Redis預減庫存

&#x1f680;從0到1構建高并發秒殺系統&#xff1a;實戰 RocketMQ 異步削峰與Redis預減庫存 &#x1f4d6;一、 簡介 在電商、搶票等高并發場景中&#xff0c;秒殺系統面臨著“高并發、庫存稀缺、易超賣、系統易崩”的嚴峻挑戰。傳統的同步處理架構難以支撐海量請求并發下的性…

OpenCV CUDA模塊圖像變形------對圖像進行任意形式的重映射(Remapping)操作函數remap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數根據給定的映射表 xmap 和 ymap 對圖像進行 任意形式的重映射&#xff08;Remapping&#xff09;操作&#xff0c;是 GPU 加速版本的圖像幾…

PC 端常用 UI 組件庫

一、前言 隨著企業級應用、后臺管理系統、數據平臺等項目的不斷發展&#xff0c;前端開發已經不再局限于移動端和響應式布局&#xff0c;而是越來越多地聚焦于 PC 端系統的構建。為了提升開發效率、統一設計風格并保障用戶體驗&#xff0c;使用成熟的 UI 組件庫 成為了現代前端…

pikachu靶場通關筆記31 文件包含02之遠程文件包含

目錄 一、文件包含功能 二、文件包含Vulnerability 二、遠程文件包含 三、環境配置 1、進入靶場 2、搭建環境 &#xff08;1&#xff09;定位php.ini文件 &#xff08;2&#xff09;修改php.ini文件 四、源碼分析 五、滲透實戰 1、選擇科比 2、執行phpinfo &…

QT集成Boost庫

在Windows平臺上&#xff0c;使用Qt集成Boost庫&#xff0c;并基于MSVC編譯器在CMake文件中加載&#xff0c;可以按照以下步驟進行配置。 Boost庫的編譯 如果Boost庫未預編譯&#xff0c;需要手動編譯&#xff0c;解壓zip到D:\Library\boost_1_87_0&#xff0c;打開cmd命令行…

MySQL從庫復制延遲的監測

目錄 ?? 一、原生內置方法?? 二、心跳表工具&#xff08;如pt-heartbeat&#xff09;?? 三、MySQL 8.0 增強方案&#x1f4ca; 四、各方案對比總結&#x1f48e; 五、選擇建議 MySQL從庫復制延遲的監測是保障數據一致性和讀寫分離可靠性的關鍵環節&#xff0c;以下是主流…

slam--最小二乘問題--凹凸函數

最小二乘問題 最小二乘問題標準公式 殘差函數&#xff0c;線性和非線性最小二乘 最小二乘問題的兩種寫法&#xff1a; 目標 找到 x使得預測值 Ax與觀測值 b 的殘差平方和最小。 范數和范數平方 線性最小二乘 一般形式&#xff1a; 殘差 rAx?b是x 的線性函數。 目標函數是…

crackme008

crackme008 名稱值軟件名稱Andrnalin.1.exe加殼方式無保護方式serial編譯語言Microsoft Visual Basic調試環境win10 64位使用工具x32dbg,PEid破解日期2025-06-10 脫殼 1. 先用PEid查殼 查到無殼 尋找Serial 尋找flag&#xff0c;用x32dbg打開程序&#xff0c;鼠標右鍵->…

【C語言】圖書管理系統(文件存儲版)丨源碼+詳解

一、系統介紹 這是一個基于C語言開發的終端圖書管理系統&#xff0c;采用鏈表數據結構??二進制文件存儲技術實現。系統具有以下特點&#xff1a; ?雙角色系統?&#xff1a;管理員&#xff08;管理圖書&#xff09;和讀者&#xff08;借閱/歸還&#xff09;?完整功能?&a…

Java求職者面試題解析:Spring、Spring Boot、MyBatis框架與源碼原理

Java求職者面試題解析&#xff1a;Spring、Spring Boot、MyBatis框架與源碼原理 第一輪&#xff1a;基礎概念問題 1. 請解釋什么是Spring框架&#xff1f;它的核心特性有哪些&#xff1f; Spring是一個開源的Java/Java EE應用程序框架&#xff0c;用于簡化企業級應用開發。其…

【Chipyard】修改Gemmini 中PE的數量

實戰目標 PE數量擴大到原來4倍 原來配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 16,meshColumns: Int 16, 改后配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 32,meshColumns: Int 32, 修改配置 1. 修改gemmini的scala配置文件&#xff0c;用…

TCP客戶端進程分割輸入輸出

創建TCP客戶端&#xff0c;創建子進程分割TCP客戶端的read功能和write功能&#xff0c;實現分割I/O的目的。加快客戶端速率。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include …

Wi-Fi 6 在 2.4GHz 頻段的速率與優化分析

Wi-Fi 6&#xff08;802.11ax&#xff09;在 2.4GHz 和 5GHz 頻段均可工作&#xff0c;理論最高速率可達 1200 Mbps&#xff08;5GHz&#xff0c;80MHz&#xff0c;22 MIMO&#xff09;。但在 2.4GHz 頻段&#xff0c;速率受 信道寬度、MIMO、調制方式、干擾、協議開銷 影響&am…

WPF--Application.Current.Dispatcher.BeginInvoke

1.代碼示例 private void LogInfoList_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) {// 直接在這里修改集合會引發遞歸if (e.Action NotifyCollectionChangedAction.Add){if (logInfoList.Count > 200){logInfoList.RemoveAt(0); // 這里會…

ZooKeeper詳解以及應用部署(AI)

ZooKeeper 是一個開源的分布式協調服務框架&#xff0c;旨在為分布式應用提供一致性保障和關鍵協調功能。其核心設計理念是將復雜的分布式一致性邏輯封裝為簡單可靠的接口&#xff0c;讓開發者專注于業務邏輯而非底層協調難題。以下是其核心要點&#xff1a; &#x1f9e0; 一、…

將MySQL數據庫中所有表和字段編碼統一改為utf8mb4_unicode_ci

完整操作步驟 1. 首先修改數據庫默認字符集 sql ALTER DATABASE 你的數據庫名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2. 生成批量修改所有表的SQL語句 sql SELECT CONCAT(ALTER TABLE , table_schema, ., table_name, CONVERT TO CHARACTER SET utf8mb4 C…