Docker容器技術已成為現代軟體開發和佈署不可或缺的工具,相較於虛擬機器,它提供更輕量且更有效率的解決方案。容器直接執行於主機作業系統核心之上,利用 Linux 核心技術實作資源隔離和限制,帶來更小的磁碟與記憶體佔用、更快的啟動速度以及跨平台佈署的一致性。理解容器的生命週期和持久化儲存機制對於有效運用 Docker 至關重要,搭配 Docker Hub 和 Docker CLI,開發者能更有效率地管理和操作容器映像檔及容器例項。更進一步,建立本地私有倉函式庫並設定安全驗證和 SSL 加密,能有效提升企業內部映像檔管理的安全性及效率。

使用Docker容器技術的核心概念與實踐

Docker容器技術已經成為現代軟體開發和佈署流程中的重要工具。相較於傳統的虛擬機器,容器提供了更輕量級和高效的解決方案。本篇文章將探討Docker的核心概念、容器與虛擬機器的區別、以及如何使用Docker Hub和Docker命令列介面(CLI)來管理和操作容器。

容器與虛擬機器的根本區別

在虛擬化技術領域,容器和虛擬機器(VM)是兩種不同的技術方案。虛擬機器透過Hypervisor模擬硬體資源,為每個虛擬機器提供獨立的作業系統環境。相比之下,容器技術則是直接執行在主機作業系統上,利用Linux核心的Namespace和Cgroups等技術實作資源隔離和限制。

容器技術的獨特優勢

  1. 更輕量級的資源佔用:容器不需要額外的作業系統例項,直接共用主機的作業系統核心,因此具有更小的磁碟和記憶體佔用。
  2. 更快的啟動速度:由於不需要啟動完整的作業系統,容器的啟動速度遠遠快於虛擬機器。
  3. 一致性和可移植性:容器封裝了應用程式及其所有依賴項,確保了在不同環境中的一致性。

容器與虛擬機器的類別比

可以將容器的映像檔(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命令範例

  1. 搜尋映像檔
docker search alpine

內容解密:

  • docker search alpine:這個命令用於在Docker Hub上搜尋包含"alpine"關鍵字的映像檔。
  1. 下載映像檔
docker pull alpine

內容解密:

  • docker pull alpine:下載最新的Alpine Linux映像檔。
  1. 執行容器
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客戶端的設定步驟:

  1. 開啟「鑰匙串存取」(Keychain Access)。
  2. 匯入憑證檔案(example.crt)。
  3. 設定憑證為「始終信任」。

組態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埠。