Docker 是一個功能強大的平台,可簡化輕量級、可移植容器中應用程式的建立、部署和管理。它允許開發人員將應用程式及其相依性打包到標準化單元中,以實現無縫開發和部署。 Docker 增強了不同環境之間的效率、可擴展性和協作,使其成為現代軟體開發和 DevOps 實踐的重要工具。

我們將深入研究 Docker 的各個方面,從安裝和配置到掌握映像、儲存、網路和安全性。

安裝與配置

下面給出了在 CentOS 和 Ubuntu 上安裝 Docker Community Edition (CE) 的基本指南。

在 CentOS 上安裝 Docker CE

  • 安裝所需的軟體包:

sudo yum install -y () device-mapper-persistent-data lvm2

  • 新增 Docker CE yum 儲存庫:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  • 安裝 Docker CE 軟體包:

sudo yum install -y docker-ce-18.09.5 docker-ce-cli-18.09.5 containerd.io

  • 啟動並啟用 Docker 服務:

`sudo systemctl 啟動 docker

sudo systemctl 啟用 docker`

將使用者加入Docker群組,授予使用者執行Docker命令的權限。下次登入後它將可以存取 Docker。

sudo usermod -a -G docker

在 Ubuntu 上安裝 Docker CE

  • 安裝所需的軟體包:

`sudo apt-get 更新

sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common`

  • 新增 Docker 儲存庫的 GNU Privacy Guard (GPG) 金鑰:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  • 新增 Docker Ubuntu 儲存庫:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable

  • 安裝包:

sudo apt-get install -y docker-ce=5:18.09.5~3-0~ubuntu-bionic docker-ce-cli=5:18.09.5~3-0~ubuntu-bionic containerd.io

將使用者加入Docker群組,授予使用者執行Docker命令的權限。下次登入後它將可以存取 Docker。

sudo usermod -a -G docker

選擇儲存驅動程式

儲存驅動程式是處理容器內部儲存的可插入驅動程式。 CentOS和Ubuntu系統的預設驅動程式是overlay2。

若要確定目前的儲存驅動程式:

docker info | grep "Storage"

選擇不同儲存驅動程式的一種方法是將--storage-driver標誌傳遞給 Docker 守護程式。設定儲存驅動程式的建議方法是使用守護程式設定檔。

  • 建立或編輯守護程序設定檔:

sudo vi /etc/docker/daemon.json

  • 新增儲存驅動程式值:

"storage-driver": "overlay2"

請記住在進行任何更改後重新啟動 Docker,然後檢查狀態。

`sudo systemctl 重新啟動 docker

sudo systemctl 狀態泊塢窗`

執行容器

docker run IMAGE[:TAG] [COMMAND] [ARGS]

IMAGE :指定執行容器的映像。

COMMAND and ARGS :在容器內執行指令。

TAG :指定影像標籤或版本

-d :以分離模式運作容器。

--name NAME :為容器指定一個指定的名稱,而不是通常隨機分配的名稱。

--restart RESTART :指定 Docker 何時自動重新啟動容器。

  • no (default) :從不重新啟動容器。

  • on-failure :僅當容器失敗時(以非零退出程式碼退出)。

  • always :無論成功或失敗,始終重新啟動容器。

  • unless-stopped :無論容器成功或失敗,始終重新啟動容器,並且在守護程序啟動時,除非手動停止容器。

-p HOST_PORT : CONTAINER_PORT:發布容器的連接埠。 HOST_PORT 是在主機上偵聽的端口,到該端口的流量將映射到容器上的 CONTAINER_PORT。

--memory MEMORY :對記憶體使用設定硬性限制。

--memory-reservation MEMORY :設定記憶體使用的軟限制。

docker run -d --name nginx --restart unless-stopped -p 8080:80 --memory 500M --memory-reservation 256M nginx:latest

用於管理正在執行的容器的一些命令是:

docker ps :列出正在執行的容器。

docker ps -a :列出所有容器,包括已停止的容器。

docker container stop [alias: docker stop] :停止正在運作的容器。

docker container start [alias: docker start] :啟動已停止的容器。

docker container rm [alias: docker rm] :刪除容器(必須先停止)

升級 Docker 引擎

停止 Docker 服務:

sudo systemctl stop docker

安裝所需版本的 docker-ce 和 docker-ce-cli:

sudo apt-get install -y docker-ce=<new version> docker-ce-cli=<new version>

驗證目前版本

docker version

鏡像建立、管理和註冊

鏡像是一個可執行包,包含執行容器所需的所有軟體。

使用映像執行容器:

docker run IMAGE

下載圖片:

`docker拉映像

docker鏡像拉取鏡像`

