Docker Registry 部署镜像私有仓库及鉴权认证

简介: 了解什么是 Docker Registry,常用的 Docker Registry 的鉴权和认证机制有哪些,不同的认证机制在配置文件中的参数有所不同。可以根据实际需求选择相应的认证机制并进行配置。

一、Docker Registry 是什么?

Docker Registry 是一个无状态、高度可扩展的服务器端应用程序,用于存储和分发 Docker 镜像。Docker Registry 是基于 Apache 许可证开源的,它是目前应用最广泛的镜像仓库管理程序,所有的源码在 github 上开源,如果感兴趣的话可以 clone 相关的代码进行深层次的学习。

为什么需要使用 Docker Registry?

  1. 需要对镜像进行严格统一管理;
  2. 需要拥有镜像的分发渠道;
  3. 并且将镜像管理和分发集成到内部统一开发流程中。

例如搭建内部 CI 平台,自动构建镜像、存储镜像和分发镜像,实现一键构建,打通从开发、测试环境到生产环境。

e3ea8f25ec34df10572cd4dceea176e3.png

二、Docker Registry 部署私有仓库

部署 Docker Registry 之前先安装 Docker,我的环境是 CentOS,直接使用以下命令:

[root@node1 docker]# yum update
[root@node1 docker]# yum install docker
[root@node1 docker]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

你可以创建专门的 docker 用户进行操作,更加安全,刚创建的用户不在 sudo user 里面,可以通过以下方式设置,这里为了方便,我使用了 root 用户。

chmod u+w /etc/sudoers
vim /etc/sudoers
//填入以下内容
docker ALL=(ALL) ALL

安装完毕以后使用以下命令查看 docker 运行状态:

[root@node1 docker]# sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-10 18:03:18 CST; 11s ago
     Docs: http://docs.docker.com
 Main PID: 47284 (dockerd-current)
   CGroup: /system.slice/docker.service
           ├─47284 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/li...
           └─47290 /usr/bin/docker-containerd-current -l unix:///var/run/dock...

Mar 10 18:03:17 node1 dockerd-current[47284]: time="2023-03-10T18:03:17.8383..."
Mar 10 18:03:17 node1 dockerd-current[47284]: time="2023-03-10T18:03:17.8422..."
Mar 10 18:03:17 node1 dockerd-current[47284]: time="2023-03-10T18:03:17.8484..."
Mar 10 18:03:17 node1 dockerd-current[47284]: time="2023-03-10T18:03:17.8776..."
Mar 10 18:03:18 node1 dockerd-current[47284]: time="2023-03-10T18:03:18.0211..."
Mar 10 18:03:18 node1 dockerd-current[47284]: time="2023-03-10T18:03:18.0656..."
Mar 10 18:03:18 node1 dockerd-current[47284]: time="2023-03-10T18:03:18.0906..."
Mar 10 18:03:18 node1 dockerd-current[47284]: time="2023-03-10T18:03:18.0917...1
Mar 10 18:03:18 node1 dockerd-current[47284]: time="2023-03-10T18:03:18.1144..."
Mar 10 18:03:18 node1 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

以上可以看到状态是 active

要部署一个 Docker Registry,如果使用容器部署,且使用默认配置,则最简单的使用以下命令就可以将 Docker Registry 运行起来:

docker run -d -p 5000:5000 --name registry registry:2

要使用 Docker Registry 部署一个镜像私有仓库,需要遵循以下步骤:

2.1、Docker Registry 安装

可以使用以下命令从 Docker Hub 上下载 Docker Registry 的官方镜像:

docker pull registry:2

2.2、Docker Registry 配置

Docker Registry 的配置文件使用 YAML 格式编写,可以通过修改配置文件来启用鉴权和认证机制,以及配置存储方式等。

以下是一个示例配置文件:

version: 0.1
log:
  accesslog: /var/log/registry/access.log
  errorlog: /var/log/registry/error.log
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: 5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  htpasswd:
    realm: registry
    path: /auth/htpasswd

在上面的配置文件中,storage.filesystem.rootdirectory 参数指定了存储镜像的目录,http.addr 参数指定了 Docker Registry 监听的端口号,auth.htpasswd.realm 参数指定了认证域的名称,auth.htpasswd.path 参数指定了存储用户名和密码的文件路径。

2.3、启动 Docker Registry

可以使用以下命令启动 Docker Registry

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /path/to/registry:/var/lib/registry \
  -v /path/to/config.yml:/etc/docker/registry/config.yml \
  registry:2

其中,-p 参数指定了 Docker Registry 监听的端口号,-v 参数指定了存储镜像和配置文件的目录,registry:2 参数指定了使用的 Docker Registry 镜像版本。

2.4、Docker 客户端配置

为了使用刚刚部署的镜像私有仓库,需要在 Docker 客户端中配置 Docker Registry 的地址和认证信息。可以使用以下命令配置 Docker 客户端:

docker login registry.example.com:5000

其中,registry.example.com:5000 参数指定了 Docker Registry 的地址和端口号。

