简介
Docker Registry 是存储和分发 Docker 镜像的仓库。
它就像一个镜像的存储中心,有公共和私有之分。公共的如 Docker Hub,有大量官方和开发者共享的镜像。私有 Registry 则用于企业内部等场景,保证数据安全和隐私。
其与Harbor相比有很大的不同,Registry 是 Docker 官方提供的镜像仓库服务,提供了基本的镜像存储、分发和管理功能,但缺乏一些企业级特性。Harbor 由 VMware 公司开源的企业级 Docker Registry 项目,它在 Docker Registry 的基础上增加了管理 UI、基于角色的访问控制(RBAC)、AD/LDAP 集成、审计日志等企业级特性。
特点
存储镜像:Docker Registry 可以存储大量的 Docker 镜像,包括官方提供的和用户自定义构建的。
管理镜像:Registry 提供了丰富的管理功能,如镜像的上传、下载、删除和查询等。
分发镜像:支持镜像的分发,用户可以从 Registry 中拉取所需的镜像,以便在本地或远程服务器上运行 Docker 容器。
认证能力:Registry 提供用户注册、登录和登出的能力,确保镜像的安全性和访问控制。
搭建使用教程
我们可以使用docker命令快速启动 registry 服务:
docker run -d -p 5000:5000 --restart=always --name registry \
-v /opt/registry:/var/lib/registry registry:2
部署完成后,我们就可以将自己的镜像推送到本地的仓库中,例如我的服务器IP为:192.168.31.5
,那么可以参考下方的命令进行推送:
# 修改tag
docker tag nginx:latest 192.168.31.5:5000/nginx:latest
# 推送镜像
docker push 192.168.31.5:5000/nginx:latest
# 拉取镜像
docker pull 192.168.31.5:5000/nginx:latest
其也有配套的图形化服务,可以通过下方的docker命令进行部署:
docker run -d -p 5001:8080 --name registry-browser \
-e SECRET_KEY_BASE="123456" \
# 这里的 192.168.31.5 还成自己的内网ip
-e DOCKER_REGISTRY_URL=http://192.168.31.5:5000/v2 \
klausmeyer/docker-registry-browser:latest
然后通过访问5001
端口,进入到本地仓库的管理界面:
这里仓库与ui界面的部署还是推荐使用docker compose来进行部署:
services:
registry:
image: registry:2
container_name: registry
ports:
- "5000:5000"
volumes:
- /opt/registry:/var/lib/registry
restart: always
registry-browser:
image: klausmeyer/docker-registry-browser:latest
container_name: registry-browser
environment:
- SECRET_KEY_BASE=123456
- DOCKER_REGISTRY_URL=http://registry:5000/v2
ports:
- "5001:8080"
depends_on:
- registry
添加认证鉴权
上述的部署方式,是不包含权限认证的,即任何人都可以访问和拉取镜像。如若你的服务部署在公网的服务器上,那么添加一个账户鉴权是更加安全的方式,这样用户就需要通过docker login
去进行登录才能拉取镜像。
创建htpasswd
使用 htpasswd
命令行工具创建用户凭据。这个工具通常包含在 Apache HTTP 服务器软件中,但可以通过包管理器安装:
# 使用apt
sudo apt-get install apache2-utils
# 或者
sudo yum install apache2-utils
# 创建存放目录
sudo mkdir -p /etc/docker/registry/
# 创建凭据
htpasswd -Bbn username password > /etc/docker/registry/htpasswd
将 username
和 password
替换为你想要创建的用户名和密码。
配置 Registry
现在需要配置 Registry 以使用 token 鉴权。这通常涉及到创建一个配置文件,这个配置文件定义了 Docker Registry 的基本设置,包括日志记录、存储、HTTP 服务和认证。
vim /etc/docker/registry/config.yml
创建一个名为 config.yml
的配置文件,内容如下:
version: 0.1
log:
level: debug
accesslog:
disabled: true
errorlog:
disabled: true
storage:
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
auth:
htpasswd:
realm: registry
path: /auth/htpasswd
然后我们需要修改之前的 docker-compose.yaml 文件:
services:
registry:
image: registry:2
container_name: registry
ports:
- "5000:5000"
volumes:
- /opt/registry:/var/lib/registry
- /etc/docker/registry/htpasswd:/auth/htpasswd
- /etc/docker/registry/config.yml:/etc/docker/registry/config.yml
restart: always
registry-browser:
image: klausmeyer/docker-registry-browser:latest
container_name: registry-browser
environment:
- SECRET_KEY_BASE=123456
- DOCKER_REGISTRY_URL=http://registry:5000/v2
ports:
- "5001:8080"
depends_on:
- registry
restart: always
再去访问ui界面时,就需要我们输入用户名密码进行鉴权了:
通过本地拉取镜像同样也是需要鉴权:
特别注意
Docker 拉取镜像默认需要给 Registry 配置 SSL/TLS,如果不想配置,我们可以在需要拉取镜像的 Docker主机上配置一下,编辑/etc/docker/daemon.json
添加下面的内容:
{
"insecure-registries" : ["registry服务的IP:5000"]
}
然后重启docker就可以正常的拉取推送镜像了。