【Docker】Docker的初步認識以及Ubuntu下的Docker環境安裝、配置

前言

???????在當今快速迭代的軟件開發與部署領域,容器化技術已成為不可或缺的核心力量,而 Docker 作為容器化技術的杰出代表,正以其輕量、高效、可移植的特性深刻改變著開發與運維的模式。它有效解決了 “在我機器上能運行,在你那里卻不行” 的環境一致性難題,極大簡化了應用的打包、分發與部署流程,讓開發者能夠更專注于業務邏輯的實現,而非環境配置的瑣碎細節。?

一、Docker的初步認識

1.什么是Docker?

Docker官網

DockerHub官網

Docker 是一個用于開發、部署和運行應用程序的開源平臺,它采用容器化技術,將應用及其依賴項打包成獨立的容器,確保應用在不同環境中無縫運行。以下是對 Docker 的詳細解釋:

(1). 核心概念

倉庫(Registry)
  • 鏡像存儲中心:倉庫用于存儲和分發鏡像,例如 Docker Hub、阿里云容器鏡像服務等。
  • 公有與私有:公有倉庫免費使用,私有倉庫適合企業內部管理鏡像。
  • 注:類比為軟件官網,其具有分發軟件安裝包(鏡像)的功能。
鏡像(Image)
  • 容器的模板:鏡像是一個只讀的文件,包含創建容器所需的所有內容(代碼、依賴、配置等)。
  • 分層結構:鏡像采用分層存儲,復用公共層,減少存儲空間和下載時間。
  • 注:類比為常見的軟件安裝包。
容器(Container)
  • 輕量級隔離環境:容器是應用運行的獨立環境,包含代碼、運行時、系統工具和庫,與其他容器共享宿主機操作系統內核。
  • 隔離性:容器之間相互隔離,不會影響其他容器或宿主機的運行狀態。
  • 注:類比為軟件安裝包安裝軟件后的一個正在運行的軟件,在該軟件環境(就相當于容器)下進行相應的工作。

(2). Docker 與傳統虛擬機的區別

Docker 與虛擬化技術:本質差異與演進邏輯

Docker 與傳統虛擬化技術(如 VMware、Hypervisor)均屬于環境隔離技術,但在架構設計、資源利用和應用場景上存在本質差異。Docker 通過容器化技術對操作系統層進行深度封裝,實現了比虛擬機更輕量、更高效的應用隔離方案。

1). 技術架構對比:從系統級隔離到應用級隔離
維度Docker 容器傳統虛擬機
隔離層級操作系統層(共享內核,隔離用戶空間)硬件層(通過 Hypervisor 虛擬完整硬件)
資源抽象應用進程 + 依賴庫完整操作系統 + 硬件驅動
啟動機制直接啟動應用進程(無需加載內核)需要引導整個操作系統
鏡像體積通常幾十 MB 到 GB 級(分層存儲)通常數 GB 到 TB 級(含完整系統)
運行密度單主機可運行數百個容器單主機通常運行數十個虛擬機
2). Docker 的核心創新:容器深度封裝技術

Docker 在容器基礎上引入了三大核心封裝機制:

  1. 聯合文件系統(UnionFS)

    • 通過分層存儲技術,將應用依賴、配置和代碼分層打包,不同容器可共享基礎層,大幅減少存儲空間占用和部署時間。
    • 示例:多個 Python 應用可共享同一 Python 運行時鏡像層。
  2. 網絡命名空間與虛擬網絡

    • 為每個容器分配獨立的網絡棧(IP、端口、路由表),支持橋接、overlay 等多種網絡模式,實現容器間安全通信。
    • 對比虛擬機:無需為每個容器分配虛擬網卡,網絡延遲更低。
  3. Cgroups 資源隔離

    • 通過 Linux Control Groups 精確限制容器的 CPU、內存、IO 等資源,避免單個容器耗盡系統資源。
    • 特性:支持動態調整資源配額,適應彈性伸縮場景。
