Docker 是一個功能強大的平台,可簡化輕量級、可移植容器中應用程式的建立、部署和管理。它允許開發人員將應用程式及其相依性打包到標準化單元中,以實現無縫開發和部署。 Docker 增強了不同環境之間的效率、可擴展性和協作,使其成為現代軟體開發和 DevOps 實踐的重要工具。
我們將深入研究 Docker 的各個方面,從安裝和配置到掌握映像、儲存、網路和安全性。
下面給出了在 CentOS 和 Ubuntu 上安裝 Docker Community Edition (CE) 的基本指南。
在 CentOS 上安裝 Docker CE
sudo yum install -y () device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-18.09.5 docker-ce-cli-18.09.5 containerd.io
`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`
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
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 容器網路模型 (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