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

Posted MCNU云原生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Registry部署镜像私有仓库及鉴权认证相关的知识,希望对你有一定的参考价值。

文章目录

一、Docker Registry是什么?

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

为什么需要使用Docker Registry?

  1. 需要对镜像进行严格统一管理;

  2. 需要拥有镜像的分发渠道;

  3. 并且将镜像管理和分发集成到内部统一开发流程中。

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

二、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的鉴权和认证机制,不同的认证机制在配置文件中的参数有所不同。可以根据实际需求选择相应的认证机制并进行配置。

docker仓库使用+harbor私有仓库部署

前言:因为 官方仓库 在国外的原因,我们不容易拉取镜像,可以我们可以使用国内的 Daocloud 镜像仓库和开通 阿里云仓库 或者 Harbor 如果是企业内部也可以使用自己搭建的私有仓库

docker-registry使用

介绍:Registry用于保存docker镜像,包括镜像的层次结构和元数据

#第一步:pull官方镜像
docker pull registry

#第二步:启动容器
docker run  -d -p 5000:5000 -d -p 5000:5000 --restart=always  --name=registry -v /opt/myregistry:/var/lib/registry registry

#第三步:添加/etc/docker/daemon.json
cat /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://f1361db2.m.daocloud.io",
        "https://registry.docker-cn.com"
    ],
    "insecure-registries": ["10.0.0.12:5000"]
}

systemctl restart docker

#第四部:上传镜像
打标签: docker tag alpine:latest 10.0.0.12:5000/alpine:latest
上传:      docker image push 10.0.0.12:5000/alpine:latest

登录:http://10.0.0.12:5000/v2/_catalog

官方仓库使用

在官方仓库免费注册一个docker账号

#登录和退出
docker login
docker logout

#查找镜像
docker  search alpine
#拉取
docker pull alpine

#推送镜像
docker tag alpine:latest username/alpine:latest
docker push username/alpine:latest
docker search username/alpine

搭建企业级镜像仓库

GitHub项目地址:https://github.com/goharbor/harbor

Harbor介绍

VMware 在中国的团体开发的

Harbor,是一个英文单词,意思是港湾,Harbor真是一个用于存储Docker镜像的企业级Registry服务。Registry是Docker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。去也可以根据自己的需求,使用Dockerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。

技术图片

Harbor核心组件解释

组件 说明 实现
Proxy 用于转发用户的请求到registry/ui/token service的反向代理 nginx:使用nginx官方镜像进行配置
Registry 镜像的push/pull命令实施功能 registry:使用registry官方镜像
Database 保存项目/角色/复制策略等信息到数据库中 harbor-db:Mariadb的官方镜像用于保存harbor的数据库信息
Core Service:UI/token/webhook 用户进行镜像操作的界面实现,通过webhook的机制保证镜像状态的变化harbor能够即使了解以便进行日志更新等操作,而项目用户角色则通过token的进行镜像的push/pull等操作 harbor-ui等
job service 镜像复制,可以在harbor实例之间进行镜像的复制或者同步等操作 harbor-jobservice
Log collector 负责收集各个镜像的日志信息进行统一管理 harbor-log:缺省安装下日志的保存场所为/var/log/harbor

harbor安装部署

注:这里我们使用1.8.0版本安装,文档下载是1.10.2版本

1. 配置环境

#安装docker
yum install docker -y
systemctl start docker
systemctl enable docker
#安装docker-compose
yum install docker-compose -y

#下载harbor
wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz
#解压
tar xf harbor-offline-installer-v1.8.0.tgz
cd harbor/

#修改登录密码和主机名
vim harbor.yaml
hostname: 10.0.0.12
harbor_admin_password: 123456

./install.sh

用户:admin 密码:123456

技术图片

上传镜像

#添加/etc/docker/daemon.json
cat /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://f1361db2.m.daocloud.io",
        "https://registry.docker-cn.com"
    ],
    "insecure-registries": ["10.0.0.11"]
}

systemctl restart docker

#上传镜像的格式,先打标签在上传
docker tag SOURCE_IMAGE[:TAG] 10.0.0.11/library/IMAGE[:TAG]
docker push 10.0.0.11/library/IMAGE[:TAG]

#登录仓库
docker login  10.0.0.12
<用户名和密码>
#打标签
docker tag alpine:latest 10.0.0.11/library/alpine:latest
#上传镜像
docker push  10.0.0.11/library/alpine:latest

技术图片

以上是关于Docker Registry部署镜像私有仓库及鉴权认证的主要内容,如果未能解决你的问题,请参考以下文章

Docker 部署Registry私有仓库+Harbor私有仓库

docker仓库使用+harbor私有仓库部署

Docker部署私有仓库(registry&Harbor)

可能是最详细的部署:Docker Registry企业级私有镜像仓库Harbor管理WEB UI

私有镜像仓库Harbor基础介绍与部署

搭建docker私有镜像仓库