3). 性能對比:輕量與高效的實證數據
測試指標Docker 容器虛擬機性能差異
啟動時間0.1-1 秒30-120 秒快 30-1000 倍
內存占用(Nginx)~5MB~200MB節省 97% 內存
吞吐量(HTTP 請求)約 95% 原生性能約 70% 原生性能提升 35% 吞吐量
4). 應用場景的分化與融合
  • Docker 適用場景

    • 微服務架構(如 Netflix、Amazon 的容器化改造)
    • CI/CD 流水線(GitLab、Jenkins 的容器化部署)
    • 開發環境一致性保障(DevOps 團隊協作)
  • 虛擬機適用場景

    • 異構操作系統共存(Windows + Linux 混合環境)
    • 安全敏感型應用(金融、醫療領域的合規要求)
    • 資源密集型單應用(傳統數據庫、中間件)
  • 融合趨勢

    • 容器云平臺:在虛擬機集群上部署 Docker,兼顧隔離性與彈性(如 AWS EKS、阿里云 ACK)
    • 邊緣計算:輕量級容器在資源受限設備上替代虛擬機(如 Raspberry Pi + Docker)
5). 技術選型決策矩陣
需求維度優先選擇 Docker優先選擇虛擬機
資源利用率高(密度部署)低(冗余系統開銷)
部署速度秒級(適合頻繁迭代)分鐘級(適合長期穩定運行)
異構環境支持單一內核(Linux/Windows)多操作系統(跨平臺兼容)
安全隔離級別進程級隔離(需加固配置)系統級隔離(天然安全邊界)
Docker 與傳統虛擬機的區別的總結:容器技術的演進價值

???????Docker 通過操作系統級虛擬化,在保留虛擬機隔離優勢的同時,消除了傳統虛擬化的性能損耗和資源冗余。其核心價值在于:

  • 開發效率提升:一次構建,隨處運行,徹底解決 “環境不一致” 問題
  • 運維成本降低:資源利用率提升 3-5 倍,部署速度提升 10-100 倍
  • 架構創新:推動微服務、Serverless 等新型架構落地
對比項Docker 容器傳統虛擬機
隔離級別共享內核,進程級隔離完全隔離,包含獨立操作系統
啟動速度秒級啟動分鐘級啟動
資源占用輕量,僅需必要依賴重量級,需完整操作系統
性能接近原生性能性能損耗較大
部署效率高(鏡像復用、快速部署)低(需安裝完整操作系統)

虛擬機的架構圖:

Docker的架構圖:

簡化的虛擬機和Docker的架構對比圖:

(3). Docker 的優勢

  • 環境一致性:確保開發、測試、生產環境一致,避免 “環境差異” 導致的問題。
  • 快速部署與擴展:容器秒級啟動,支持快速復制和擴展,適應微服務架構。
  • 資源利用率高:多個容器共享內核,資源占用少,提升硬件利用率。
  • 可移植性強:一次構建,隨處運行(支持 Linux、Windows、macOS 等)。
  • 版本控制:鏡像支持版本管理,方便回滾和追蹤變更。

(4). 典型應用場景

  • 微服務架構:將應用拆分為多個獨立容器,實現松耦合、高可用。
  • 持續集成與部署(CI/CD):自動化構建、測試和部署容器化應用。
  • 開發環境管理:為團隊提供一致的開發環境,避免依賴沖突。
  • 資源密集型應用:通過容器隔離和資源限制,優化資源分配。

(5). 基本工作流程

  1. 編寫 Dockerfile:定義應用的環境和依賴。
  2. 構建鏡像:使用?docker build?命令創建鏡像。
  3. 運行容器:使用?docker run?命令啟動容器。
  4. 推送 / 拉取鏡像:將鏡像上傳至倉庫或從倉庫下載。

