Docker私有镜像仓库搭建及SSL配置

背景

私有Docker镜像仓库搭建的原因是官方docker.io上一个用户只能创建一个私有的应用库,根本不支持实际应用需要,我也不能所有应用都公开啊,所以我就要在我自己的服务器上搭一个私有Docker镜像仓库,配个身份验证,上传拉取都在这个仓库操作就好了!

简介

大致了解了一下docker的私有镜像仓库项目有Docker Registry、Harbor,应该是还有等……,但目前先学一个即可,然后再了解不同之处、应用场景等区分。
Docker Registry是Docker的开源项目
Harbor是VMware公司最近开源的企业级Docker Registry项目,本篇文章讲解Docker Registry的应用。

文章整理如有遗漏或者问题,麻烦留言,谢谢!!!我及时补充或修改

准备环境

服务端:仓库所在Linux服务器,我用的是我自己的腾讯云(CentOS 7.6),大家可以使用虚拟机也行
客户端:可以是另一台Linux服务器,比如测试环境的服务器,或者自己电脑开发环境,这里就是模拟使用的场景了
服务端需要安装Docker、Nginx(如果服务端使用Https,否则可以不安),先安装好,然后再继续往下……

不同系统、环境可能导致一些小问题,可以评论留言或者其他方式寻求解决,我看到的话一定马上回复

Nginx安装可以参考我的另一个文章:https://blog.csdn.net/qq_33598419/article/details/102801754

配置Ng,代理https地址到仓库,记得要安装SSL支持,可以直接使用如下模块配置:
./configure --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre

Docker安装参照:https://www.runoob.com/docker/centos-docker-install.html,菜鸟教程左侧目录中有各系统的安装方法
文章中使用到了各种Docker的命令、参数等,详情可参考我的另一篇文章:https://blog.csdn.net/qq_33598419/article/details/107612961

那开始吧

证书准备(非https部署可跳过)

如果是三方机构颁发证书可以直接保存在服务器中保存证书备用(key、crt文件)

下面介绍一下本地自行颁发证书的简单流程:

  1. 创建服务器证书密钥文件server.key,会提示输入密码,确认密码,用于管理证书使用,一要要记住,后面会用到
openssl genrsa -des3 -out server.key 1024
  1. 创建服务器证书证书签名申请文件server.csr
openssl req -new -key server.key -out server.csr

输出内容为:
Enter pass phrase for root.key:                              ← 输入第一步创建的密码
Country Name (2 letter code) [AU]:CN                         ← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing      ← 省的全名,拼音
Locality Name (eg, city) []:BeiJing                          ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  ← 公司英文名
Organizational Unit Name (eg, section) []:                   ← 可以不输入
Common Name (eg, YOUR name) []:                              ← 可以不输入
Email Address []:                                            ← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:                                     ← 可以不输入
An optional company name []:                                 ← 可以不输入
  1. 先备份一份私钥文件server.key.ori
cp server.key server.key.ori
  1. server.key.ori去除文件口令
openssl rsa -in server.key.ori -out server.key
  1. 别名IP配置extfile.cnf,如果本地配置的服务之后需要使用IP访问https的服务,需要此步
echo subjectAltName = IP:本机外网IP > extfile.cnf
  1. 生成证书文件server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt -extfile extfile.cnf

服务端配置

因为Docker Registry是Docker官方的开源项目
所以可以直接通过Docker下载镜像启动,先检查一下现有镜像信息

docker search registry

可从官方仓库查询到以下镜像(2020年8月17日09:02)
在这里插入图片描述
拉取镜像到本地

docker pull registry

在这里插入图片描述

配置Http协议Registry镜像仓库

如需使用https访问,直接看下一节

运行一个Registry镜像仓库的容器实例

docker run -d -v /你本地要保存镜像的目录的绝对路径:/var/lib/registry -p 5000:5000 --restart=always --name 自定义容器名 registry

测试仓库
使用客户端访问
个人电脑使用浏览器访问:http://服务器IP地址:5000/v2/_catalog
Linux服务器使用curl访问:curl http://服务器IP地址:5000/v2/_catalog
会得到如下信息,这里返回的json数据代表暂无任何仓库,因为我们还没有上传任何镜像。

{"repositories":[]}

如果服务端有配置域名,稍后访问时可以使用域名访问,把下面文章中的IP替换为域名即可(除了配置文件)
http服务端配置OK

配置Https协议Registry镜像仓库(推荐)

如果已使用http访问配置,跳过本节

主要原理:配置Nginx代理https地址转发到Registry镜像仓库的安全IP+端口号;
这里经过实践得到的结论是,Registry镜像仓库本身是可以配置SSL的IP访问的,而且只有当配置了该访问方式,才可以用https的访问转发到镜像内安全IP+端口号,否则会因为ng代理的https请求,到Registry镜像仓库内的http协议的ip地址时,会有响应信息的错误,导致无法访问仓库。