2.5、向 Docker Registry 上传和下载镜像

可以使用以下命令上传和下载镜像:

docker tag image-name registry.example.com:5000/image-name
docker push registry.example.com:5000/image-name
docker pull registry.example.com:5000/image-name

其中,image-name 参数指定了要上传和下载的镜像名称。注意,在上传和下载镜像时,需要使用 Docker Registry 的完整地址和端口号。

以上就是使用 Docker Registry 部署镜像私有仓库的步骤,可以根据实际需求进行配置和使用。

三、Docker Registry 鉴权和认证

Docker Registry 是一个中央存储和分发 Docker 镜像的服务器,其支持多种鉴权和认证机制,包括基本认证、Bearer Token 认证、AWS 认证和 LDAP 认证等。下面我们详细介绍其中的几种常用认证和鉴权机制,并给出相应的代码配置示例。

3.1、基本认证

基本认证是一种简单的 HTTP 认证机制,它通过在 HTTP 头中发送 Base64 编码的用户名和密码来验证用户的身份。Docker Registry 支持基本认证,可以通过配置文件来启用。以下是一个示例配置文件:

version: 0.1
log:
  accesslog: /var/log/registry/access.log
  errorlog: /var/log/registry/error.log
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: 5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  htpasswd:
    realm: registry
    path: /auth/htpasswd

在上面的配置文件中,auth.htpasswd.realm 参数表示基本认证领域的名称,auth.htpasswd.path 参数表示包含用户名和密码的文件路径。我们可以使用 htpasswd 命令来创建用户名和密码文件,例如:

$ htpasswd -Bbn user1 password1 > /path/to/htpasswd

3.2、Bearer Token 认证

Bearer Token 认证是一种基于 OAuth2 协议的认证机制,它使用访问令牌来验证用户的身份。Docker Registry 支持 Bearer Token 认证,可以通过配置文件来启用。以下是一个示例配置文件:

version: 0.1
log:
  accesslog: /var/log/registry/access.log
  errorlog: /var/log/registry/error.log
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: 5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  token:
    realm: registry
    service: registry
    issuer: registry
    rootcertbundle: /path/to/root.crt

在上面的配置文件中,auth.token.realm 参数表示 Bearer Token 认证领域的名称,auth.token.serviceauth.token.issuer 参数表示服务名称和颁发者名称。auth.token.rootcertbundle 参数表示根证书的路径,这里可以使用自签名的证书或 CA 签名的证书。

3.3、AWS 认证

AWS 认证是一种基于 AWS Identity and Access Management(IAM) 的认证机制,它使用AWS凭证来验证用户的身份。Docker Registry 支持 AWS 认证,可以通过配置文件来启用。以下是一个示例配置文件:

version: 0.1
log:
  accesslog: /var/log/registry/access.log
  errorlog: /var/log/registry/error.log
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: 5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  s3:
    access

在上面的配置文件中,auth.s3.accesskeyauth.s3.secretkey 参数表示 AWS 凭证的访问密钥和私有密钥,auth.s3.region 参数表示 AWS S3 存储桶的区域,auth.s3.bucket 参数表示存储镜像的 S3 存储桶的名称。

3.4、LDAP 认证

LDAP 认证是一种基于 Lightweight Directory Access Protocol(LDAP) 的认证机制,它使用 LDAP 服务器中的用户信息来验证用户的身份。Docker Registry 支持 LDAP 认证,可以通过配置文件来启用。以下是一个示例配置文件:

version: 0.1
log:
  accesslog: /var/log/registry/access.log
  errorlog: /var/log/registry/error.log
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: 5000
  headers:
    X-Content-Type-Options: [nosniff]
auth:
  ldap:
    endpoint: ldap://ldap.example.com:389
    binddn: cn=admin,dc=example,dc=com
    bindpassword: password
    searchbase: ou=people,dc=example,dc=com
    searchfilter: (uid=%s)

在上面的配置文件中,auth.ldap.endpoint 参数表示 LDAP 服务器的地址和端口号,auth.ldap.binddnauth.ldap.bindpassword 参数表示 LDAP 管理员的身份信息,auth.ldap.searchbase 参数表示用户信息存储在 LDAP 服务器上的基础目录,auth.ldap.searchfilter 参数表示查询用户信息的过滤器。

以上是常用的几种 Docker Registry 的鉴权和认证机制,不同的认证机制在配置文件中的参数有所不同。可以根据实际需求选择相应的认证机制并进行配置。

转载声明

目录
相关文章
|
11天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
330 28
|
7天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
7天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
23 0
|
3月前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
673 0
【云原生】阿里云服务器部署 Docker Swarm集群
|
弹性计算 数据可视化 关系型数据库
使用阿里云部署基于docker的mysql云服务
本篇文章将介绍如何使用阿里云安装docker、部署mysql服务,并远程连接至远端mysql
683 1
使用阿里云部署基于docker的mysql云服务
|
弹性计算 Shell Docker
阿里云一键部署 Docker Datacenter
使用ROS模板在阿里云上一键部署Docker Datacenter
7827 0