使用registry镜像构建Docker本地私人镜像仓库

背景

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. 拉取私有仓库镜像
1
bash复制代码docker pull registry
  1. 修改Docker配置

修改daemon.json文件:vi /etc/docker/daemon.json,添加以下内容,用于让Docker信任私有仓库地址(==需要访问私有仓库的Docker客户端都需配置以下内容==):

1
2
3
4
5
json复制代码{
"insecure-registries": [
"10.0.95.63:5566"
]
}

若没有配置,则可能出现以下错误:

1
2
bash复制代码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
  1. 重新加载配置以及重启Docker服务
1
2
bash复制代码sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 重启完成后,即可运行私有仓库容器
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,即可看到:

image-20201221155248837

也可以在挂载的目录上查看到上传的镜像信息:

image-20201221155510351

配置私有仓库认证

为提高私有仓库安全性,设置一个安全认证证书

  1. 创建证书存储目录
1
bash复制代码sudo mkdir -p /usr/local/registry/certs
  1. 生成证书
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输出文件名称及位置;

image-20201221160455526
3. 生成鉴权密码文件

1
2
3
4
5
6
7
bash复制代码# 创建存储鉴权密码文件目录
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
  1. 运行私有仓库容器
1
2
3
4
5
6
7
8
9
10
bash复制代码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
  1. 推送10.0.95.63:5566/nginx:latest到私有仓库会提示no basic auth credentials;

image-20201221161433349
6. 登录并上传

通过docker login命令登录私有仓库:

1
bash复制代码docker login 10.0.95.63:5566

然后推送镜像到私有仓库:

1
bash复制代码docker push 10.0.95.63:5566/nginx:latest
  1. 退出账号
1
bash复制代码docker logout 10.0.95.63:5566

参考文档:

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%