运行一个Registry镜像仓库的容器实例,这样配置启动才可以用ng代理https转发:

docker run -d -v /你本地要保存镜像的目录的绝对路径:/var/lib/registry -p 15987:443 -v /你本地要保存镜像的目录的绝对路径/auth:/auth -e REGISTRY_LOG_LEVEL=debug -e "REGISTRY_AUTH=htpasswd" -e REGISTRY_HTTP_SECRET -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -v /ssl证书存在目录:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/证书文件.crt -e REGISTRY_HTTP_TLS_KEY=/certs/证书key文件.key --restart=always --name 自定义容器名 registry

换行版,看着舒服,也可以直接在终端执行

docker run -d \
-v /你本地要保存镜像的目录的绝对路径:/var/lib/registry \
-p 15987:443 \
-v /你本地要保存镜像的目录的绝对路径/auth:/auth \
-e REGISTRY_LOG_LEVEL=debug \
-e "REGISTRY_AUTH=htpasswd" \
-e REGISTRY_HTTP_SECRET \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-v /ssl证书存在目录:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/证书文件.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/证书key文件.key \
--restart=always \
--name 自定义容器名 \
registry

有关仓库身份验证的官方说明文档(有更多需求的可以了解一下):https://docs.docker.com/registry/configuration/#auth

Nginx配置你要对外暴露的访问https地址转发到本地服务的15987端口即可(如上方启动时外部端口修改,就使用自定义的)

配置身份验证

修改:你本地要保存镜像的目录的绝对路径/auth/htpasswd文件,一行一个用户,格式如下,修改立即生效:

用户名:bcrypt加密的密码串

百度bcrypt加密工具网站或者我这也找了一个:https://www.jisuan.mobi/p163u3BN66Hm6JWx.html

客户端使用

根据服务端的协议配置选择客户端的使用方式

Http访问

为了让客户端服务器能够快速地访问刚刚在服务端搭建的镜像仓库(默认情况下是需要配置HTTPS证书的),这里简单在客户端配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问:

如果客户端不设置可信任源,服务端又没有配置HTTPS证书,那么会遇到这个错误:error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.

Linux系统,修改如下文件,如果没有就创建一个该目录及文件

vim /etc/docker/daemon.json

个人电脑就修改docker安装目录下的daemon.json文件即可,如下图
在这里插入图片描述

有关daemon.json文件的详细说明,可查询官网:https://docs.docker.com/config/daemon/

如新建的daemon.json填写下面这一句,这里的"your-server-ip"请换为你的服务器的外网IP地址:

{
"insecure-registries": [ "your-server-ip:5000"]
}

如已存在文件并包含了其他配置,就增加配置

"insecure-registries": [ "your-server-ip:5000"]

为了使得配置生效,重新启动docker服务:

systemctl restart docker

个人电脑,通过任务栏重启
在这里插入图片描述

Https访问

客户端什么都不用配置,继续往下吧,这就是推荐使用https服务端的原因之一(手动滑稽),其实主要还是安全等其他众多因素

本地镜像使用私有仓库的命名规则

很重要,这影响着能否正常使用私有仓库

ip:端口号或者域名 / 镜像名(全小写字母) : 标签
如: mydockerhub.com/mynginximage:0.0.1
10.10.10.10:5000/mynginximage:0.0.1

登录私有仓库

docker login 仓库访问地址(如:域名或者IP:端口号)

上传镜像

已存在本地镜像,如下修改镜像名,如不存在镜像,打包的时候按照规则命名即可

docker tag your-image-name:tagname your-server-ip:5000/your-image-name:tagname

推送镜像到服务端,推送的时候就会按照命名进行指定仓库推送了

docker push your-registry-server-ip:5000/your-image-name:tagname

拉取镜像

docker pull your-registry-server-ip:5000/your-image-name:tagname

查看仓库镜像列表

个人电脑使用浏览器访问或者curl:

# 查看仓库镜像列表
http://服务器IP地址:5000/v2/_catalog
https://域名/v2/_catalog
# 查看镜像版本列表
http://服务器IP地址:5000/v2/your-image-name/tags/list
https://域名/v2/your-image-name/tags/list

Linux服务器使用curl访问:

# 查看仓库镜像列表
http://服务器IP地址:5000/v2/_catalog
https://域名/v2/_catalog
# 查看镜像版本列表
curl http://服务器IP地址:5000/v2/your-image-name/tags/list
curl https://域名/v2/your-image-name/tags/list

如果有帮助,麻烦点个赞或者关注,谢谢各位!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值