【Docker】P3 入門指南:運維與開發雙重視角

目錄

  • Docker入門:運維與開發
  • 運維視角
    • Docker 架構概述
    • Docker 鏡像
      • 鏡像概念理解
      • 查看和管理鏡像
      • 拉取鏡像
      • 鏡像標識
  • 容器管理
    • 啟動容器
    • 容器內操作
    • 容器的后臺運行
    • 多容器管理
    • 重新進入運行中的容器
    • 容器生命周期管理
  • 開發視角
    • 容器化思維
    • 示例:基于 Nginx 鏡像構建簡單 Web 應用
      • 創建 Dockerfile
      • 創建靜態網頁文件
      • 構建鏡像
    • 運行應用容器
    • 完整的開發工作流
  • 總結

注:本文將基于 macOS 操作系統環境展開。

在這里插入圖片描述

Docker入門:運維與開發

本章的初衷是在深入研究 Docker 之前,對 Docker 進行一個整體的介紹,讓讀者有一個全面而清晰的初步認知。本章內容主要從兩種視角展開:

  • 運維(Ops)視角: 關注 Docker 的基礎操作和管理
  • 開發(Dev)視角: 關注應用開發和容器化

在運維視角中,主要包括下載鏡像、運行新的容器、登錄新容器、在容器內運行命令,以及銷毀容器等核心操作。

在開發視角中,主要關注與應用構建、打包和部署相關的內容。

通過上述兩部分內容的了解,讀者可以從整體上理解 Docker 究竟是什么,以及主要組件之間是如何相互配合的。


運維視角

Docker 架構概述

當讀者安裝 Docker 時,會涉及兩個核心組件:

  1. Docker 客戶端(Docker Client): 用戶與 Docker 交互的命令行工具
  2. Docker 守護進程(Docker Daemon): 實現了 Docker 引擎的 API,負責管理鏡像、容器、網絡和存儲卷

在不同操作系統上,客戶端與守護進程的通信方式有所不同:

  • Linux/macOS: 通過本地 IPC/UNIX Socket (/var/run/docker.sock) 完成通信
  • Windows: 通過命名管道(Named Pipes)完成通信

讀者可以使用以下命令來檢查客戶端和服務端是否都已經成功運行,并且可以互相通信:

docker version

期望輸出應包含 Client 和 Server 兩部分信息,表示通信正常。

Docker 鏡像

鏡像概念理解

將 Docker 鏡像理解為一個包含了操作系統文件系統和應用程序的只讀模板會很有幫助。如果讀者有虛擬化經驗,可以將其類比為虛擬機模板——虛擬機模板本質上是處于關機狀態的虛擬機。在 Docker 世界中,鏡像實際上等價于未運行的容器。

查看和管理鏡像

在 Docker 主機上運行以下命令查看所有本地鏡像:

docker image ls

在剛搭建好的 Docker 環境中,會輸出類似如下的表頭,但沒有任何鏡像:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE

拉取鏡像

在 Docker 主機上獲取鏡像的操作被稱為拉取(Pulling)。我們以 Ubuntu 為例:

# 拉取最新版本的 ubuntu 鏡像,默認為 ubuntu:latest
docker pull ubuntu# 或者拉取特定版本
docker pull ubuntu:perl

再次運行 docker image ls 命令查看剛剛拉取的鏡像:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        latest    b60cb74dfa1b   3 weeks ago   101MB

鏡像標識

