背景
DockerHub上为我们提供了许多官方镜像,我们可以从DockerHub中上传或者下载镜像,但是:
-
由于网络的限制,会导致镜像的上传和下载速度较慢;
-
生产使用的镜像中包含了许多隐私信息,若放到DockerHub上容易被外部人员获取。
为解决上述问题,官方提供了
registry
镜像,用于搭建本地私人镜像仓库,在内网中搭建Docker私有仓库可以让镜像仅允许内网人员下载,并且上传与下载速度也较快。
优点
- 可限制外部人员访问
- 上传下载速度快,不受外网带宽影响
- 支持仓库认证
- ...
环境
-
10.0.95.63 主机(暂时使用个人电脑作为私人镜像仓库服务器)KFDockerRegistry
-
统一使用5566端口
注意
上传:
- 需先登录到私有仓库:
docker login 10.0.95.63:5566
,然后输入账号密码; - 上传的镜像名称前需有私有仓库标识:
10.0.95.63:5566
,如10.0.95.63:5566/nginx:latest
; - 上传完成后需注销登录:
docker logout
。
下载:
- 下载的镜像名称前需有私有仓库标识:
10.0.95.63:5566
,如10.0.95.63:5566/nginx:latest
。
搭建私有仓库
-
拉取私有仓库镜像
docker pull registry 复制代码
-
修改Docker配置
修改daemon.json文件:
vi /etc/docker/daemon.json
,添加以下内容,用于让Docker信任私有仓库地址(==需要访问私有仓库的Docker客户端都需配置以下内容==):{ "insecure-registries": [ "10.0.95.63:5566" ] } 复制代码
若没有配置,则可能出现以下错误:
X509: cannot validate certificate for 10.0.95.63 because it does not contain any IP SANs Get https://10.0.95.63:5566/v2/: http: server gave HTTP response to HTTPS client 复制代码
-
重新加载配置以及重启Docker服务
sudo systemctl daemon-reload sudo systemctl restart docker 复制代码
-
重启完成后,即可运行私有仓库容器
docker run -id -p 5566:5000 --name registry -v /media/mes/file2/docker_registry:/var/lib/registry registry 复制代码
其中:
-d
:后台运行容器;--name
:为容器命名;-p
:映射端口,将本地的5566端口映射到容器的5000端口;-v
:将容器中的/var/lib/registry
目录挂载到本地的/media/mes/file2/docker_registry
目录; -
使用浏览器访问路径:
http://10.0.95.63:5566/v2/_catalog
,浏览器显示{"repositories":[]}
则为搭建成功 -
推送镜像到私有仓库
使用
tag
命令给镜像设置标签:docker tag nginx:latest 10.0.95.63:5566/nginx:latest 复制代码
然后使用
push
命令推送至私有仓库docker push 10.0.95.63:5566/nginx:latest 复制代码
然后通过浏览器访问路径:
http://10.0.95.63:5566/v2/_catalog
,即可看到:也可以在挂载的目录上查看到上传的镜像信息:
配置私有仓库认证
为提高私有仓库安全性,设置一个安全认证证书
-
创建证书存储目录
sudo mkdir -p /usr/local/registry/certs 复制代码
-
生成证书
sudo 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输出文件名称及位置; -
生成鉴权密码文件
# 创建存储鉴权密码文件目录 sudo mkdir -p /usr/local/registry/auth # 安装httpd,这里选择apache2 sudo apt-get install apache2 # 创建用户和密码 sudo chmod -R 777 /usr/local/registry/auth sudo htpasswd -Bbn root mes_2020 > /usr/bin/registry/auth/htpasswd 复制代码
-
运行私有仓库容器
docker run -id --name registry -p 5566: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 复制代码
-
推送
10.0.95.63:5566/nginx:latest
到私有仓库会提示no basic auth credentials
; -
登录并上传
通过
docker login
命令登录私有仓库:docker login 10.0.95.63:5566 复制代码
然后推送镜像到私有仓库:
docker push 10.0.95.63:5566/nginx:latest 复制代码
-
退出账号
docker logout 10.0.95.63:5566 复制代码
参考文档:
近期评论