映像和容器使用分層檔案系統。每層僅包含與前一層的差異。

使用以下命令查看影像中的檔案系統層:

docker image history IMAGE

Dockerfile 是一個定義了一系列指令並用於建立映像的檔案。

# Use the official Nginx base image
FROM nginx:latest

# Set an environment variable
ENV MY_VAR=my_value

# Copy custom configuration file to container
COPY nginx.conf /etc/nginx/nginx.conf

# Run some commands during the build process
RUN apt-get update && apt-get install -y curl

# Expose port 80 for incoming traffic
EXPOSE 80

# Start Nginx server when the container starts
CMD ["nginx", "-g", "daemon off;"]

建構圖像:

docker build -t TAG_NAME DOCKERFILE_LOCATION

Dockerfile 指令:

FROM :指定用於正在建置的 Docker 映像的基礎映像。它定義了映像的起點,可以是 Docker Hub 或私有註冊表上可用的任何有效映像。

ENV :設定影像內的環境變數。在建置過程和容器執行時可以存取這些變數。

COPY or ADD :將檔案和目錄從建置上下文(Dockerfile 所在的目錄)複製到映像中。 COPY 通常更適合簡單的文件複製,而 ADD 支援附加功能,例如解壓縮存檔。

RUN :在建置過程中執行指令。您可以使用 RUN 安裝依賴項、執行腳本或執行任何其他必要的任務。

EXPOSE :通知 Docker 容器將在執行時間監聽指定的網路連接埠。它不會將連接埠發佈到主機或使容器可以從外部存取。

CMD or ENTRYPOINT :指定從映像啟動容器時要執行的指令。 CMD 提供可以覆寫的預設參數,而 ENTRYPOINT 指定不能覆寫的指令。

WORKDIR :設定任何後續 RUN、CMD、ENTRYPOINT、COPY 或 ADD 指令的工作目錄。

STOPSIGNAL :設定將用於停止容器程序的自訂訊號。

HEALTHCHECK :設定 Docker 守護程式將使用的指令來檢查容器是否健康

Dockerfile 中的多階段建置是一種用於建立更有效率、更小的 Docker 映像的技術。它涉及在 Dockerfile 中定義多個階段,每個階段都有自己的一組指令和依賴項。

包含多階段建置定義的範例 Dockerfile 是:

# Build stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /app

# Copy and restore project dependencies
COPY *.csproj .
RUN dotnet restore

# Copy the entire project and build
COPY . .
RUN dotnet build -c Release --no-restore

# Publish the application
RUN dotnet publish -c Release -o /app/publish --no-restore

# Runtime stage
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .

# Expose the required port
EXPOSE 80

# Set the entry point for the application
ENTRYPOINT ["dotnet", "YourApplication.dll"]

管理影像

影像管理的一些關鍵命令是:

列出系統上的影像:

docker image ls

列出系統上的映像,包括中間映像:

docker image ls -a

取得有關圖像的詳細資訊:

docker image inspect <IMAGE>

刪除影像:

`docker rmi

docker 映像 rm

docker 映像 rm -f `

只有當沒有容器或其他圖像標籤引用圖像時,圖像才會被刪除。尋找並刪除懸空或未使用的圖像:

docker image prune

Docker 註冊表

Docker 註冊表可作為儲存和共用 Docker 映像的集中儲存庫。 Docker Hub 是由 Docker 管理的預設、公開可用的註冊表。透過利用註冊表鏡像,我們可以免費設定和管理我們自己的私有註冊表。

執行一個簡單的註冊表:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

將圖像上傳到註冊表:

docker push <IMAGE>:<TAG>

從註冊表下載映像:

docker pull <IMAGE>:<TAG>

登入註冊表:

docker login REGISTRY_URL

有兩種身份驗證方法可用於使用不受信任或自簽名憑證連接到私有註冊表:

安全性:這涉及將註冊表的公共憑證新增至 /etc/docker/certs.d/ 目錄。

Insecure :此方法需要將登錄檔新增至 daemon.json 檔案中的 insecure-registries 清單中,或使用 --insecure-registry 標誌將其傳遞給 dockerd。

儲存和磁碟區

儲存驅動程式控制如何在 Docker 主機上儲存和管理映像和容器。 Docker 使用可插拔架構支援多種儲存驅動程式。

overlay2 :所有 Linux 發行版的首選

fusion-overlayfs :僅適用於執行 Rootless Docker(不是 Ubuntu 或 Debian 10)

vfs :用於測試目的,以及無法使用寫入時複製檔案系統的情況。

儲存型號

