搭建一个轻量级的 Docker 本地镜像仓库

文摘   2024-12-03 10:40   安徽  

简介

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

usernamepassword 替换为你想要创建的用户名和密码。

配置 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就可以正常的拉取推送镜像了。


欢迎大家关注我的公众号,将会为大家推荐更优质的内容!

青檬小栈
科长技术小栈,分享各种技术文章和教程集合。欢迎大家的关注!
 最新文章