Featured image of post 搭建基于https的Docker私有仓库

搭建基于https的Docker私有仓库

自己搭建基于Https的docker私有仓库

前言

在我们日常工作中,基于Docker技术进行开发、测试环境的快速部署和管理已经非常普遍,而对于我们自己的产品研发来说,必然就离不开很多私有的docker镜像管理,更加上docker官方镜像仓库的访问困难,在我们的研发环境中的搭建私有docker镜像仓库就成为一个普遍需求。

搭建私有docker镜像仓库的基本方法 - http

搭建docker私有镜像仓库的基础方法,其实非常简便,也是大家网上搜索最容易找到的方案。

直接通过 docker 启动它的仓库镜像 registry 即可

1
2
3
4
5
6
docker run -d \ 
           --restart=always \        
           --name registry \
		   -p 5100:5000 \
		   -v registry-data:/var/lib/registry \
		   registry

–restart 设置在仓库异常时自动重启仓库,保证可用性 –name 设置仓库名称 –p 内部仓库服务端口5000映射到宿主机5100端口 –v 仓库存储持久化到数据卷

镜像启动完成以后,通过浏览器访问一下这台宿主机5100端口的 v2 接口,可以正常显示一个空的 json 字串,表示仓库已经可以正常提供服务

但这时,如果我们通过 docker push 命令向这个私有仓库上传镜像,会得到一个提示默认协议https不匹配的提示。

这里我们还需要通过docker配置使其接受http协议,Linux 系统下通常在 /etc/docker/daemon.json 这个docker守护进程配置文件中。

在其中添加私有镜像服务器地址:

1
"insecure-registries": ["192.168.101.67:5100"],

如果是在windows中使用docker desktop,在docker engine中进行配置

重启docker引擎后,就可以正常对刚搭建的私有参考进行push和pull操作了。

但是,虽然基于http协议的基础镜像仓库能满足我们日常的基本使用要求,但如果我们的产品项目不是个小型项目,牵涉多个docker镜像联动和多个节点的话,一般会需要使用docker集群。

docker官方的集群系统docker swarm使用也非常简便,但docker swarm中对于私有镜像仓库,出于安全考虑,是需要强制通过 https 协议访问的,因此,我们本文的重点,还是介绍下如何搭建一个基于https 协议的私有镜像仓库

https协议镜像仓库的要求

https 协议相对于 http 协议,主要就是提供了传输安全性上的保护。关于 https协议原理的详细说明,可以参看我前面的文章

大话HTTPS协议,理解SSL、TLS和HTTP的关系

因此,我们要搭建基于 https 协议的镜像仓库,复杂的地方主要是解决https协议要求的相关认证和鉴权上的要求。主要包括:

  • 生成证书和访问密钥,非生产环境一般使用自签名证书。
  • 配置镜像仓库启动时挂载证书
  • 配置访问节点对证书的信任
  • 加入集群,推送、拉取docker镜像

集群中部署私有镜像仓库

下面,我们逐步详细说明部署过程

自签名证书生成

生成根证书私钥和证书

1
2
3
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout ca.key -x509 -days 3650 -out ca.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Qiucao Inc./CN=Qiucao Root CA"

生成服务器私钥和 CSR

1
2
3
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout registry.key -out registry.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Qiucao Inc./CN=qiucao.com"

使用根证书签发服务器证书

1
2
openssl x509 -req -days 3650 -in registry.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out registry.crt -extfile <(printf "subjectAltName=DNS:qiucao.com")

通过以上操作,会生成我们需要的证书清单

  • ca.crt:根证书
  • registry.crt:服务器证书
  • registry.key:服务器私钥

配置镜像Registry

在swarm集群中启用Registry仓库,可以通过docker compose, 先配置compose启动文件

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
services:
  registry:
    image: registry:2
    ports:
      - "5100:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt
      REGISTRY_HTTP_TLS_KEY: /certs/registry.key
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry
    volumes:
      - ./certs:/certs
      - /var/docker-registry:/var/lib/registry
    networks:
      - registry-net

networks:
  registry-net:
    driver: overlay

然后通过 docker stack 在集群中启用仓库

1
2
3
4
5
# 创建 overlay 网络
docker network create -d overlay registry-net

# 部署 Registry 服务
docker stack deploy -c docker-compose.yml registry

这样,我们就启用了支持认证的仓库

配置访问节点信任证书

但仓库支持认证,要在访问时能正常对服务进行认证,在客户节点上,还有一个操作,也就是需要信任仓库的自签名证书

1
2
mkdir -p /etc/docker/certs.d/qiucao.com:5100
cp ca.crt /etc/docker/certs.d/qiucao.com:5100/ca.crt

重启本地docker服务,以加载信任证书

验证仓库镜像拉取

然后,在客户机上,我们就可以通过私有仓库来完成镜像的拉取了

这里还有一个步骤,就是我们配置的仓库地址是 qiucao.com,并不是一个实际存在的公共网络域名,所以这里我们还应该在本地的 /etc/hosts中添加对域名的解析

1
192.168.101.67 qiucao.com

然后执行命令 docker pull 拉取仓库中的镜像,可以成功完成镜像的拉取


更多关于docker使用和体系化的测试技能提升,可了解我的测试课程,回复 大纲 了解课程详细内容。

使用 Hugo 构建
主题 StackJimmy 设计