­

Docker 私有鏡像倉庫的搭建及認證

DockerHub 為我們提供了很多官方鏡像和個人上傳的鏡像,我們可以下載機構或個人提供的鏡像,也可以上傳我們自己的本地鏡像,但缺點是:

  • 由於網路的原因,從 DockerHub 下載和上傳鏡像速度可能會比較慢;
  • 在生產上使用的 Docker 鏡像可能包含我們的程式碼、配置資訊等,不想被外部人員獲取,只允許內網的開發人員下載。

  

  為了解決以上問題,Docker 官方提供了一個叫做 registry 的鏡像用於搭建本地私有倉庫使用。在內部網路搭建的 Docker 私有倉庫可以使內網人員下載、上傳都非常快速,不受外網頻寬等因素的影響,同時不在內網的人員也無法下載我們的鏡像,並且私有倉庫也支援配置倉庫認證功能。接下來詳細講解 registry 私有倉庫的搭建過程。

  

拉取私有倉庫鏡像

  

  拉取私有倉庫鏡像。

docker pull registry

  

修改配置

  

  修改 daemon.json 文件。

vi /etc/docker/daemon.json

  添加以下內容,用於讓 Docker 信任私有倉庫地址,保存退出。

{
    "insecure-registries": ["192.168.10.10:5000"]
}

  重新載入配置資訊及重啟 Docker 服務。

# 重新載入某個服務的配置文件
sudo systemctl daemon-reload
# 重新啟動 docker
sudo systemctl restart docker

  

創建私有倉庫容器

  

  創建私有倉庫容器。

docker run -di --name registry -p 5000:5000 -v /mydata/docker_registry:/var/lib/registry registry
  • -d:後台運行容器;
  • --name:為創建的容器命名;
  • -p:表示埠映射,前者是宿主機埠,後者是容器內的映射埠。可以使用多個 -p 做多個埠映射;
  • -v:將容器內 /var/lib/registry 目錄下的數據掛載至宿主機 /mydata/docker_registry 目錄下;

  

  打開瀏覽器輸入://192.168.10.10:5000/v2/_catalog 看到 {"repositories":[]} 表示私有倉庫搭建成功並且內容為空。

  

推送鏡像至私有倉庫

  

  先給鏡像設置標籤 docker tag local-image:tagname new-repo:tagname

  再將鏡像推送至私有倉庫 docker push new-repo:tagname

docker tag hello-world:latest 192.168.10.10:5000/test-hello-world:1.0.0
docker push 192.168.10.10:5000/test-hello-world:1.0.0

  

  打開瀏覽器輸入://192.168.10.10:5000/v2/_catalog 可以看到私有倉庫中已上傳的鏡像。

  由於我們做了目錄掛載,因此可以在宿主機 /mydata/docker_registry/docker/registry/v2/repositories 目錄下查看。

  

配置私有倉庫認證

  

  私有倉庫已經搭建好了,要確保私有倉庫的安全性,還需要一個安全認證證書,防止發生意想不到的事情。所以需要在搭建私有倉庫的 Docker 主機上先生成自簽名證書。

  

  創建證書存儲目錄。

mkdir -p /usr/local/registry/certs

  生成自簽名證書命令。

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
  • openssl req:創建證書籤名請求等功能;
  • -newkey:創建 CSR 證書籤名文件和 RSA 私鑰文件;
  • rsa:2048:指定創建的 RSA 私鑰長度為 2048;
  • -nodes:對私鑰不進行加密;
  • -sha256:使用 SHA256 演算法;
  • -keyout:創建的私鑰文件名稱及位置;
  • -x509:自簽發證書格式;
  • -days:證書有效期;
  • -out:指定 CSR 輸出文件名稱及位置;

  

生成自簽名證書

  

  通過 openssl 先生成自簽名證書,運行命令以後需要填寫一些證書資訊,裡面最關鍵的部分是:Common Name (eg, your name or your server's hostname) []:192.168.10.10,這裡填寫的是私有倉庫的地址。

[root@localhost ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
Generating a 2048 bit RSA private key
.......................+++
.........................+++
writing new private key to '/usr/local/registry/certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SH
Locality Name (eg, city) [Default City]:SH
Organization Name (eg, company) [Default Company Ltd]:mrhelloworld
Organizational Unit Name (eg, section) []:mrhelloworld
Common Name (eg, your name or your server's hostname) []:192.168.10.10
Email Address []:mrhelloworld@126.com

  

生成鑒權密碼文件

  

# 創建存儲鑒權密碼文件目錄
mkdir -p /usr/local/registry/auth
# 如果沒有 htpasswd 功能需要安裝 httpd
yum install -y httpd
# 創建用戶和密碼
htpasswd -Bbn root 1234 > /usr/local/registry/auth/htpasswd

htpasswd 是 apache http 的基本認證文件,使用 htpasswd 命令可以生成用戶及密碼文件。

  

創建私有倉庫容器

  

docker run -di --name registry -p 5000:5000 \
   -v /mydata/docker_registry:/var/lib/registry \
   -v /usr/local/registry/certs:/certs \
   -v /usr/local/registry/auth:/auth \
   -e "REGISTRY_AUTH=htpasswd" \
   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
   registry

  

推送鏡像至私有倉庫失敗

  

  先給鏡像設置標籤 docker tag local-image:tagname new-repo:tagname

  再將鏡像推送至私有倉庫 docker push new-repo:tagname

docker tag hello-world:latest 192.168.10.10:5000/test-hello-world:1.0.0
docker push 192.168.10.10:5000/test-hello-world:1.0.0

  如果直接 push 鏡像肯定會失敗,並且出現 no basic auth credentials 的錯誤,這是因為我們沒有進行登錄認證。

  

登錄帳號

  

  通過 docker login 命令輸入帳號密碼登錄私有倉庫。

  

推送鏡像至私有倉庫成功

  

  再次 push 鏡像,發現已經可以推送成功了。

  

退出帳號

  

  通過 docker logout 命令退出帳號。

[root@localhost ~]# docker logout 192.168.10.10
Removing login credentials for 192.168.10.10

私有鏡像倉庫的搭建還可以通過 Harbor 實現,Harbor 是由 VMware 公司開源的企業級的 Docker Registry 管理項目,它包括許可權管理(RBAC)、LDAP、日誌審核、管理介面、自我註冊、鏡像複製和中文支援等功能。後期我也會和大家分享關於 Harbor 的使用,下文我們先來學習 Docker 網路相關的內容,解決一下容器網路通訊的問題。

本文採用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 查看更多關於 Docker 的文章。

  

🤗 您的點贊轉發是對我最大的支援。

📢 掃碼關注 哈嘍沃德先生「文檔 + 影片」每篇文章都配有專門影片講解,學習更輕鬆噢 ~