(6). 核心組件

  • Docker 引擎:運行在宿主機上的服務,負責創建和管理容器。
  • Docker CLI:命令行工具,用于與 Docker 引擎交互。
  • Docker Compose:定義和運行多容器應用的工具(通過 YAML 文件配置)。
  • Docker Swarm/Kubernetes:容器編排工具,用于集群管理和自動化部署。

Docker-總結

???????Docker 通過容器化技術,將應用與環境解耦,實現了高效、一致的應用交付。它已成為云計算、DevOps 和微服務領域的基石技術,幫助開發者和運維團隊降低成本、提升效率。在后續內容中,我們將詳細介紹如何在 Ubuntu 系統上安裝和配置 Docker 環境。

2.為什么使用Docker?

使用 Docker 的核心價值,在于它從根本上解決了軟件開發、部署和運維中的一系列經典痛點,尤其在云原生、微服務和 DevOps 興起的背景下,其優勢被進一步放大。具體可從以下 6 個核心場景和技術價值展開:

1).?徹底解決 “環境不一致” 問題:一次構建,隨處運行

開發中最常見的矛盾是:“在我電腦上能跑,到你這怎么就報錯了?” 根源在于開發、測試、生產環境的依賴(如系統版本、庫版本、配置文件)存在差異。
Docker 通過容器鏡像將應用及其所有依賴(代碼、運行時、庫、環境變量、配置文件)打包成一個不可變的 “標準化交付單元”。無論在開發者的筆記本(Ubuntu/macOS)、測試服務器(CentOS)還是生產集群(云服務器),只要安裝了 Docker,容器就能以完全一致的方式運行,消除了 “環境適配” 的重復勞動。

2).?資源效率碾壓傳統虛擬化:輕量、高密度、低成本

相比虛擬機(VM),Docker 容器的 “輕量性” 帶來了顯著的資源優勢:

  • 啟動速度:容器直接復用宿主機內核,無需加載完整操作系統,啟動時間從虛擬機的 “分鐘級” 縮短到 “秒級甚至毫秒級”(如 Nginx 容器啟動僅需 0.1 秒)。
  • 資源占用:容器僅包含應用及必要依賴,鏡像體積通常是虛擬機鏡像的 1/10 到 1/100(例如一個 Python 應用容器約 50MB,而同等功能的虛擬機鏡像可能達 5GB)。
  • 運行密度:單臺服務器可運行數百個容器(而虛擬機通常只能運行幾十個),大幅提升硬件利用率,降低服務器采購和運維成本(尤其對云服務器按資源計費場景)。

3).?簡化部署與運維:從 “手動配置” 到 “自動化交付”

傳統部署流程(如手動安裝依賴、改配置、啟停服務)不僅繁瑣,還容易因人為操作出錯。Docker 通過鏡像版本管理容器編排,將部署流程 “代碼化”:

  • 版本可控:鏡像支持版本標簽(如app:v1.0app:v2.0),部署時指定版本即可,回滾時只需切換標簽,比手動卸載 / 重裝高效 10 倍以上。
  • 自動化集成:無縫對接 CI/CD 工具(如 GitLab CI、Jenkins),代碼提交后自動構建鏡像、運行測試、部署到目標環境,實現 “提交即部署” 的 DevOps 閉環。
  • 批量操作:通過 Docker Compose 或 Kubernetes,可一鍵啟動 / 停止 / 擴容多個關聯容器(如 “前端 + 后端 + 數據庫” 的微服務組合),替代復雜的手動腳本。

4).?微服務架構的 “最佳搭檔”:解耦與彈性伸縮

在微服務架構中,一個系統被拆分為多個獨立服務(如用戶服務、訂單服務、支付服務),每個服務需要獨立部署、擴展和維護。Docker 的特性完美適配這一需求:

  • 服務隔離:每個微服務運行在獨立容器中,通過虛擬網絡通信,單個服務崩潰不會影響其他服務,且資源(CPU / 內存)可單獨限制,避免 “一個服務耗盡整機資源”。
  • 彈性伸縮:當某個服務壓力增大時,可通過容器編排工具(如 K8s)快速復制多個容器實例分擔負載,壓力減小時自動銷毀冗余實例,實現 “按需分配資源”。
  • 技術棧靈活:不同微服務可使用不同技術棧(如 A 服務用 Python,B 服務用 Java),容器化后無需擔心依賴沖突,降低跨團隊協作的技術門檻。

