1.什么是doker
Docker 是一個開源的應用容器引擎,它允許開發者將應用程序及其依賴項打包到一個可移植的容器中,然后發布到任何支持 Docker 的操作系統上,實現 “一次構建,到處運行”。
容器是一種輕量級的虛擬化技術,與傳統虛擬機不同,容器不需要模擬完整的操作系統,而是共享宿主操作系統的內核,因此啟動更快、資源占用更少。
1.1容器
容器(Container)是一種輕量級的虛擬化技術,它將應用程序及其所有依賴(如庫、配置文件、運行時環境等)打包在一起,形成一個獨立、可移植的單元。這種技術讓應用能夠在幾乎任何支持容器的環境中(無論是開發機、測試服務器還是生產服務器)以相同的方式運行,解決了 “在我這里能運行,在你那里卻不行” 的經典問題。
容器的核心特點
-
輕量級 容器不像傳統虛擬機那樣需要完整的操作系統副本,而是共享宿主機器的內核,只包含應用所需的運行時環境和依賴。因此,容器啟動速度極快(通常秒級),資源占用少,一臺主機可以運行成百上千個容器。
-
一致性 容器將應用和依賴 “打包”,確保在開發、測試、生產等不同環境中,應用的運行條件完全一致,避免因環境差異導致的問題。
-
隔離性 每個容器都有自己獨立的文件系統、網絡空間和進程空間,相互之間隔離,不會干擾彼此的運行。但這種隔離比虛擬機更輕量,因為它們共享底層內核。
-
可移植性 容器可以在任何支持容器引擎(如 Docker、containerd)的系統上運行,無論是物理機、虛擬機還是云平臺(AWS、Azure、阿里云等)。
-
可擴展性 基于相同的容器鏡像,可以快速復制出多個容器實例,輕松實現應用的水平擴展。
容器與傳統虛擬機的區別
特性 | 容器 | 傳統虛擬機(VM) |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
資源占用 | 低(共享內核) | 高(完整 OS) |
隔離級別 | 進程級隔離(輕量) | 完全隔離(重量級) |
操作系統依賴 | 依賴宿主內核(通常 Linux) | 獨立 OS,與宿主無關 |
鏡像大小 | 通常 MB 級 | 通常 GB 級 |
容器的典型使用場景
-
應用部署 簡化應用發布流程,開發者打包好容器后,運維人員可直接部署,無需關心環境配置。
-
微服務架構 微服務將應用拆分為多個獨立服務,每個服務可打包成一個容器,便于單獨開發、部署和擴展。
-
持續集成 / 持續部署(CI/CD) 在自動化流程中,容器可作為構建、測試、部署的標準化單元,確保流程一致性。
-
開發環境標準化 團隊成員使用相同的容器鏡像,避免 “本地環境差異” 導致的開發問題。
-
資源優化 相比虛擬機,容器能更高效地利用服務器資源,降低硬件成本。
常用容器技術
-
Docker:最流行的容器引擎,提供了完整的容器創建、管理和分發工具。
-
containerd:從 Docker 中分離出的容器運行時,更輕量,被 Kubernetes 等廣泛采用。
-
Kubernetes(K8s):容器編排平臺,用于大規模管理容器集群(自動擴縮容、負載均衡等)。
-
Podman:無守護進程的容器引擎,兼容 Docker 命令,安全性更高。
容器技術已成為現代軟件開發和云原生架構的基礎,極大地提升了應用交付效率和系統可擴展性。如果你想深入了解,建議從 Docker 入門,體驗容器的創建和管理流程。
2.doker的公共倉庫
Docker Hub(https://hub.docker.com/),它是 Docker 官方提供的公共鏡像倉庫,也是全球最大的容器鏡像存儲庫之一。
Docker Hub 的主要功能
-
提供官方鏡像:包含大量常用軟件的官方鏡像,如 Nginx、MySQL、Python、Node.js 等,這些鏡像由軟件官方維護,安全性和可靠性較高。
-
社區貢獻鏡像:開發者可以上傳自己制作的鏡像供他人使用,涵蓋各種應用場景(如特定版本的開發環境、定制化服務等)。
-
鏡像版本管理:支持為鏡像標記不同版本(Tag),方便用戶選擇特定版本的鏡像。
-
與代碼倉庫集成:可關聯 GitHub、GitLab 等代碼倉庫,實現代碼提交后自動構建鏡像并推送到 Docker Hub。
-
組織和團隊管理:支持創建組織(Organization)和團隊,便于團隊協作管理私有鏡像(免費賬戶有私有鏡像數量限制)。
如何使用 Docker Hub
-
注冊賬號:訪問 Docker Hub 官網注冊免費賬號。
-
搜索鏡像:通過官網搜索框或
docker search
命令查找所需鏡像,例如docker search nginx
。 -
拉取鏡像:使用
docker pull [鏡像名]:[版本]
命令拉取鏡像,如docker pull nginx:latest
(拉取最新版 Nginx)。 -
上傳鏡像:登錄后(
docker login
),可通過docker push [你的用戶名]/[鏡像名]:[版本]
上傳自己的鏡像。
其他公共鏡像倉庫
除了 Docker Hub,還有一些知名的公共鏡像倉庫(部分針對特定場景或地區優化):
-
Quay.io:由 Red Hat 維護,以安全性和企業級支持著稱。
-
GitHub Container Registry(GHCR):與 GitHub 集成,方便關聯代碼倉庫管理鏡像。
-
阿里云容器鏡像服務、騰訊云容器鏡像服務等:國內云廠商提供的倉庫,訪問速度更快,適合國內用戶。
-
Google Container Registry(GCR)、Amazon ECR:谷歌和亞馬遜的容器鏡像服務,適合在其云平臺上部署應用。
這些公共倉庫極大地簡化了容器化應用的分發和使用,開發者無需重復構建基礎鏡像,直接基于現有鏡像開發即可。
3.doker虛擬倉庫
Docker 的私有倉庫(Private Registry),它是用于存儲和管理私有 Docker 鏡像的服務,適合企業或團隊內部部分享和管理鏡像,確保鏡像的安全性和可控性(與公共倉庫如 Docker Hub 相對)。
私有倉庫的作用
-
安全性:企業內部的敏感鏡像(如包含業務代碼、配置的定制化鏡像)不適合公開到公共倉庫,私有倉庫可限制訪問權限。
-
可控性:可自主管理鏡像版本、刪除或更新鏡像,避免依賴外部倉庫的穩定性。
-
速度優化:本地私有倉庫可減少鏡像拉取 / 推送的網絡延遲,尤其適合內部大規模部署。
-
合規性:滿足數據本地化存儲、審計等企業合規要求。
常用的 Docker 私有倉庫方案
-
Docker 官方私有倉庫(Docker Registry) Docker 官方提供的開源倉庫工具,輕量級且易于部署,支持基本的鏡像存儲和訪問控制。
-
部署簡單:通過容器即可快速啟動(
docker run -d -p 5000:5000 --name my-registry registry:2
)。 -
基礎功能:支持鏡像推送、拉取、刪除,可結合認證工具(如 htpasswd)實現用戶權限管理。
-
局限性:無圖形化界面,高級功能(如鏡像掃描、細粒度權限)需額外配置。
-
-
Harbor 由 VMware 開源的企業級私有倉庫,功能豐富,適合生產環境。
-
核心特性:圖形化管理界面、角色權限控制、鏡像漏洞掃描、鏡像簽名驗證、日志審計等。
-
部署方式:支持 Docker Compose 快速部署,也可集成到 Kubernetes 集群。
-
適用場景:企業級鏡像管理,尤其適合微服務架構和云原生環境。
-
-
云廠商私有倉庫 各大云平臺提供的托管式私有倉庫服務,無需自行維護基礎設施:
-
阿里云容器鏡像服務(ACR)
-
騰訊云容器鏡像服務(TCR)
-
AWS Elastic Container Registry(ECR)
-
Google Container Registry(GCR) 優勢:與云平臺其他服務(如容器服務、CI/CD 工具)深度集成,提供高可用性和彈性擴展。
-
私有倉庫的基本使用流程
-
部署倉庫:通過上述工具搭建私有倉庫(如用 Docker Registry 在本地啟動一個倉庫)。
-
配置訪問
:
-
若倉庫使用 HTTP(非 HTTPS),需在客戶端 Docker 配置中添加
insecure-registries
(如"insecure-registries":["192.168.1.100:5000"]
)。 -
配置認證(如用戶名密碼),確保只有授權用戶可訪問。
-
-
使用鏡像
:
-
標記鏡像:
docker tag 本地鏡像名:版本 私有倉庫地址/鏡像名:版本
(如docker tag nginx:latest 192.168.1.100:5000/my-nginx:v1
)。 -
推送鏡像:
docker push 私有倉庫地址/鏡像名:版本
。 -
拉取鏡像:
docker pull 私有倉庫地址/鏡像名:版本
。
-
私有倉庫是企業 Docker 化實踐中的重要組件,可根據團隊規模、技術需求和資源情況選擇合適的方案(自建如 Harbor,或使用云托管服務)。
4.doker服務器與客戶端
在 Docker 體系中,“服務器” 和 “客戶端” 是基于 C/S(客戶端 - 服務器)架構的兩個核心組件,它們通過 Docker 守護進程(daemon)進行通信,協同完成容器的創建、管理等操作。
1. Docker 服務器(Docker Daemon)
Docker 服務器其實是運行在主機上的 Docker 守護進程(dockerd
),它是后臺運行的服務程序,負責處理 Docker 相關的核心操作,比如:
-
管理容器(創建、啟動、停止、刪除等)
-
管理鏡像(拉取、構建、存儲等)
-
處理網絡和存儲配置
-
響應客戶端的請求
特點:
-
默認運行在本地主機,監聽 Unix 套接字(
/var/run/docker.sock
) -
可以配置為遠程訪問(通過 TCP 端口,需注意安全設置)
-
是 Docker 體系的 “大腦”,所有實際操作都由它執行
2. Docker 客戶端(Docker Client)
Docker 客戶端是用戶與 Docker 交互的命令行工具(docker
命令),它的作用是:
-
接收用戶輸入的命令(如
docker run
、docker pull
) -
將命令轉換為 API 請求,發送給 Docker 守護進程
-
接收并展示守護進程返回的結果
特點:
-
無需與守護進程在同一臺機器上,可通過網絡連接遠程守護進程
-
支持多種命令,覆蓋容器、鏡像、網絡、卷等所有 Docker 功能
-
是用戶操作 Docker 的入口
3. 工作流程(客戶端與服務器的交互)
-
用戶在終端輸入 Docker 命令(如
docker run nginx
) -
客戶端解析命令,通過 API 向本地或遠程的 Docker 守護進程發送請求
-
守護進程接收請求,執行實際操作(如拉取 nginx 鏡像、創建并啟動容器)
-
守護進程將操作結果返回給客戶端
-
客戶端將結果展示給用戶
4. 遠程連接配置(客戶端連接遠程服務器)
默認情況下,客戶端僅連接本地守護進程。若需連接遠程 Docker 服務器,需配置:
服務器端(守護進程)配置:
-
編輯 Docker 配置文件(通常是/etc/docker/daemon.json),添加遠程訪問端口:
{"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }
-
重啟 Docker 服務:
systemctl restart docker
客戶端配置:
通過環境變量指定遠程服務器地址:
# 臨時生效 export DOCKER_HOST=tcp://遠程服務器IP:2375 ? # 執行命令(此時操作會作用于遠程服務器) docker ps
注意:直接開放 TCP 端口存在安全風險,生產環境建議配置 TLS 加密認證。
總結
-
Docker 服務器(守護進程):后臺服務,負責實際的容器和鏡像管理。
-
Docker 客戶端:命令行工具,負責接收用戶指令并與服務器通信。
-
兩者通過 API 交互,既可以在同一臺機器工作,也可以通過網絡遠程協作,這為跨主機管理容器提供了靈活性。
5,doker的鏡像與容器
Docker 中的鏡像(Image) 和容器(Container) 是兩個核心概念,兩者關系密切但又有本質區別,理解它們的關系是掌握 Docker 的關鍵。
1. 鏡像(Image):容器的 “模板”
鏡像可以理解為一個只讀的模板,包含了運行應用所需的所有內容:代碼、運行時環境、庫、環境變量、配置文件等。它是創建容器的基礎。
鏡像的特點:
-
只讀性:鏡像一旦構建完成,就無法修改(只能創建新的鏡像層)。
-
分層存儲:鏡像采用分層文件系統(如 UnionFS),每一層都包含文件系統的修改,多層疊加形成完整鏡像。這種設計讓鏡像復用、版本控制更高效(不同鏡像可共享相同層)。
-
可分發:鏡像可以被打包、存儲在倉庫(如 Docker Hub),并能被分發到任何支持 Docker 的環境。
常見操作:
-
拉取鏡像:
docker pull [鏡像名]:[版本]
(如docker pull ubuntu:20.04
) -
查看本地鏡像:
docker images
或docker image ls
-
構建鏡像:通過
Dockerfile
定義鏡像內容,執行docker build -t [鏡像名]:[版本] .
構建 -
刪除鏡像:
docker rmi [鏡像ID/名稱]
2. 容器(Container):鏡像的 “運行實例”
容器是鏡像的運行實例,是一個獨立的可執行單元。它在鏡像的基礎上添加了一個可寫層,所有運行時的修改(如文件創建、配置變更)都發生在這一層。
容器的特點:
-
可讀寫:容器在鏡像只讀層之上新增可寫層,允許運行時修改。
-
動態性:可以被創建、啟動、停止、暫停、刪除,狀態會隨操作變化。
-
隔離性:每個容器有獨立的進程空間、網絡、文件系統(基于鏡像層 + 可寫層),與其他容器和宿主隔離。
常見操作:
-
創建并啟動容器:
docker run [選項] [鏡像名]
(如docker run -it ubuntu:20.04 /bin/bash
啟動交互式容器) -
查看運行中容器:
docker ps
;查看所有容器(包括停止的):docker ps -a
-
啟動 / 停止容器:
docker start [容器ID/名稱]
/docker stop [容器ID/名稱]
-
進入容器:
docker exec -it [容器ID/名稱] /bin/bash
(在運行中的容器內執行命令) -
刪除容器:
docker rm [容器ID/名稱]
3. 鏡像與容器的關系
可以用 “類與對象” 的關系類比:
-
鏡像 = 類(Class):是靜態的模板,定義了 “是什么”。
-
容器 = 對象(Object):是動態的實例,是 “運行起來的鏡像”。
工作流程示例:
-
從倉庫拉取
nginx
鏡像(docker pull nginx
)—— 獲得一個 “nginx 模板”。 -
基于該鏡像創建容器(
docker run -d nginx
)—— 啟動一個運行中的 nginx 服務實例。 -
容器運行時,若修改了配置文件(如
/etc/nginx/nginx.conf
),修改會保存在容器的可寫層,不影響原始鏡像。 -
若想將修改固化為新鏡像,可通過
docker commit [容器ID] [新鏡像名]
生成新鏡像(但更推薦用Dockerfile
構建,便于維護)。
4. 核心區別總結
維度 | 鏡像(Image) | 容器(Container) |
---|---|---|
狀態 | 靜態(只讀) | 動態(可讀寫,有生命周期) |
作用 | 作為容器的模板 | 運行應用程序 |
存儲 | 多層只讀文件系統 | 鏡像層 + 一層可寫層 |
生命周期 | 長期存在(除非主動刪除) | 隨啟動 / 停止 / 刪除而變化 |
簡單來說:鏡像用來 “打包” 應用,容器用來 “運行” 應用。理解這一點,就能更好地掌握 Docker 的使用邏輯。