Docker容器技術已成為現代軟體開發和佈署不可或缺的工具,相較於虛擬機器,它提供更輕量且更有效率的解決方案。容器直接執行於主機作業系統核心之上,利用 Linux 核心技術實作資源隔離和限制,帶來更小的磁碟與記憶體佔用、更快的啟動速度以及跨平台佈署的一致性。理解容器的生命週期和持久化儲存機制對於有效運用 Docker 至關重要,搭配 Docker Hub 和 Docker CLI,開發者能更有效率地管理和操作容器映像檔及容器例項。更進一步,建立本地私有倉函式庫並設定安全驗證和 SSL 加密,能有效提升企業內部映像檔管理的安全性及效率。
使用Docker容器技術的核心概念與實踐
Docker容器技術已經成為現代軟體開發和佈署流程中的重要工具。相較於傳統的虛擬機器,容器提供了更輕量級和高效的解決方案。本篇文章將探討Docker的核心概念、容器與虛擬機器的區別、以及如何使用Docker Hub和Docker命令列介面(CLI)來管理和操作容器。
容器與虛擬機器的根本區別
在虛擬化技術領域,容器和虛擬機器(VM)是兩種不同的技術方案。虛擬機器透過Hypervisor模擬硬體資源,為每個虛擬機器提供獨立的作業系統環境。相比之下,容器技術則是直接執行在主機作業系統上,利用Linux核心的Namespace和Cgroups等技術實作資源隔離和限制。
容器技術的獨特優勢
- 更輕量級的資源佔用:容器不需要額外的作業系統例項,直接共用主機的作業系統核心,因此具有更小的磁碟和記憶體佔用。
- 更快的啟動速度:由於不需要啟動完整的作業系統,容器的啟動速度遠遠快於虛擬機器。
- 一致性和可移植性:容器封裝了應用程式及其所有依賴項,確保了在不同環境中的一致性。
容器與虛擬機器的類別比
可以將容器的映像檔(Image)類別比為虛擬機器的快照(Snapshot)。就像從一個快照可以建立多個虛擬機器一樣,從一個Docker映像檔也可以建立多個容器例項。
容器的生命週期與持久化儲存
與虛擬機器不同,容器的生命週期通常較短暫。當容器完成其任務後,它會停止執行並離開。例如,在執行測試任務時,容器會在測試完成後自動停止。這種設計使得容器非常適合用於臨時任務和自動化流程。
持久化儲存:Docker Volume
如果需要在容器多次執行之間保持資料持久化,可以使用Docker Volume。Volume是一種特殊的儲存機制,可以將資料儲存在主機檔案系統中,並在容器重新啟動時掛載和使用這些資料。
# 建立一個名為my_volume的Docker Volume
docker volume create my_volume
# 執行容器並掛載my_volume到容器的/data目錄
docker run -v my_volume:/data my_image
內容解密:
docker volume create my_volume:這個命令用於建立一個名為my_volume的Docker Volume,用於持久化儲存資料。docker run -v my_volume:/data my_image:執行my_image映像檔並掛載my_volume到容器的/data目錄,確保資料在容器重新啟動後仍然保留。
取得Docker映像檔
在使用Docker容器之前,需要先取得所需的映像檔。Docker映像檔可以從Docker Hub或其他映像檔倉函式庫下載。
Docker Hub:官方映像檔倉函式庫
Docker Hub是Docker官方提供的映像檔倉函式庫,包含了大量由Docker官方和社群貢獻的映像檔。使用者可以透過搜尋功能找到所需的映像檔,並使用docker pull命令下載。
例如,要下載Alpine Linux映像檔,可以執行:
docker pull alpine
內容解密:
docker pull alpine:這個命令用於從Docker Hub下載最新的Alpine Linux映像檔。
使用Docker命令列介面(CLI)
相較於Docker Desktop圖形介面,Docker CLI提供了更靈活和高效的操作方式。大部分Docker相關操作都透過docker命令及其子命令來完成。
基本Docker命令範例
- 搜尋映像檔:
docker search alpine
內容解密:
docker search alpine:這個命令用於在Docker Hub上搜尋包含"alpine"關鍵字的映像檔。
- 下載映像檔:
docker pull alpine
內容解密:
docker pull alpine:下載最新的Alpine Linux映像檔。
- 執行容器:
docker run -it alpine /bin/sh
內容解密:
docker run -it alpine /bin/sh:這個命令用於啟動一個Alpine Linux容器,並進入互動式Shell環境。
Docker容器狀態與管理
Docker容器在完成任務後會自動停止,這與虛擬機器持續執行的特性不同。使用者可以透過Docker CLI檢視容器的狀態,並進行相應的管理操作。
檢視容器狀態
docker ps -a
內容解密:
docker ps -a:這個命令用於列出所有容器(包括已停止的容器)及其狀態。
隨著容器技術的不斷發展,未來可能會出現更多根據容器的創新應用和最佳實踐。開發者應持續關注最新的技術趨勢和社群動態,以充分利用Docker及其生態系統帶來的優勢。
Docker容器生命週期
圖表翻譯:
此圖表展示了Docker容器的典型生命週期。首先,容器被建立並開始執行任務。當任務完成後,容器會自動停止,最後可能被刪除。這個過程反映了容器短暫性和高效性的特點。
使用Docker進行容器管理與本地登入檔設定
Docker是一種流行的容器化平台,允許開發者封裝、分發和執行應用程式。本文將詳細介紹如何使用Docker進行容器管理,以及如何設定本地登入檔。
搜尋與下載Docker映像檔
在使用Docker之前,首先需要搜尋並下載所需的映像檔。Docker Hub是Docker映像檔的官方倉函式庫,提供了豐富的映像檔資源。
搜尋映像檔
可以使用docker search命令搜尋映像檔。例如,搜尋alpine映像檔:
docker search alpine
搜尋結果將顯示映像檔的名稱、描述、星級評分(表示映像檔的受歡迎程度)、是否為官方映像檔等資訊。
篩選搜尋結果
可以使用--filter選項篩選搜尋結果。例如,只顯示官方映像檔:
docker search alpine --filter is-official=true
下載映像檔
可以使用docker pull命令下載映像檔。例如,下載alpine映像檔:
docker pull alpine
執行容器
下載映像檔後,可以使用docker run命令執行容器。例如:
docker run alpine
如果本地沒有該映像檔,Docker會自動下載並執行。
自定義容器名稱與執行選項
可以使用--name選項自定義容器名稱,使用-d選項在後台執行容器,使用-i和-t選項分配偽終端。例如:
docker run --name ch5contain -dit alpine
這個命令建立了一個名為ch5contain的容器,在後台執行,並分配了偽終端。
管理容器
可以使用docker ps命令檢視正在執行的容器。例如:
docker ps
輸出結果將顯示容器的ID、映像檔名稱、命令、建立時間、狀態、埠對映和名稱等資訊。
連線容器
可以使用docker attach命令連線到正在執行的容器。例如:
docker attach 28ae7048c1d3
或者使用docker exec命令在容器中執行新命令:
docker exec -it <container_id> /bin/bash
停止與重新啟動容器
輸入exit將停止容器程式。若要離開容器而不停止容器,可以使用Ctrl-P + Q快捷鍵。
可以使用docker start命令重新啟動容器。例如:
docker start ch5contain
或者使用容器ID:
docker start 28ae7048c1d3
設定本地登入檔
在某些情況下,需要在本地設定Docker登入檔,以便在組織內部分享自定義映像檔,或在離線狀態下使用映像檔。
建立本地登入檔
可以使用Docker官方的registry映像檔建立本地登入檔。首先,下載registry映像檔:
docker pull registry
然後,執行登入檔容器:
docker run -d -p 5000:5000 --name registry registry
這將建立一個名為registry的容器,將主機的5000埠對映到容器的5000埠。
組態SSL加密
為了確保登入檔的安全,可以組態SSL加密。首先,需要生成SSL證書和私鑰。可以使用OpenSSL工具生成自簽名證書:
mkdir -p docker/ssl
openssl req -x509 -nodes -days 365 \
-subj "/C=US/ST=WI/O=Book/CN=dockreg.braingia.org" \
-addext "subjectAltName=DNS:dockreg.braingia.org" -newkey rsa:4096 -nodes \
-keyout docker/ssl/example.key -out docker/ssl/example.crt
請根據實際需求修改主機名和網域名稱。
圖表翻譯:
此圖示顯示了 Docker 本地登入檔的設定流程,包括生成 SSL 證書、建立登入檔容器和組態埠對映等步驟。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Docker容器技術核心概念與實踐
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml圖表翻譯: 上圖呈現了設定 Docker 本地登入檔的步驟順序。首先生成 SSL 證書以確保安全連線,接著建立登入檔容器並組態所需的埠對映,最後完成本地登入檔的設定。
內容解密:
本段落主要介紹了Docker容器管理與本地登入檔設定的相關知識和技能。首先講解了如何使用Docker搜尋和下載映像檔,並執行容器。接著,詳細說明瞭如何管理容器,包括檢視容器狀態、連線容器、停止和重新啟動容器等操作。然後,介紹瞭如何設定本地登入檔,包括建立登入檔容器、組態SSL加密等步驟。最後,透過Plantuml圖表呈現了本地登入檔的設定流程,並對圖表進行了解釋。總體而言,本文提供了全面而深入的Docker使用。
為Docker私有倉函式庫新增安全驗證與SSL加密
在佈署私有Docker倉函式庫時,為了確保安全性和資料完整性,必須加入適當的安全措施,例如驗證機制和SSL加密。本文將詳細闡述如何在本地搭建一個具有身份驗證和SSL加密的Docker私有倉函式庫。
生成SSL憑證和私鑰
首先,我們需要為Docker私有倉函式庫生成SSL憑證和私鑰。這可以透過OpenSSL工具完成。以下是生成憑證和私鑰的命令範例:
openssl req -x509 -newkey rsa:4096 -nodes -keyout example.key -out example.crt -days 365 -subj "/C=TW/ST=Taiwan/L=Taipei/O=Example/CN=example.com"
內容解密:
openssl req:用於生成憑證請求的命令。-x509:表示生成自簽名憑證。-newkey rsa:4096:生成新的RSA金鑰,長度為4096位元。-nodes:不加密私鑰。-keyout example.key:指定輸出的私鑰檔案名稱。-out example.crt:指定輸出的憑證檔案名稱。-days 365:憑證的有效期為365天。-subj "/C=TW/ST=Taiwan/L=Taipei/O=Example/CN=example.com":設定憑證的主體資訊。
建立身份驗證檔案
接下來,我們需要建立一個包含使用者憑證的htpasswd檔案。可以使用docker run命令搭配htpasswd工具來生成這個檔案:
mkdir -p docker/auth && cd docker/auth
docker run --rm --entrypoint htpasswd registry:2.7.0 -Bbn reginald regpass >> htpasswd
內容解密:
mkdir -p docker/auth:建立存放htpasswd檔案的目錄。docker run --rm --entrypoint htpasswd registry:2.7.0:執行htpasswd命令來生成使用者憑證。-Bbn reginald regpass:設定使用者名稱為reginald,密碼為regpass。>> htpasswd:將生成的憑證追加到htpasswd檔案中。
將憑證和驗證檔案掛載到容器中
為了讓Docker私有倉函式庫容器能夠使用這些檔案,我們需要使用bind mount將主機上的目錄掛載到容器內部:
-v `pwd`/docker/auth:/auth -v `pwd`/docker/ssl:/ssl
內容解密:
-v:指定掛載選項。`pwd`:表示當前目錄。/docker/auth:/auth:將主機上的docker/auth目錄掛載到容器的/auth目錄。/docker/ssl:/ssl:將主機上的docker/ssl目錄掛載到容器的/ssl目錄。
在客戶端信任SSL憑證
為了讓客戶端能夠安全地與Docker私有倉函式庫互動,我們需要在客戶端上信任我們生成的SSL憑證。以下是Mac客戶端的設定步驟:
- 開啟「鑰匙串存取」(Keychain Access)。
- 匯入憑證檔案(
example.crt)。 - 設定憑證為「始終信任」。
組態Docker私有倉函式庫容器
最後,我們需要組態Docker私有倉函式庫容器以使用SSL憑證和身份驗證。以下是完整的docker run命令:
sudo docker run -d --restart=always --name registry \
-v `pwd`/docker/auth:/auth -v `pwd`/docker/ssl:/ssl \
-e REGISTRY_AUTH=htpasswd -e REGISTRY_AUTH_HTPASSWD_REALM="Example Registry" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/ssl/example.crt \
-e REGISTRY_HTTP_TLS_KEY=/ssl/example.key -p 443:443 registry:2.7.0
內容解密:
-d:以分離模式執行容器。--restart=always:設定容器自動重新啟動。--name registry:指定容器名稱為registry。-e:設定環境變數。REGISTRY_AUTH=htpasswd:指定驗證方式為htpasswd。REGISTRY_AUTH_HTPASSWD_REALM="Example Registry":設定驗證域。REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd:指定htpasswd檔案路徑。REGISTRY_HTTP_ADDR=0.0.0.0:443:設定HTTP服務的監聽地址和埠。REGISTRY_HTTP_TLS_CERTIFICATE=/ssl/example.crt:指定SSL憑證路徑。REGISTRY_HTTP_TLS_KEY=/ssl/example.key:指定SSL私鑰路徑。
-p 443:443:將主機的443埠對映到容器的443埠。