5).?開發效率提升:快速搭建 “干凈環境”

開發者常需要在本地測試不同版本的依賴(如 “測試 Python 3.8 和 3.9 對應用的影響”),或臨時啟動輔助服務(如 Redis、MySQL)。傳統方式需手動安裝、配置,結束后還得清理殘留文件,耗時且易污染系統。
Docker 可通過臨時容器快速解決:

  • 啟動一個redis:6.2容器,用完直接刪除(docker rm),無需擔心系統殘留配置;
  • 為不同依賴版本創建獨立鏡像(如app:py38app:py39),切換環境只需切換容器,避免本地環境 “越用越亂”。

6).?跨平臺兼容性:從本地到云,無縫遷移

無論是個人電腦(Windows/macOS/Linux)、物理服務器,還是公有云(AWS/Azure/ 阿里云)、私有云,只要支持 Docker,容器就能一致運行。這打破了 “云廠商鎖定”:

  • 開發者在本地用 Ubuntu 開發的容器,可直接部署到阿里云 ECS(CentOS 系統),無需修改任何配置;
  • 未來若需從 AWS 遷移到自建數據中心,只需遷移鏡像和容器配置,避免因平臺差異導致的 “重寫適配代碼”。

總結:Docker 的核心價值公式

Docker = 環境一致性 + 資源效率 + 部署自動化 + 架構靈活性

它不是 “銀彈”,但在大多數場景下(尤其是分布式系統、頻繁迭代、多環境協作),能將團隊的 “無效勞動”(環境調試、手動部署、跨平臺適配)轉化為 “有效創新”,這也是它從 2013 年誕生至今,成為云原生時代基礎設施的核心原因。

3.概念詳解

1)鏡像

???????操作系統一般分為內核和用戶空間,而對于 Linux 而言,內核啟動后,會掛載 root 文件系統(rootfs)為其提供用戶空間支持。而 Docker 鏡像(Image)就相當于是一個 root 文件系統。比如:官方鏡像 ubuntu:22.04 就包含了完整的一套 Ubuntu 22.04 最小系統的 root 文件系統。同時,Docker 鏡像 是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含 任何動態數據,其內容在構建之后也不會被改變。

???????鏡像的分層存儲:

???????因為鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像并非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。

???????鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

???????分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。、

2)容器

???????鏡像和容器的關系,就像面向對象編程里的類和實例:鏡像是靜態的模板,容器是鏡像運行起來的實體,能被創建、啟動、停止、刪除等。

???????容器本質是進程,但它運行在獨立的命名空間中,有自己的 root 文件系統、網絡配置、進程空間等,就像在獨立系統中操作,比直接在宿主運行更安全,這也讓初學者易與虛擬機混淆。

???????容器和鏡像一樣采用分層存儲,運行時以鏡像為基礎層,再創建一個容器存儲層供讀寫。容器存儲層隨容器消亡而消失,所以里面的信息會跟著容器刪除而丟失。

???????按 Docker 最佳實踐,容器存儲層要保持無狀態,不寫入數據。文件寫入應使用數據卷或綁定宿主目錄,這樣能跳過容器存儲層,直接操作宿主或網絡存儲,性能和穩定性更好。而且數據卷生命周期獨立于容器,容器沒了,數據卷里的數據也不會丟失。

3)倉庫

???????鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。

???????一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);而每個標簽對應一個鏡像。

???????通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。

???????以 Ubuntu 鏡像為例,ubuntu 是倉庫的名字,其內包含有不同的版本標簽,如:16.04, 18.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如 ubuntu,那將視為 ubuntu:latest。

