Docker 私有註冊表指南
一、概述
Docker 是一個軟件平台,在操作系統級別的虛擬化下工作,以在容器中運行應用程序。 Docker 的獨特功能之一是 Docker 容器提供了相同的虛擬環境來運行應用程序。 CI/CD 工具還可用於自動從註冊表中推送或拉取鏡像,以便在生產環境中進行部署。
在本教程中,我們將學習了解公共和私有 Docker 註冊表的使用。我們還將設置一個私有 Docker 註冊表。此外,我們會將 Docker 映像推送到私有 Docker 註冊表,然後從同一註冊表中拉取映像。
2. 私有和公共 Docker 註冊表
Docker 支持在私有服務器上創建、存儲和管理 Docker 映像。此外,Docker 還有一個免費的公共註冊表。 Docker Hub 可以託管我們的鏡像,但它們將是公開的。在大多數情況下,圖像包含運行應用程序所需的所有代碼和配置。在這種情況下,我們可以使用 Docker Hub 私人帳戶或在機器上設置私人 Docker 註冊表。
Docker Hub 私人帳戶是付費的,它是在雲中存儲多個圖像的昂貴選擇。雖然私有 Docker 註冊表設置是免費的,但從私有註冊表訪問映像的所有命令都很簡單,幾乎與 Docker Hub 中的命令相同。使用私有註冊表,我們可以平衡負載、自定義身份驗證和日誌記錄,以及進行更多配置更改。它創建了一個定制的管道,幫助將圖像存儲在個人位置。在這裡,我們將簡要介紹如何在服務器上私下管理圖像。
典型的 Docker 映像包含應用程序代碼、安裝、配置和所需的依賴項。一個 Docker 鏡像通常由多個層組成。我們還可以將這些層推送到私有或公共註冊表。此外,我們將檢查一些允許我們自定義配置的安全和存儲選項。使用這些,我們可以安全地管理圖像并快速安全地拉取和推送它們。
3.設置私人註冊表
我們可以通過將容器鏡像集中在私有或公共註冊表中來減少構建時間。我們還可以從包含應用程序所有組件的註冊表中下載壓縮映像,以捆綁的形式,而不是在不同的環境中安裝不同的依賴項。要設置私有 Docker 註冊表,我們首先需要更改 Docker 守護程序的默認配置。
3.1。配置私有 Docker 註冊表
在 Docker 中,我們可以通過運行registry
鏡像的容器來設置註冊表。在我們繼續之前,讓我們首先更新 Docker 安裝的默認配置。
在/etc/docker/daemon.json
中添加以下配置:
{
"insecure-registries":[
"localhost:5000"
]
}
在上面的 JSON 中,我們在“ insecure-registries
”屬性中添加了帶有端口5000
的localhost
。要應用上述更改,讓我們使用命令行重新加載 Docker 守護進程:
$ sudo systemctl daemon-reload
現在,我們將重新啟動 Docker 服務:
$ sudo systemctl restart docker
至此,我們已經成功配置了私有註冊表。
3.2.運行私有 Docker 註冊表
要運行私有註冊表,我們必須拉取存儲在公共 Docker Hub 上的registry
映像:
$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
2408cc74d12b: Pull complete
...
fc30d7061437: Pull complete
Digest: sha256:bedef0f1d248508fe0a16d2cacea1d2e68e899b2220e2258f1b604e1f327d475
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
我們還可以拉取特定版本的註冊表。現在讓我們使用docker images
命令驗證註冊表映像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 773dbf02e42e 21 hours ago 24.1MB
現在,讓我們使用registry
鏡像運行一個 Docker 容器:
$ docker run -itd -p 5000:5000 --name baeldung-registry registry
e2d09cd3a5ef9c88e17e0393f7125b6eeffad175fa0ce69fa3daa7803a0b3067
baeldung-registry
容器的內部服務器使用端口5000
。因此,我們暴露了主機上的5000
端口:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2d09cd3a5ef registry "/entrypoint.sh /etc…" 3 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp baeldung-registry
上述命令確認註冊表已啟動並正在運行。
4. 將鏡像推送到私有註冊表
要將鏡像推送到私有鏡像倉庫,我們首先從公共 Docker 鏡像倉庫拉取最新的centos鏡像:
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
在這裡,我們提取了一個示例 Docker 映像,我們可以將其推送到 Docker 私有註冊表。首先,我們將標記centos
映像,然後將其推送到私有 docker 註冊表。在這裡,我們將其標記為localhost:5000/baeldung-centos
:
$ docker tag centos:latest localhost:5000/baeldung-centos
現在,讓我們檢查一下主機上的所有圖像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 773dbf02e42e 22 hours ago 24.1MB
localhost:5000/baeldung-centos latest 5d0da3dc9764 8 months ago 231MB
centos latest 5d0da3dc9764 8 months ago 231MB
在這裡,我們可以看到 imageId 5d0da3dc9764
有兩個不同的存儲庫。 Docker 中的標籤類似於符號鏈接。要刪除圖像,我們必須刪除 imageId 或顯式刪除兩個標籤。
讓我們查看將圖像推送到 docker 私有註冊表的命令:
$ docker push localhost:5000/baeldung-centos
The push refers to repository [localhost:5000/baeldung-centos]
74ddd0ec08fa: Pushed
latest: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529
通過上面的命令,我們已經成功的將baeldung-centos
鏡像推送到了私有註冊中心,該註冊中心本地設置在5000
端口。同樣,我們也可以在私有註冊表中存儲多個圖像。
5. 從私有註冊表中提取圖像
從私有倉庫拉取鏡像的命令類似於從 Docker Hub 拉取鏡像。在這裡,首先,我們將刪除所有 imageId 為5d0da3dc9764
的圖像:
$ docker rmi 5d0da3dc9764
讓我們檢查一下存儲在主機上的所有圖像:
$ docker-registry]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 773dbf02e42e 22 hours ago 24.1MB
我們可以看到 imageId 為5d0da3dc9764
的圖像已被刪除。讓我們看看從私有 Docker 註冊表中拉取鏡像的命令:
$ docker pull localhost5000/baeldung-centos
Using default tag: latest
latest: Pulling from baeldung-centos
a1d0c7532777: Pull complete
Digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
Status: Downloaded newer image for localhost:5000/baeldung-centos:latest
localhost:5000/baeldung-centos:latest
上述命令將從私有註冊表中拉取baeldung-centos
映像。
6. 為私有註冊表設置身份驗證
Docker 允許我們將圖像本地存儲在中央服務器上,但有時,有必要保護圖像免受外部濫用。在這種情況下,我們需要使用基本的htpasswd
身份驗證來對註冊表進行身份驗證。
讓我們首先創建一個單獨的目錄來存儲 Docker 註冊表憑據:
$ mkdir -p Docker_registry/auth
接下來,讓我們運行一個httpd
容器來創建一個帶密碼的htpasswd
保護用戶:
$ cd Docker_registry &&
上面的命令將創建一個具有htpasswd
身份驗證密碼的用戶。憑據的詳細信息存儲在auth/htpasswd
文件中。
現在,讓我們使用auth/htpasswd
身份驗證文件運行相同的 Docker 註冊表容器:
$ docker run -itd \
-p 5000:5000 \
--name registry \
-v "$(pwd)"/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
3a497bafed4adb21a5a3f0b52307b4beaa261c6abe265e543cd8f5a15358e29d
由於 Docker 註冊表使用基本身份驗證運行,我們現在可以使用以下命令測試登錄:
$ docker login localhost:5000 -u baeldung-user -p baeldung
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
一旦成功登錄到 Docker 註冊表,我們就可以像上面討論的那樣推送和拉取鏡像。
7. 結論
本教程演示瞭如何創建我們自己的私有 Docker 註冊表並推送 Docker 映像。
首先,我們建立了一個私有註冊表。後來,我們將圖像推送到註冊表和從註冊表中提取。最後,我們在私有 Docker 註冊表中啟用了身份驗證。