**檔案系統儲存:**

  • 資料以常規檔案的形式儲存在主機磁碟上

  • 有效利用記憶體

  • 寫入繁重的工作負載效率低下

  • overlay2使用

區塊儲存:

  • 使用特殊的區塊儲存設備將資料儲存在區塊中

  • 高效率處理寫入繁重的工作負載

  • 由 btrfs 和 zfs 使用

物件儲存:

  • 將資料儲存在外部基於物件的儲存中

  • 應用程式必須設計為使用基於物件的儲存。

  • 靈活且可擴展。

配置overlay2儲存驅動

停止 Docker 服務:

sudo systemctl stop docker

建立或編輯守護程序設定檔:

sudo vi /etc/docker/daemon.json

新增/編輯儲存驅動程式值:

"storage-driver": "overlay2"

請記住在進行任何更改後重新啟動 Docker,然後檢查狀態。

`sudo systemctl 重新啟動 docker

sudo systemctl 狀態泊塢窗`

Docker 卷

Docker 上有兩種不同類型的資料掛載:

Bind Mount :將主機上的特定目錄掛載到容器。它對於在容器和主機之間共用設定檔和其他資料非常有用。

命名磁碟區:將目錄掛載到容器,但 Docker 動態控製磁碟區在磁碟上的位置。

在容器中新增綁定掛載或磁碟區有不同的語法:

_-v 語法 _

綁定安裝:來源以正斜線“/”開頭,這使其成為綁定安裝。

docker run -v /opt/data:/tmp nginx

命名卷:來源只是一個字串,這表示這是一個磁碟區。如果不存在具有所提供名稱的捲,它將自動建立。

docker run -v my-vol:/tmp nginx

--掛載語法

綁定掛載:

docker run --mount source=/opt/data,destination=/tmp nginx

命名卷:

docker run --mount source=my-vol,destination=/tmp nginx

我們可以將相同的磁碟區掛載到多個容器,從而允許它們共享資料。我們也可以自己建立和管理卷,而無需執行容器。

一些常見且有用的指令:

docker volume create VOLUME :建立一個磁碟區。

docker volume ls :列出卷。

docker volume inspect VOLUME :檢查卷。

docker volume rm VOLUME :刪除磁碟區。

影像清理

檢查Docker的磁碟使用情況:

docker system df

docker system df -v

刪除未使用或懸空的影像:

`docker 映像修剪

docker映像修剪-a`

Docker 網路

Docker 容器網路模型 (CNM) 是一個概念模型,描述 Docker 網路的元件和概念。

Docker CNM 有多種實作:

沙箱:一個隔離單元,包含與單一容器關聯的所有網路元件。

端點:將一個沙箱連接到一個網路。

網路:可以相互通訊的端點的集合。網路驅動程式:可插拔驅動程序,提供 CNM 的特定實作。

IPAM 驅動程式:提供 IP 位址管理。分配和指派 IP 位址。

內建網路驅動程式

Host :此驅動程式將容器直接連接到主機的網路堆疊。它不提供容器之間或容器與主機之間的隔離。

docker run --net host nginx

Bridge :此驅動程式使用虛擬橋接器介面在同一主機上執行的容器之間建立連線。

`docker 網路建立 --driver 橋 my-bridge-net

docker run -d --network my-bridge-net nginx`

Overlay :此驅動程式使用路由網格來連接多個 Docker 主機(通常在 Docker 群組中)的容器。

`docker 網路建立 --driver 覆蓋 my-overlay-net

docker 服務建立 --network my-overlay-net nginx`

MACVLAN :此驅動程式將容器直接連接到主機的網路接口,但使用特殊配置來提供隔離。

`docker網路建立-d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -oparent=eth0 my-macvlan-net

docker run -d --net my-macvlan-net nginx`

None :此驅動程式提供沙箱隔離,但它不提供容器之間或容器與主機之間的網路的任何實作。

docker run --net none -d nginx

建立 Docker 橋接網絡

它是預設驅動程式。因此,任何在未指定驅動程式的情況下建立的網路都將是橋接網路。

建立橋接網路。

docker network create my-net

在橋接網路上執行容器。

docker run -d --network my-net nginx

預設情況下,同一網路上的容器和服務只需使用容器或服務名稱即可相互通訊。 Docker 在網路上提供 DNS 解析,使其能夠正常運作。

提供網路別名以提供存取容器或服務的附加名稱。

docker run -d --network my-net --network-alias my-nginx-alias nginx

當必須與 Docker 網路互動時,一些有用的命令是:

docker network ls :列出網路。

docker network inspect NETWORK :檢查網路。

docker network connect CONTAINER NETWORK :將容器連接到網路。

docker network disconnect CONTAINER NETWORK :斷開容器與網路的連接。