???????倉庫名經常以兩段式路徑形式出現,比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多用戶環境下的用戶名,后者則往往是對應的軟件名。但這并非絕對,取決于所使用的具體 Docker Registry 的軟件或服務。

參考鏈接(如有侵權,請聯系刪除):

一文說清 Docker 是什么(非常詳細),零基礎入門到精通,看這一篇就夠了-CSDN博客

二、基于Ubuntu下的Docker安裝步驟

1.查看是否已經安裝了Docker,如果安裝則刪除舊版本

#查看Docker版本
docker --version#刪除舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc

2.安裝下載Docker時需要的依賴

#更新 apt 包索引
sudo apt-get update#安裝相關軟件包以允許 apt 通過 HTTPS 使用 docker 存儲庫
sudo apt-get install ca-certificates curl gnupg lsb-release

3.使用存儲庫安裝 Docker

????為什么使用存儲庫安裝 Docker?

  1. 自動解決依賴:Docker 依賴于多個系統組件(如 containerdrunc),存儲庫安裝會自動處理這些依賴關系。
  2. 版本管理:通過存儲庫可以輕松安裝、升級或降級軟件版本,且支持自動更新。
  3. 安全性:官方存儲庫的軟件包經過簽名驗證,確保來源可信。
  4. 標準化流程:所有 Linux 發行版都支持通過存儲庫安裝軟件,操作統一。

(1)添加 Docker 的官方 GPG 密鑰

# 1. 創建存放GPG密鑰的目錄
sudo mkdir -p /etc/apt/keyrings# 2. 下載Docker官方GPG密鑰并保存
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

第一條命令:創建存放 GPG 密鑰的目錄

參數解析

  • sudo
    以超級用戶(root)權限執行命令,因為 /etc 目錄通常只有 root 用戶可寫。

  • mkdir
    創建目錄的命令(Make Directory)。

  • -p
    遞歸創建父目錄。如果 /etc/apt/keyrings 的上級目錄(如 /etc/apt)不存在,會自動創建它們。
    例如:若 /etc/apt 不存在,會先創建 /etc/apt,再創建 /etc/apt/keyrings

  • /etc/apt/keyrings
    目標目錄路徑。

    • /etc/apt:Debian 系 Linux 存放軟件源配置的目錄。
    • keyrings:專門用于存放 GPG 密鑰環的子目錄(從 APT 2.4 版本開始推薦)。

?第二條命令:下載并保存 Docker 官方 GPG 密鑰

管道前半部分:curl -fsSL [...]
  • curl
    用于發送 HTTP 請求、下載文件的命令行工具。

  • -f (--fail)
    若 HTTP 請求返回錯誤狀態碼(如 404、500),立即終止并返回錯誤,避免輸出錯誤頁面內容。

  • -s (--silent)
    靜默模式,不顯示進度條和錯誤信息(但 -S 會覆蓋此選項,顯示錯誤)。

  • -S (--show-error)
    -s 配合使用,即使靜默模式也顯示錯誤信息。

  • -L (--location)
    若服務器返回重定向(如 301、302),自動跟隨重定向到新 URL。

  • https://download.docker.com/linux/ubuntu/gpg
    Docker 官方提供的 GPG 公鑰下載地址,用于驗證軟件包的簽名。

管道后半部分:sudo gpg --dearmor -o [...]
  • gpg
    GNU Privacy Guard,用于加密、簽名和驗證的工具。

  • --dearmor
    將 ASCII 格式的 GPG 密鑰(文本形式)轉換為二進制格式(.gpg 文件)。

例如,下載的原始密鑰是:

plaintext

-----BEGIN PGP PUBLIC KEY BLOCK-----
...(長文本)...
-----END PGP PUBLIC KEY BLOCK-----
  • 轉換后變為二進制格式,便于 APT 系統讀取。

  • -o /etc/apt/keyrings/docker.gpg
    -o (--output):指定輸出文件路徑。
    將轉換后的二進制密鑰保存為 /etc/apt/keyrings/docker.gpg

為什么需要這兩步?
  1. 安全性
    GPG 密鑰用于驗證軟件包是否由 Docker 官方發布,防止中間人攻擊或篡改。

  2. 兼容性
    從 APT 2.4 版本開始,推薦將密鑰存放在 /etc/apt/keyrings/ 目錄,并在軟件源配置中用 signed-by 指定密鑰路徑。

  3. 自動化
    通過命令自動下載和配置密鑰,避免手動操作可能的錯誤。

驗證配置結果

bash

# 檢查目錄是否創建成功
ls -ld /etc/apt/keyrings# 檢查密鑰文件是否存在且正確
ls -l /etc/apt/keyrings/docker.gpg
gpg --show-keys /etc/apt/keyrings/docker.gpg

正常情況下,密鑰文件權限應為 -rw-r--r--(644),且能顯示密鑰的指紋信息(如 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)。

(2)設置存儲庫

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee -a /etc/apt/sources.list.d/docker.list > /dev/null
逐段解析:
1. echo "deb [...]"
  • echo:輸出字符串到標準輸出
  • deb [...]:這是 APT 軟件源配置的格式,告訴系統從哪里下載軟件包
2. [arch=$(dpkg --print-architecture)]
  • arch=:指定軟件包的架構(如 amd64、arm64)
  • dpkg --print-architecture:自動獲取當前系統的架構
    • 例如在 x86_64 系統上會輸出 amd64
    • 在 ARM64 系統上會輸出 arm64
  • 作用:確保只下載與當前系統架構匹配的軟件包
3. signed-by=/etc/apt/keyrings/docker.gpg
  • signed-by:指定用于驗證軟件包簽名的 GPG 密鑰
  • /etc/apt/keyrings/docker.gpg:Docker 官方 GPG 密鑰的路徑
  • 作用:防止軟件包被篡改,確保來源可信
4. https://download.docker.com/linux/ubuntu
  • Docker 官方軟件源的基礎 URL
  • Ubuntu 系統的 Docker 軟件包都存放在這個服務器上
5. $(lsb_release -cs)
  • lsb_release -cs:獲取當前 Ubuntu 系統的版本代號(Codename)
    • 例如 Ubuntu 22.04 的代號是 jammy
    • Ubuntu 20.04 的代號是 focal
  • 作用:自動適配不同版本的 Ubuntu,確保下載的軟件包兼容
6. stable
  • Docker 軟件源的通道(channel)
    • stable:穩定版(推薦生產環境使用)
    • 其他可選通道:edge(測試版)、nightly(開發版)
7. | sudo tee -a /etc/apt/sources.list.d/docker.list
  • |:管道符號,將前面的輸出作為后面命令的輸入
  • sudo tee -a
    • tee:將輸出同時寫入文件和屏幕
    • -a:追加模式(append),不覆蓋原有內容
    • sudo:以管理員權限執行
  • /etc/apt/sources.list.d/docker.list:APT 軟件源配置文件
    • APT 會自動讀取這個目錄下的所有 .list 文件
8. > /dev/null
  • >:重定向符號
  • /dev/null:Linux 的黑洞設備,所有寫入的數據都會被丟棄
  • 作用:隱藏命令的輸出(不顯示在終端)
總結

這個命令的核心作用是:

  1. 自動生成 Docker 官方軟件源的配置
  2. 將配置寫入 /etc/apt/sources.list.d/docker.list 文件
  3. 配置會根據當前系統架構和版本自動適配
  4. 使用 Docker 官方 GPG 密鑰確保軟件包安全

4.安裝 Docker engine

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

5.驗證安裝是否完成

sudo docker -v

注:拉取鏡像除了使用VPN,還可以配置到國內的鏡像源進行拉取;Docker桌面版沒怎么用,暫不介紹。

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

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

相關文章

【密碼學】2. 古典密碼

