Docker Registry是 Docker 容器鏡像的存儲和分發(fā)服務(wù),允許用戶存儲和管理 Docker 鏡像。它可以是公共的,如 Docker Hub,也可以是私有的,如自建的 Docker Registry。
Registry是一個非常簡單的輕量級本地私有倉庫,由于該鏡像倉庫比較單一,實際生產(chǎn)環(huán)境很少有公司使用。
一、安裝 Docker
# 安裝 yum 工具集
yum install -y yum-utils
# 添加阿里云docker-ce倉庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝docker-ce(社區(qū)版)軟件包
yum -y install docker-ce
# 啟用Docker Cgroup用于限制進程的資源使用量,如CPU、內(nèi)存資源
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 啟動docker并設(shè)置隨機自啟
systemctl enable docker ; systemctl start docker
二、部署 Registry
# 拉取私有鏡像倉庫到本地
docker pull registry
# 啟動私有鏡像倉庫
docker run -d -p 5000:5000 --restart=always --name registry registry:latest
這里的參數(shù)解釋:
-d: 后臺運行容器。
-p 5000:5000: 將容器的 5000 端口映射到主機的 5000 端口,這是 Registry 默認的監(jiān)聽端口。
--restart=always: 設(shè)置容器自動重啟,以確保即使系統(tǒng)重啟或者 Docker 服務(wù)重啟后,Registry 也能自動重新啟動。
--name registry: 為容器指定一個名稱,這里命名為 registry。
registry:latest: 使用 Docker Hub 上的 registry 鏡像, latest表示使用的是 Registry 的版本 。
啟動后,瀏覽器直接訪問http://IP:5000端口,訪問不到任何內(nèi)容,正確的訪問方式:http://IP:5000/v2/_catalog
看到 {"repositories":[]},說明 docker registry 已經(jīng)部署成功,只是倉庫中還沒有存儲鏡像
# 編輯docker配置文件
需要配置 /etc/docker/daemon.json
添加
"insecure-registries": ["192.168.1.101:5000"]
注:配置信息除最后一行外,每行末尾都有一個英文的逗號,
默認情況下,Docker 只允許使用 HTTPS 協(xié)議(安全連接)來拉取和推送鏡像。
如果需要在 Docker 中訪問一個沒有啟用 HTTPS 的私有鏡像倉庫,
可以通過在 daemon.json 中添加 insecure-registries 字段來指定允許使用不安全的 HTTP 連接訪問的鏡像倉庫。
systemctl daemon-reload # 重載配置文件
systemctl restart docker # 重啟docker
如果是在當(dāng)前部署 registry 的機器上,可以拉取 nginx 測試上傳到 registry
docker pull nginx:latest
# 查看已有鏡像
docker images
# 給 nginx 鏡像打標(biāo)簽
docker tag nginx:latest 192.168.1.100:5000/mynginx:1.0
# 查看是否標(biāo)記成功
docker images
# 上傳鏡像到私有倉庫
docker push 192.168.1.100:5000/mynginx:1.0
http://192.168.1.100:5000/v2/_catalog
看到 {"repositories":["mynginx"]},說明鏡像已經(jīng)成功上傳到 docker registry 私有倉庫中。
docker tag
docker tag 命令用于給本地的一個鏡像打上新的標(biāo)簽,這個標(biāo)簽可以是另一個鏡像名稱和標(biāo)簽的組合,或者只是一個新的標(biāo)簽。
docker tag SOURCE_IMAGE[:TAG] repository_name/TARGET_IMAGE[:TAG]
示例:
docker tag nginx:latest 192.168.1.100:5000/mynginx:1.0
參數(shù)解釋:
SOURCE_IMAGE[:TAG]:要標(biāo)記的本地鏡像??梢园瑯?biāo)簽(TAG),如果沒有指定標(biāo)簽,默認為 latest。
TARGET_IMAGE[:TAG]:新標(biāo)記的目標(biāo)鏡像??梢园瑯?biāo)簽(TAG),如果沒有指定標(biāo)簽,默認為 latest。
repository_name:私有鏡像倉庫地址
docker push
docker push repository_name/IMAGE[:TAG]
示例:
docker push 192.168.1.100:5000/mynginx:1.0
三、部署 docker-registry-web
docker-registry-web是一個開源項目,它提供了一個簡單的 Web 界面來管理和瀏覽 Docker Registry 中的鏡像。
# 拉取docker-registry-web鏡像
docker pull hyper/docker-registry-web
docker run -it -d --name registry-web \
-e REGISTRY_URL=http://192.168.1.100:5000/v2 \
-e REGISTRY_NAME=192.168.1.100:5000 \
-p 8000:8080 \
hyper/docker-registry-web
參數(shù)解釋:
1、docker run:
這是 Docker 命令,用于運行一個新的容器。
2、-it:
-i 表示交互模式(interactive),允許你在容器中進行交互。
-t 表示分配一個偽終端(pseudo-TTY),通常與 -i 一起使用以便交互式操作。
在這個具體的命令中,-it 用于保持容器在前臺運行,并能夠在控制臺上查看容器的輸出和日志。
3、-d:
表示以后臺(detached)模式運行容器,即使不指定 -it 也可以使容器在后臺運行。
--name registry-web:
指定容器的名稱為 registry-web,這樣在后續(xù)的操作中可以通過這個名稱來引用這個容器。
4、-e REGISTRY_URL=http://192.168.1.100:5000/v2:
設(shè)置環(huán)境變量 REGISTRY_URL,指定了要連接的 Docker Registry 的 URL。
在這個例子中,http://192.168.1.100:5000/v2 是 Docker Registry 的地址,后面的 /v2 表示 Docker Registry API 的版本。
5、-e REGISTRY_NAME=192.168.1.100:5000:
設(shè)置環(huán)境變量 REGISTRY_NAME,用于在 docker-registry-web 的界面上顯示 Registry 的名稱。
在這里,192.168.1.100:5000 是注冊表的名稱,將顯示在 docker-registry-web 界面上,以便用戶能夠識別所連接的 Registry。
6、-p 8000:8080:
將容器的 8080 端口映射到宿主機的 8000 端口,允許通過 8000 端口訪問 docker-registry-web 提供的 Web 界面。
這里宿主機上的 8000 端口是供外部訪問用的,可以根據(jù)需要調(diào)整映射的端口號。
7、hyper/docker-registry-web:
指定要運行的 Docker 鏡像,這里是 hyper/docker-registry-web,是 docker-registry-web 的鏡像名稱和標(biāo)簽(版本)。
# 訪問 http://192.168.1.100:8000/,可以看到Docker Registry中存儲的鏡像信息
docker-registry-web 連接基于 HTTPS 的 Docker Registry
??
docker run -d -p 8000:8080 --name registry-web \
-e REGISTRY_URL=https://tt.dd.com:5000/v2 \
-e REGISTRY_NAME=192.168.1.100:5000 \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-e REGISTRY_BASIC_AUTH="YWRtaW46MTIzNDU2" \
-v /securitit/registry/certs:/certs \
-e DOCKER_REGISTRY_WEB_HTTPS_KEY=/certs/domain.key \
-e DOCKER_REGISTRY_WEB_HTTPS_CERTIFICATE=/certs/domain.pem \
hyper/docker-registry-web
# master 節(jié)點創(chuàng)建docker registry secret
kubectl create secret docker-registry tt \
--docker-server=tt.dd.com:5000 \
--docker-username=admin \
--docker-password=123456 \
--docker-email=jcn@example.com
# 刪除 secret
kubectl delete secret tt
四、 Registry配置 https 服務(wù)
1、確認目錄存在并創(chuàng)建
mkdir -p /securitit/registry/auth
2、使用 htpasswd 生成文件
sudo yum install httpd-tools -y
htpasswd -Bbn admin 123456 > /securitit/registry/auth/htpasswd
3、 確認文件生成
執(zhí)行完上述命令后,使用以下命令確認 htpasswd 文件已經(jīng)成功生成并包含正確的賬號密碼:
cat /securitit/registry/auth/htpasswd
如果能夠看到類似以下內(nèi)容,表示文件已經(jīng)成功創(chuàng)建:
admin:$2y$05$aQ2Pq/X.vzii61OzzE1oaOasjiH90f0SDjAPNrPIc3TvfoRxkI6eu
4、使用registry鏡像啟動容器,同時啟用基于HTTP BASIC認證
docker run -d -p 5000:5000 --restart=always --name registry \
-v /securitit/registry/auth:/auth \
-v /securitit/registry/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
-e REGISTRY_AUTH=htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:latest
5、訪問 https://IP:5000/v2/_catalog,輸入設(shè)置的用戶名(admin)和密碼(123456)后,可正常訪問。