docker network rm NETWORK :刪除網路。

建立 Docker 覆蓋網絡

建立覆蓋網路:

docker network create --driver overlay NETWORK_NAME

建立使用網路的服務:

docker service create --network NETWORK_NAME IMAGE

網路故障排除

查看容器日誌:

docker logs CONTAINER

查看服務的所有任務的日誌:

docker service logs SERVICE

查看Docker守護程序日誌:

sudo jounralctl -u docker

我們可以使用nicolaka/netshoot鏡像來執行網路故障排除。它附帶了各種有用的網路相關工具。我們可以將一個容器注入另一個容器的網路沙箱中以進行故障排除。

docker run --network container:CONTAINER_NAME nicolaka/netshoot

配置 Docker 使用外部 DNS

在 daemon.json 中為 Docker 容器設定係統範圍的預設 DNS:

`{

“DNS”:[“8.8.8.8”]

}`

為單一容器設定 DNS。

docker run --dns 8.8.4.4 IMAGE

安全

簽署映像並啟用 Docker 內容信任

Docker Content Trust (DCT) 是一項功能,可讓我們在執行映像之前對映像進行簽名並驗證簽名。透過設定環境變數啟用 Docker Content Trust:

DOCKER_CONTENT_TRUST=1

如果映像未簽署或在啟用 Docker Content Trust 的情況下簽章無效,系統將不會運作映像。

使用以下命令簽署並推送映像:

docker trust sign

當 DOCKER_CONTENT_TRUST=1 時,docker push 在推送之前會自動對映像進行簽署。

預設 Docker 引擎安全性

基本的 Docker 安全性概念:

Docker 使用命名空間將容器程序彼此隔離以及與主機隔離。這可以防止攻擊者在設法獲得對一個容器的控制時影響或獲得對其他容器或主機的控制。

Docker 守護程式必須以 root 存取權限執行。在允許任何人與守護進程互動之前,請注意這一點。它可用於存取整個主機。

Docker 利用 Linux 功能為容器程序分配精細權限。例如,偵聽低埠(低於 1024)通常需要進程以 root 身分執行,但 Docker 使用 Linux 功能允許容器偵聽連接埠 80,而無需以 root 身分執行。

保護 Docker 守護程式 HTTP 套接字的安全

為 Docker 伺服器產生憑證授權單位和伺服器憑證。

openssl genrsa -aes256 -out ca-key.pem 4096` 

`openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=US/ST=Texas/L=Keller/O=Linux Academy/OU=Content/CN=$HOSTNAME" openssl genrsa -out server-key.pem 4096 `

`openssl req -subj "/CN=$HOSTNAME" -sha256 -new -key server-key.pem -out server.csr \ echo subjectAltName = DNS:$HOSTNAME,IP:,IP:127.0.0.1 >> extfile.cnf `

`echo extendedKeyUsage = serverAuth >> extfile.cnf `

`openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf`
Generate client certificates:
`openssl genrsa -out key.pem 4096 

openssl req -subj '/CN=client' -new -key key.pem -out client.csr 

echo extendedKeyUsage = clientAuth > extfile-client.cnf 

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf

對憑證文件設定適當的權限:

chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem

將 Docker 主機配置為使用 tlsverify 模式以及先前建立的憑證:

sudo vi /etc/docker/daemon.json

{
 "tlsverify": true,
 "tlscacert": "/home/user/ca.pem",
 "tlscert": "/home/user/server-cert.pem",
 "tlskey": "/home/user/server-key.pem"
 }

編輯 Docker 服務文件,尋找以 ExecStart 開頭的行並更改 -H。

sudo vi /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H=0.0.0.0:2376 --containerd=/run/containerd/containerd.sock

sudo systemctl daemon-reload

sudo systemctl restart docker

將 CA 憑證和用戶端憑證檔案複製到客戶端電腦。

在用戶端電腦上,設定用戶端以安全地連線到遠端 Docker 守護程式:

mkdir -pv ~/.docker

cp -v {ca,cert,key}.pem ~/.docker

export DOCKER_HOST=tcp://:2376 DOCKER_TLS_VERIFY=1

測試連接:

docker version

結論

總而言之,掌握 Docker 可以簡化安裝、設定、映像管理、儲存、網路和安全性,從而改變您的開發工作流程。本指南為您提供必要的知識和實務技能,使您能夠有效率地建立、發布和執行應用程式。利用 Docker 的強大功能將您的容器管理提升到一個新的水平。


原文出處:https://dev.to/theyasirr/docker-mastery-a-comprehensive-guide-for-beginners-and-pros-2p18


共有 0 則留言