目錄2. 古典密碼2.1 經典加密技術基礎2.2 代換技術2.2.1 算術密碼2.2.2 代換密碼&#xff08;Substitution Cipher&#xff09;2.3 置換技術2.4 乘積密碼2.5 歷史上的教訓2. 古典密碼 2.1 經典加密技術基礎 分類 代換&#xff08;Substitution&#xff09;&#xff1a;明文內…

CSS3文本陰影特效全攻略

CSS3文本陰影效果實現 下面我將創建一個展示各種CSS3文本陰影效果的頁面&#xff0c;包含多種樣式示例和代碼實現。 設計思路 創建具有視覺吸引力的標題區域提供多種文本陰影效果實例顯示對應的CSS代碼以供參考添加交互元素讓用戶自定義效果 實現代碼 <!DOCTYPE html&g…

JavaScript 03 嚴格檢查模式Strict字符串類型詳解

2.4 嚴格檢查模式Strict在 JavaScript 里&#xff0c;也是 有 “作用域” 這個說法的。 所以說&#xff0c;變量 也分 全局變量 和 局部變量。 當我們 直接 把 代碼 寫在 script 雙標簽里面的時候&#xff0c;我們 JS 會認為 這只是 一個 沒有名字的 函數&#xff01;&#xff…

車載診斷ECU架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

使用vue-pdf-embed發現某些文件不顯示內容

在使用vue-pdf-embed過程中, 突然發現有些pdf文件可以正常打開, 有些文件只顯示了一些數字, 并且控制臺報出如下警告: Warning: loadFont - translateFont failed: “UnknownErrorException: Ensure that the cMapUrl and cMapPacked API parameters are provided.”. Warning…

【設計模式C#】狀態模式(用于解決解耦多種狀態之間的交互)

一種行為設計模式。特點是用類的方式去管理狀態。優點&#xff1a;對每個狀態進行了封裝&#xff0c;提高了代碼的可維護性&#xff1b;減少了條件判斷語句的使用&#xff0c;降低維護成本&#xff1b;易于擴展&#xff0c;每次新增狀態都無需大規模修改其他類&#xff0c;符合…

WebSocket數據通過splice保持現有DOM結構僅更新文本內容?【防閃爍】。

文章目錄 前言 一、DOM更新優化機制 ?1.虛擬DOM復用性 2.?響應式系統觸發 二、性能對比 三、WebSocket場景實踐 ?1.防閃爍原理 2.代碼實現示例 四、特殊注意事項 總結 前言 開發過程中渲染websocket返回的數據時&#xff0c;經常會遇到更新數據閃爍的問題&#xff0c;咱們可…

深入解析Hadoop的Block多副本同步機制與Pipeline復制

Hadoop分布式文件系統概述作為Hadoop生態的核心存儲組件&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;的設計哲學源于Google File System論文&#xff0c;其架構專門針對大規模數據集處理場景進行了優化。在理解Block多副本同步機制之前&#xff0c…

洪水預報中的序列到序列模型及其可解釋性擴展

洪水預報中的序列到序列模型及其可解釋性擴展 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 引言 洪水預報是水文科學和災害管理中的重要課題&#xff…

UniApp 優化實踐:使用常量統一管理本地存儲 Key,提升可維護性

在 UniApp 項目開發中&#xff0c;隨著功能的增加&#xff0c;本地存儲&#xff08;如 uni.setStorageSync&#xff09;的使用頻率也會增加。如果直接在代碼中硬編碼 key 值&#xff0c;不僅容易出錯&#xff0c;也難以后期維護。本文將以“自定義導航欄適配狀態欄高度”為例&a…

計算機網絡:(八)網絡層(中)IP層轉發分組的過程與網際控制報文協議 ICMP

計算機網絡&#xff1a;&#xff08;八&#xff09;網絡層&#xff08;中&#xff09;IP層轉發分組的過程與網際控制報文協議 ICMP前言一、IP層轉發分組的過程第一步&#xff1a;接收數據包并解封裝第二步&#xff1a;提取目標 IP 地址第三步&#xff1a;查詢路由表第四步&…

