背景
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
。
搭建私有仓库
- 拉取私有仓库镜像
1 | bash复制代码docker pull registry |
- 修改Docker配置
修改daemon.json文件:vi /etc/docker/daemon.json
,添加以下内容,用于让Docker信任私有仓库地址(==需要访问私有仓库的Docker客户端都需配置以下内容==):
1 | json复制代码{ |
若没有配置,则可能出现以下错误:
1 | bash复制代码X509: cannot validate certificate for 10.0.95.63 because it does not contain any IP SANs |
- 重新加载配置以及重启Docker服务
1 | bash复制代码sudo systemctl daemon-reload |
- 重启完成后,即可运行私有仓库容器
1 | bash复制代码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
目录;
5. 使用浏览器访问路径:http://10.0.95.63:5566/v2/_catalog
,浏览器显示{"repositories":[]}
则为搭建成功
6. 推送镜像到私有仓库
使用tag
命令给镜像设置标签:
1 | bash复制代码docker tag nginx:latest 10.0.95.63:5566/nginx:latest |
然后使用push
命令推送至私有仓库
1 | bash复制代码docker push 10.0.95.63:5566/nginx:latest |
然后通过浏览器访问路径:http://10.0.95.63:5566/v2/_catalog
,即可看到:
也可以在挂载的目录上查看到上传的镜像信息:
配置私有仓库认证
为提高私有仓库安全性,设置一个安全认证证书
- 创建证书存储目录
1 | bash复制代码sudo mkdir -p /usr/local/registry/certs |
- 生成证书
1 | bash复制代码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输出文件名称及位置;
3. 生成鉴权密码文件
1 | bash复制代码# 创建存储鉴权密码文件目录 |
- 运行私有仓库容器
1 | bash复制代码docker run -id --name registry -p 5566:5000 \ |
- 推送
10.0.95.63:5566/nginx:latest
到私有仓库会提示no basic auth credentials
;
6. 登录并上传
通过docker login
命令登录私有仓库:
1 | bash复制代码docker login 10.0.95.63:5566 |
然后推送镜像到私有仓库:
1 | bash复制代码docker push 10.0.95.63:5566/nginx:latest |
- 退出账号
1 | bash复制代码docker logout 10.0.95.63:5566 |
参考文档:
本文转载自: 掘金