Docker 的每個鏡像都有自己唯一的 ID(基于 SHA256 哈希),如上述示例中的 IMAGE ID 屬性對應的值 b60 即為 ubuntu 鏡像源的 ID值,用戶可以通過以下方式引用鏡像:

  • 鏡像名稱 + 標簽: ubuntu:latest
  • 鏡像 ID: b60cb74dfa1b(通常只需要輸入前幾個字符即可識別,如 b60

容器管理

啟動容器

到目前為止,讀者已經擁有一個拉取到本地的鏡像,可以使用 docker run 命令從鏡像來啟動容器:

# 交互式啟動容器并進入 bash shell
docker run -it ubuntu:latest /bin/bash

在上述命令中:

  • run 命令從鏡像源 nginx:latest 中啟動了容器
  • -it 參數組合了 -i(交互式)和 -t(分配偽終端),直接進入到容器內部并在后臺啟動
  • /bin/bash 指定了容器啟動后要執行的命令

容器內操作

在容器內,我們可以通過 ps -elf 來查看所有進程:

在這里插入圖片描述
關鍵進程解釋:

  • 第一個進程 PID 1/bin/bash 進程,該進程是通過 docker run 命令啟動的主進程
  • 第二個進程 PID 2ps -elf 進程,即當前正在執行的查看進程命令

容器的后臺運行

如果想退出容器但保持容器在后臺運行,可以通過使用組合鍵:

Ctrl + PQ

這會讓你退回到 Docker 守護進程所在的終端,而容器繼續在后臺運行。
現在可以通過 docker ps 命令查看當前運行的容器:

在這里插入圖片描述

多容器管理

有意思的是,鏡像是唯一的,但我們可以同一個鏡像創建多個容器實例。

# 啟動第二個容器
docker run -it ubuntu:latest /bin/bash
# 使用 Ctrl + P + Q 退出# 查看所有運行中的容器
docker ps

請添加圖片描述

重新進入運行中的容器

如果想重新進入到第一個運行的容器,可以首先通過 docker ps 查看容器的相信信息,尤其關注 CONTAINER ID 以及 NAMES 兩個屬性的值。

請添加圖片描述

可以使用 docker exec 命令:

# 方法1:使用容器ID(前幾位即可)
docker exec -it d85 /bin/bash# 方法2:使用容器名稱
docker exec -it happy_mendeleev /bin/bash

docker exec 命令支持我們重新進入當前正在運行的容器。

容器生命周期管理

停止容器

# 通過 Container ID 停止容器
docker stop d85
# 通過 Container Name 停止同期
docker stop happy_mendeleev

重啟容器

# 同樣可以通過 ID 或者 Names 重啟服務,這里只介紹通過 ID 重啟
docker restart d85

刪除容器

# 在停止容器運行時,注意需要區分是否已經停止運行
# 刪除已停止的容器
docker rm d85# 強制刪除運行中的容器
docker rm -f d85

開發視角

容器化思維

容器即應用! 這是 Docker 的核心理念。當我們開發完成一個應用時,如何將其封裝成一個可移植的"軟件包"呢?在 Docker 中,這個軟件包就是鏡像。

示例:基于 Nginx 鏡像構建簡單 Web 應用

在 Docker 中,我們通過 Dockerfile 文件來定義如何構建鏡像。首先我們先創建一個目錄地址,用于承載我們搭建的應用。

創建 Dockerfile

# 創建項目目錄
mkdir my-web-app
cd my-web-app# 創建 Dockerfile
touch Dockerfile
vim Dockerfile

在創建好的 Dockerfile 中輸入內容:

# Dockerfile
FROM nginx:alpine# 設置工作目錄
WORKDIR /usr/share/nginx/html# 復制靜態文件到容器中
COPY ./html/ .# 暴露端口
EXPOSE 80# 啟動命令(nginx:alpine 鏡像已有默認CMD)

創建靜態網頁文件

下面我們基于 HTML 創建一個簡單的靜態網頁文件,首先我們先在 my-web-app 目錄下創建一個名為 html 文件夾:

mkdir html

然后將下述內容粘貼到終端中。

cat > html/index.html << EOF
<!DOCTYPE html>
<html>
<head><title>My Docker Web App</title><style>body { font-family: Arial, sans-serif; margin: 40px; }.container { max-width: 600px; margin: 0 auto; text-align: center; }.success { color: #28a745; }</style>
</head>
<body><div class="container"><h1 class="success">Docker 容器化成功!</h1><p>這是一個運行在 Docker 容器中的靜態網站。</p><p>當前時間:<span id="time"></span></p></div><script>document.getElementById('time').textContent = new Date().toLocaleString();</script>
</body>
</html>
EOF

此時,我們的 my-web-app 整體架構如下:

.
Dockerfile
html
|-- index.html

通過 cat 命令查看 index.html 文件中內容,正如我們剛才粘貼創建的靜態網頁內容:

請添加圖片描述

構建鏡像

下一步,我們基于現已構建好的 Dockerfile 以及前端界面構建我們的鏡像。

# 構建鏡像,注意最后的 . 表示當前目錄
docker build -t my-web-app:v1.0 .

構建過程輸出:

當構建完成后,可以通過 docker image ls 命令查看我們構建好的鏡像:

docker image ls

輸出示例:

請添加圖片描述

太好了,創建完成!現在我們再輸入 docker image ls 命令查看所有的鏡像源,就會發現多一條我們剛創建好的、名為 my-web-app,版本為 v1.0 的鏡像源:

在這里插入圖片描述

運行應用容器

下一步,我們基于構建好的鏡像文件,啟動容器。

# 運行容器,將容器的80端口映射到主機的8080端口
docker run -d -p 8080:80 --name my-webapp my-web-app:v1.0

參數說明:

  • -d:后臺運行(detached mode)
  • -p 8080:80:端口映射,主機 8080 端口映射到容器 80 端口
  • --name my-webapp:給容器指定一個名稱
  • my-web-app:v1.0:使用的鏡像

現在,我們再通過 docker ps 命令檢查,就可以發現我們已經有一個在運行的容器了~

最后,我們欣賞一下自己基于 Docker-Nginx 鏡像源搭建的第一個小網絡。
http://localhost:8080

在這里插入圖片描述

完整的開發工作流

現在,讓我們從宏觀的工作流上總結下怎樣構建一個完整的應用:

  1. 編寫應用代碼
  2. 創建 Dockerfile
  3. 構建鏡像 (docker build)
  4. 運行容器 (docker run)
  5. 測試應用
  6. 推送到倉庫(可選)
# 可選:推送到 Docker Hub
docker tag my-web-app:v1.0 yourusername/my-web-app:v1.0
docker push yourusername/my-web-app:v1.0

總結

通過本博文內容,我們從運維開發兩個視角了解了 Docker 的基本概念和核心操作:

運維視角重點:

  • Docker 架構: 客戶端-服務端模式
  • 鏡像管理: 拉取、查看、刪除
  • 容器生命周期: 創建、啟動、停止、刪除
  • 容器操作: 進入容器、執行命令

開發視角重點:

  • 容器化思維: 容器即應用
  • Dockerfile: 定義鏡像構建過程
  • 鏡像構建: 從代碼到可部署的鏡像
  • 應用部署: 端口映射、容器命名

這些基礎操作構成了 Docker 使用的核心工作流,為后續深入學習 Docker 的高級特性打下了堅實的基礎。在后續博文中,我們將深入探討 Docker 網絡、存儲卷、編排等高級主題。


2025.09 金融街

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

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

相關文章

第六屆大數據、人工智能與物聯網工程國際會議(ICBAIE 2025)

重要信息 時間&#xff1a;2025年10月17-19日 地點&#xff1a;中國上海 官網&#xff1a;www.icbaie.net 征稿主題 1. 大數據與云計算 2. 人工智能技術與應用 3. 機器人科學與工程 4. 物聯網與傳感器技術 5. 其他 大數據、人工智能與物聯網 引言 在數字化轉型的時代…

Docker存儲卷(Volume)核心概念、類型與操作指南

文章目錄一、存儲卷概念二、存儲卷分類2.1 管理卷2.2 綁定數據卷2.3 臨時數據卷三、MySQL災難恢復四、存儲卷的局限性一、存儲卷概念 什么是存儲卷&#xff1f; ??Docker 存儲卷 是 Docker 容器中用于持久化存儲數據的獨立文件系統區域。它獨立于容器的聯合文件系統&#xf…

Electron 原生模塊集成:使用 N-API

引言&#xff1a;原生模塊集成在 Electron 開發中的 N-API 核心作用與必要性 在 Electron 框架的擴展開發中&#xff0c;原生模塊集成是提升應用性能和功能邊界的關鍵技術&#xff0c;特別是使用 N-API&#xff08;Node-API&#xff09;編寫和集成 C 原生模塊&#xff0c;更是 …

android組包時會把從maven私服獲取的包下載到本地嗎

Android項目在構建&#xff08;組包&#xff09;時&#xff0c;Gradle會自動將從Maven私服&#xff08;或任何配置的倉庫&#xff09;獲取的依賴包&#xff08;AAR、JAR等&#xff09;下載到本地的Gradle緩存目錄中。 下面詳細解釋這個過程和相關的概念&#xff1a; 詳細過程聲…

【應用筆記】構建具有增強識別、防欺騙和說話人識別功能的高級語音用戶界面--瑞薩電子

Suad Jusuf&#xff08;Director Product Marketing and Strategy, Renesas AI Center of Excellence&#xff09;&#xff1a;語音用戶界面&#xff08;VUI&#xff09;正在徹底改變我們與技術交互的方式&#xff0c;實現免提、無縫的通信。通過整合先進語音命令識別功能&…

DAY 26 函數專題1:函數定義與參數-2025.9.13

DAY 26 函數專題1&#xff1a;函數定義與參數 知識點回顧&#xff1a; 函數的定義變量作用域&#xff1a;局部變量和全局變量函數的參數類型&#xff1a;位置參數、默認參數、不定參數傳遞參數的手段&#xff1a;關鍵詞參數傳遞參數的順序&#xff1a;同時出現三種參數類型時…

芯昇XS9922C可替代TP9932和TP9930:國產四核高清解碼芯片,開啟車載視覺處理新紀元 ——從像素級解析到全鏈路集成,重新定義智能駕駛感知核心

引言&#xff1a;車載視覺的“芯”革命 在智能駕駛技術飛速演進的今天&#xff0c;高清視頻采集與實時處理已成為車輛環境感知的“神經中樞”。傳統解碼方案面臨傳輸距離有限、多芯片集成度低、音視頻同步難等痛點&#xff0c;制約著車載環視、盲區檢測等關鍵功能的性能突破。X…

百度競價推廣:百度搜索競價推廣代運營

在數字化營銷浪潮中&#xff0c;百度競價推廣憑借其強大的流量優勢和精準觸達能力&#xff0c;成為企業獲取客戶的核心渠道之一。然而&#xff0c;面對復雜的賬戶管理、激烈的關鍵詞競爭以及動態變化的市場環境&#xff0c;許多企業選擇將專業的事交給專業的人——通過代運營團…

開源端到端訓練多模態大模型LLaVA 深度拆解

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

排序算法(Java)

目錄 前言 常見的排序算法實現&#xff1a; 1. 冒泡排序 思路分析&#xff1a; 代碼實現&#xff1a; 2.選擇排序 思路分析&#xff1a; 代碼實現&#xff1a; 3.插入排序 思路分析&#xff1a; 代碼實現&#xff1a; 4.快速排序 思路分析&#xff1a; 代碼實現&…

深度學習打卡第N6周:中文文本分類-Pytorch實現

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、準備工作 數據格式&#xff1a; import torch from torch import nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

【代碼隨想錄day 24】 力扣 90. 集合II

視頻講解&#xff1a;https://www.bilibili.com/video/BV1vm4y1F71J/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html#%E6%80%9D%E8%B7%AF 力扣題目&#xff1a;https://leetcode.cn/problems/su…

.NET 6 文件下載

.NET 6 API中實現文件的下載。創建HttpHeaderConstant用于指定http頭。public sealed class HttpHeaderConstant{public const string RESPONSE_HEADER_CONTENTTYPE_STREAM "application/octet-stream";public const string RESPONSE_HEADER_NAME_FILENAME "f…

[數據結構——lesson6.棧]

目錄 引言 1.棧的概念和結構 棧的核心概念 棧的結構 2.棧的實現 2.1棧的實現方式 2.2棧的功能 2.3棧的聲明 1.順序棧 2。鏈式棧 2.4棧的功能實現 1.棧的初始化 2.判斷棧是否為空 3.返回棧頂元素 4.返回棧的大小 5.元素入棧 6.元素出棧 7.打印棧的元素 8.銷毀…

華為HICE云計算的含金量高嗎?

在數字時代的今天&#xff0c;云計算技術證飛速的發展成為企業數字化轉型的重要支撐。而華為作為領先的通信和信息技術公司&#xff0c;推出的HCIE云計算認證備受關注。接下來就來說說華為HCIE云計算認證的含金量到底有多高。HCIE認證被認為是華為認證中的最高等級&#xff0c;…

OSPF協議原理講解和實際配置(華為/思科)

OSPF&#xff08;open shorest path first&#xff0c;開放最短路徑優先&#xff09;是一種動態的&#xff0c;基于鏈路狀態的動態路由協議&#xff0c;廣泛的應用在企業網絡中&#xff0c;通過維護網絡拓撲信息&#xff0c;利用 Dijkstra 算法實現最短路徑&#xff0c;實現高效…

【開題答辯全過程】以 《黃帝內經》問答系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1,因為在此系統上禁止運行腳

這個錯誤是由于 PowerShell 的執行策略限制&#xff0c;導致無法運行腳本。你可以通過以下步驟解決這個問題&#xff1a; 1. 查看當前的執行策略 打開 PowerShell&#xff0c;以管理員身份運行&#xff0c;輸入以下命令查看當前的執行策略&#xff1a; Get-ExecutionPolicy如果…

macOS蘋果電腦運行向日葵遠程控制軟件閃退

文章目錄問題原因分析修復附錄向日葵字太小按Ctrl鍵會彈出開始菜單的問題問題 向日葵是一款遠程控制的應用&#xff0c;在macOS下也能運行&#xff0c; 本來用的好好的&#xff0c;有一天升級后突然就運行不起來了&#xff0c;一點開能顯示幾秒首界面&#xff0c;立馬就自動退…

Linux dma-buf 框架原理、實現與應用詳解

1. 背景與意義 1.1 異構系統與緩沖區共享的挑戰 在現代 SoC、嵌入式、圖形和多媒體系統中&#xff0c;CPU、GPU、VPU、ISP、DMA 控制器等多個硬件單元需要高效地共享和傳遞大塊數據&#xff08;如圖像幀、視頻流、AI 張量等&#xff09;。如果每個設備都維護獨立的緩沖區&…