一、Docker Registry 是什么?
Docker Registry
是一个无状态、高度可扩展的服务器端应用程序,用于存储和分发 Docker
镜像。Docker Registry
是基于 Apache
许可证开源的,它是目前应用最广泛的镜像仓库管理程序,所有的源码在 github
上开源,如果感兴趣的话可以 clone
相关的代码进行深层次的学习。
为什么需要使用 Docker Registry?
- 需要对镜像进行严格统一管理;
- 需要拥有镜像的分发渠道;
- 并且将镜像管理和分发集成到内部统一开发流程中。
例如搭建内部 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.service
和 auth.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.accesskey
和 auth.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.binddn
和 auth.ldap.bindpassword
参数表示 LDAP
管理员的身份信息,auth.ldap.searchbase
参数表示用户信息存储在 LDAP
服务器上的基础目录,auth.ldap.searchfilter
参数表示查询用户信息的过滤器。
以上是常用的几种 Docker Registry
的鉴权和认证机制,不同的认证机制在配置文件中的参数有所不同。可以根据实际需求选择相应的认证机制并进行配置。
转载声明