背景
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
参考文档: