普通模式
1.查看服務器上已經安裝的docker容器
[root@rabbit1 images]# yum list installed |grep docker
containerd.io.x86_64 1.2.10-3.2.el7 @docker-ce-stable
docker-ce.x86_64 3:19.03.5-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.5-3.el7 @docker-ce-stable
說明:docker-ce-cli.x86_64 爲docker客戶端程序,docker-ce.x86_64 爲docker服務端程序,
2.卸載docker容器(如果不是我們需要的版本要卸載重新安裝,否則可以忽略)
docker remove containerd.io.x86_64
yum remove docker-ce-cli.x86_64
3.安裝最新版的docker
yum install docker-ce
也可以通過如下命令查看所有版本的docker容器,根據需要安裝指定版本:
yum search docker-ce --showduplicates
–showduplicates列出所有的版本
4.啓動docker容器服務
systemctl start docker
5.創建registry鏡像
- 普通registry鏡像模式
docker run -d -p 5000:5000 --restart=always --name registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-v /home/images:/var/lib/registry \
registry:2.7.1
- -d後臺運行進程
- -p 5000:5000宿主機和docker容器端口號映射,前一個5000表示宿主機端口號,後一個表示docker容器端口號
- –restart =always表示docker容器重啓後容器自動啓動
- -e REGISTRY_HTTP_ADDR=0.0.0.0:5000環境變量,用來更改容器監聽的端口號
- -v /home/images:/var/lib/registry自定義鏡像存儲位置,/var/lib/registry是容器中默認存儲鏡像的位置,/home/images是自定義文件系統的路徑
- registry:2.7.1 registry是鏡像名稱,2.7.1是鏡像版本號
注意:此示例僅用於測試環境,生產環境的registry必須通過TLS驗證,理想情況下應該使用訪問控制機制
6.registry私服鏡像上傳、拉取、刪除操作示例
- 拉取unbuntu最新版本的鏡像
docker pull ubuntu
- 將鏡像tag爲xx.xx.xx.xx:5000/ubuntu。這將爲已經存在的鏡像創建額外的tag。鏡像的第一部分是主機IP和端口號,Docker會在推送時將其解釋爲registry的位置。
docker tag ubuntu xxx.xxx.xxx.xxx:5000/ubuntu
- 將鏡像推送到本地運行的registry xxx.xxx.xxx.xxx:5000
docker push xxx.xxx.xxx.xxx:5000/ubuntu
執行推送操作可能會發生如下異常:
[root@rabbit1 images]# docker push xx.xx.xx.xxx:5000/ubuntu
The push refers to repository [xx.xx.xx.xxx:5000/ubuntu]
Get https://xx.xx.xx.xx:5000/v2/: http: server gave HTTP response to HTTPS client
這時我們可以在/etc/docker/daemon.json文件中添加不安全的registry註冊表地址(此種方案只適合在測試環境使用,生產環境要使用TLS證書的方式,可以參考文章的下面部分):
{ "insecure-registries":["xx.xx.xx.xxx:5000"] }
然後重啓docker:
systemctl restart docker
- 首先刪除本地的ubuntu和xx.xx.xx.xx:5000/ubuntu鏡像,軟後從本地私服拉取鏡像到本地
docker image remove ubuntu
docker image remove xx.xx.xx.xx:5000/ubuntu
也可以使用:
docker rmi 鏡像名
拉取私服上的鏡像到本地:
docker pull xx.xx.xx.xx:5000/ubuntu
7.本地的registry私服
- 停止本地registry私服
docker container stop registry
- 啓動本地registry私服
docker container start registry
- 刪除容器registry私服使用docker container rm
docker container stop registry & docker container rm -v registry
自簽發證書登錄模式(TLS)
1.創建如下三個文件夾
##存放registry服務中的鏡像
/home/docker-registry/images
##存放生成的TLS證書
/home/docker-registry/certs
##存放用戶名和密碼
/home/docker-registry/auth
2.生成TLS證書
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout /home/docker-registry/certs/registry.key \
-x509 -days 3650 -out /home/docker-registry/certs/registry.crt
3.創建自帶TLS證書籤名的registry註冊表服務
docker run -d -p 5000:5000 --restart=always --name registry \
-v /home/docker-registry/images:/var/lib/registry \
-v /home/docker-registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
registry:2
4.在docker client可以pull或者push鏡像到registry
$ docker pull ubuntu
$ docker tag ubuntu myregistry.domain.com/my-ubuntu
$ docker push myregistry.domain.com/my-ubuntu
$ docker pull myregistry.domain.com/my-ubuntu
本地基本身份驗證(用戶名密碼模式)
實現訪問限制的最簡單的方法是通過基本身份驗證(這與其它web服務器的基本身份驗證機制非常相似)。
注意:不能將基本身份驗證與以明文形式發送用戶憑證的身份驗證方案一起使用,你必須先配置TLS才能使用本地基本身份驗證
1.創建文件目錄
##存放registry服務中的鏡像
/home/docker-registry/images
##存放生成的TLS證書
/home/docker-registry/certs
##存放用戶名和密碼
/home/docker-registry/auth
2.生成用戶名和密碼證書
##生成用戶名和密碼,單個>會覆蓋文件,兩個>>會在文件中追加用戶名和密碼
docker run --rm\
--entrypoint htpasswd \
registry:2 -Bbn admin2 admin2 >> /home/docker-registry/auth/htpasswd
- –rm:密碼生成之後刪除掉生成的容器
- -B:強制密碼加密
- -b:使用命令行中的密碼而不是提示輸入密碼
- -n:不更新加密文件,只將加密後的用戶名和密碼顯式在屏幕上
3.生成TLS證書
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout /home/docker-registry/certs/registry.key \
-x509 -days 3650 -out /home/docker-registry/certs/registry.crt
4.根據以上幾步生成的證書及賬號密碼創建registry註冊服務
docker run -d -p 9527:5000 --restart=always --name registry \
-v /home/docker-registry/images:/var/lib/registry \
-v /home/docker-registry/certs:/certs \
-v /home/docker-registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-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_STORAGE_DELETE_ENABLED=true \
registry:2
- -e REGISTRY_HTTP_ADDR 倉庫主機地址極端口號
- -e REGISTRY_HTTP_TLS_CERTIFICATE設置環境變量告訴容器公鑰的位置
- -e REGISTRY_HTTP_TLS_KEY設置環境變量告訴容器私鑰的位置
5.登錄registry註冊表
docker login xx.xx.xx.xx:5000
登錄之後會報異常,如下:
Error response from daemon: Get https://xx.xx.xx.com:5000/v2/: x509: certificate signed by unknown authority
這是因爲客戶端沒有安裝證書的原因:
linux系統:將registry.crt複製到文件/etc/docker/certs.d/域名或者主機名:5000/ca.crt,無需重啓docker(主機名的話需要在/etc/hosts文件做映射)
windows版客戶端:直接右鍵安裝就可以了,安裝後要重啓docker
mac版客戶端:將registry.crt證書複製到/.docker/certs.d/域名或者主機名:5000/ca.crt,跟linux系統客戶端安裝證書方式一樣
如果報下面的錯誤,那說明是客戶端未登錄:
Error response from daemon: Get https://xx.xx.xx:5000/v2/mycentos7/manifests/latest: no basic auth credentials
6.退出registry基礎認證登錄
docker logout xx.xx.xx.xx:5000
7.刪除registry容器
docker container stop registry && docker container rm -v registry
8.查詢registry中所有的鏡像名稱
curl -XGET http://xxxx.xx.xx.xx:5000/v2/_catalog
9.根據鏡像名稱查詢鏡像版本
curl -XGET http://xxxx.xx.xx.xx:5000/v2/鏡像名稱/tags/list
Docker Registry Web UI
成功:
docker run -it -p 9528:8080 --name registry-web --link registry \
-e REGISTRY_URL=https://registry:5000/v2 \
-e REGISTRY_TRUST_ANY_SSL=true \
-e REGISTRY_BASIC_AUTH="YWRtaW46YWRtaW4=" \
-e REGISTRY_NAME=emisdockerhub.eastmoney.com:9027 \
-e REGISTRY_READONLY=false \
hyper/docker-registry-web
參考1:https://hub.docker.com/_/registry
參考2:https://docs.docker.com/registry/deploying/
API參考:https://docs.docker.com/registry/spec/api/
insecure registry參考:https://docs.docker.com/registry/insecure/