Python爬蟲實戰:研究concurrent-futures庫相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、學術研究等領域具有廣泛應用。隨著互聯網數據量的爆炸式增長,傳統單線程爬蟲的效率已難以滿足需求,并發爬蟲技術成為研究熱點。 1.2 相關工作 現有爬蟲框架如 Scrapy、Beautifu…

Neo4j 框架 初步簡單使用(基礎增刪改查)

Neo4j 是一個高性能的、開源的圖數據庫。它將數據存儲為圖結構&#xff0c;其中節點表示實體&#xff0c;邊表示實體之間的關系。這種圖數據模型非常適合處理復雜的關系型數據&#xff0c;能夠高效地進行關系查詢和遍歷。 Neo4j 的主要特性包括&#xff1a; 強大的圖查詢語言 C…

【iOS】鎖[特殊字符]

文章目錄前言1??什么是鎖&#x1f512;&#xff1f;1.1 基本概念1.2 鎖的分類2??OC 中的常用鎖2.1 OSSpinLock&#xff08;已棄用&#xff09;&#xff1a;“自旋鎖”的經典代表為什么盡量在開發中不使用自旋鎖自旋鎖的本質缺陷&#xff1a;忙等待&#xff08;Busy Waiting…

在easyui中如何設置自帶的彈窗,有輸入框

這個就是帶input的確認彈框&#xff08;$.messager.prompt&#xff09;// 使用prompt并添加placeholder提示 $.messager.prompt(確認, 確定要將事故記錄標記為 statusText 嗎&#xff1f;, function(r) {if (r) {// r 包含用戶輸入的內容var remark r.trim();// 驗證輸入不為…

Android-API調用學習總結

一、Postman檢查API接口是否支持1.“HTTP Request” 來創建一個新的請求。——請求構建界面&#xff0c;這是你進行所有 API 調用的地方。2.設置請求方法和 URL&#xff1a;選擇請求方法&#xff1a; 在 URL 輸入框左側&#xff0c;有一個下拉菜單。點擊它&#xff0c;選擇你想…

《計算機網絡》實驗報告一 常用網絡命令

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 ping基本用法 3.2 ifconfig/ipconfig基本用法 3.3 traceroute/tracert基本用法 3.4 arp基本用法 3.5 netstat基本用法 4、實驗結果與分析 4.1 ping命令的基本用法 4.2 ifconfig/ipconfig命令的基本用法 4.3 tracer…

MySQL深度理解-深入理解MySQL索引底層數據結構與算法

1.引言在項目中會遇到各種各樣的慢查詢的問題&#xff0c;對于千萬級的表&#xff0c;如果使用比較笨的查詢方式&#xff0c;查詢一條SQL可能需要幾秒甚至幾十秒&#xff0c;如果將索引設置的比較合理&#xff0c;可以將查詢變得仍然非常快。2.索引的本質索引&#xff1a;幫助M…

Django母嬰商城項目實踐(九)- 商品列表頁模塊

9、商品列表頁模塊 1、業務邏輯 商品模塊分為:商品列表頁 和 商品詳情頁 商品列表頁將所有商品按照一定的規則排序展示,用于可以從銷量、價格、上架時間和收藏數量設置商品的排序方式,并且在商品左側設置分類列表,選擇某一個分類可以篩選出對應的商品信息。 商品列表頁…

8、STM32每個系列的區別

1、F1和F4的系列的區別 F1采用Crotex M3內核&#xff0c;F4采用Crotex M4內核。F4比F1的主頻高。F4具有浮點數運算單元&#xff0c;F1沒有浮點單元。F4的具備增強的DSP指令集。F407的執行16位DSP指令的時間只有F1的30%~70%。F4執行32位DSP指令的時間只有F1的25% ~ 60%。F1內部S…