CentOS 搭建 Docker 私有镜像仓库

CentOS 搭建 Docker 私有镜像仓库

搭建 Docker 私有镜像仓库能为团队提供高效、安全的镜像管理方案。下面将详细介绍每个步骤的操作细节,其中命令部分均用代码块展示。

一、环境准备

要搭建 Docker 私有镜像仓库,首先得确保服务器环境符合要求,这是后续操作顺利进行的基础。

1. 服务器要求

建议使用 CentOS 7 或 8 系统,内存至少 2GB,存储空间 20GB 以上,这样能保证仓库在处理多个镜像时运行流畅。

2. 安装 Docker Engine

Docker 是搭建私有仓库的核心依赖,不同 CentOS 版本安装命令略有差异。

  • CentOS 7 安装 Docker:

    yum install -y docker

  • CentOS 8 安装 Docker:

    dnf install -y docker

安装完成后,需要启动 Docker 服务并设置开机自启,确保服务器重启后 Docker 能自动运行。

复制代码
systemctl start docker
systemctl enable docker

3. 开放必要端口

Docker 私有仓库默认使用 5000 端口,需在防火墙中开放该端口,否则其他客户端无法访问仓库。

复制代码
firewall-cmd --zone=public --add-port=5000/tcp --permanent
firewall-cmd --reload

执行上述命令后,5000 端口将被永久开放,防火墙配置也会立即生效。

二、搭建 Docker 私有镜像仓库

准备工作完成后,就可以开始搭建私有仓库了,主要包括拉取仓库镜像和启动仓库容器两个步骤。

1. 拉取 registry 镜像

Docker 官方提供的 registry 镜像专门用于搭建私有仓库,使用以下命令拉取:

复制代码
docker pull registry

拉取过程中,Docker 会从官方仓库下载镜像文件。拉取完成后,用docker images命令可查看是否成功,若列表中出现 registry 镜像信息,说明拉取成功。

复制代码
docker images

2. 启动仓库容器

启动容器时,需要进行端口映射、命名容器以及数据挂载等配置,确保仓库能正常运行且数据可持久化。

复制代码
docker run -d -p 5000:5000 --name myregistry -v /opt/registry:/var/lib/registry registry
  • -d:让容器在后台运行,不占用当前终端。

  • -p 5000:5000:将容器的 5000 端口映射到宿主机的 5000 端口,这样外部才能通过宿主机端口访问仓库。

  • --name myregistry:给容器命名为 myregistry,方便后续管理和操作。

  • -v /opt/registry:/var/lib/registry:把宿主机的/opt/registry目录挂载到容器的/var/lib/registry目录,容器内的镜像数据会存储到宿主机的该目录,即使容器被删除,数据也不会丢失。

启动后,用docker ps命令查看容器是否正常运行,若状态为 "Up",则表示仓库容器启动成功。

复制代码
docker ps

三、配置仓库访问权限

为了保证私有仓库的安全性,需要配置访问权限,只有授权用户才能进行推送和拉取操作。

1. 安装 httpd-tools 工具

该工具用于生成存储用户名和密码的文件,是实现身份认证的关键。

  • CentOS 7 安装:

    yum install -y httpd-tools

  • CentOS 8 安装:

    dnf install -y httpd-tools

2. 创建认证信息存储目录

专门创建一个目录来存放认证文件,便于管理。

复制代码
mkdir -p /opt/registry/auth

-p选项确保如果目录不存在,会自动创建父目录。

3. 生成密码文件

通过 htpasswd 命令生成包含用户信息的密码文件。

  • 首次创建用户:

    htpasswd -Bc /opt/registry/auth/htpasswd username

这里的username是你要创建的用户名,执行命令后会提示输入密码,输入两次确认后,就会在/opt/registry/auth目录下生成htpasswd文件。-B表示使用 bcrypt 算法加密密码,更安全;-c表示创建新文件。

  • 添加其他用户:

如果需要添加更多用户,不需要-c选项,否则会覆盖现有文件。

复制代码
htpasswd -B /opt/registry/auth/htpasswd another_username

4. 重启仓库容器应用认证配置

先停止并删除之前的容器,再用新的配置启动。

复制代码
docker stop myregistry
docker rm myregistry

然后执行以下命令重新启动容器,加载认证配置:

复制代码
docker run -d -p 5000:5000 --name myregistry -v /opt/registry:/var/lib/registry -v /opt/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry

其中,-v /opt/registry/auth:/auth将存放认证文件的目录挂载到容器内;-e设置的环境变量指定了认证方式、认证领域和密码文件路径。

四、配置客户端访问仓库

其他用户的客户端需要进行相应配置才能连接到私有仓库。

1. 非 HTTPS 访问配置

如果仓库未配置 HTTPS,客户端需要允许非 HTTPS 访问。

编辑客户端的/etc/docker/daemon.json文件(不存在则创建):

复制代码
vi /etc/docker/daemon.json

在文件中添加仓库地址:

复制代码
{"insecure-registries":["仓库服务器IP:5000"]}

保存退出后,重启 Docker 服务使配置生效:

复制代码
systemctl restart docker

2. 登录仓库

配置完成后,用户需要登录才能进行操作。

复制代码
docker login 仓库服务器IP:5000

输入正确的用户名和密码后,显示 "Login Succeeded" 则登录成功。

五、测试私有仓库

完成上述配置后,需要测试仓库是否能正常接收和提供镜像。

1. 推送镜像到仓库

先在客户端对本地镜像进行标记,使其符合私有仓库的命名规范。

复制代码
docker tag nginx:latest 仓库服务器IP:5000/mynginx:v1

这里以 nginx 镜像为例,仓库服务器IP:5000是私有仓库地址,mynginx:v1是自定义的镜像名和标签。

然后推送标记后的镜像到仓库:

复制代码
docker push 仓库服务器IP:5000/mynginx:v1

推送过程中会显示进度,完成后提示推送成功。

2. 从仓库拉取镜像

在另一台已配置好的客户端上,拉取刚才推送的镜像,测试仓库是否能正常提供镜像。

复制代码
docker pull 仓库服务器IP:5000/mynginx:v1

若拉取成功,说明仓库工作正常。

六、仓库维护与扩展

对仓库进行定期维护和合理扩展,能保证其长期稳定运行。

1. 查看仓库镜像信息

通过 HTTP 请求可以查看仓库中的镜像列表和标签信息。

2. 清理冗余数据

随着镜像的频繁推送和删除,仓库会产生无用的冗余数据,需要定期清理。

先进入仓库容器:

复制代码
docker exec -it myregistry sh

然后执行清理命令:

复制代码
registry garbage-collect /etc/docker/registry/config.yml

该命令会删除未被引用的镜像数据,释放存储空间。

3. 配置 HTTPS 访问(可选)

为了提高安全性,可配置 HTTPS 访问。需要准备 SSL 证书,然后在启动仓库容器时添加证书相关的挂载和环境变量,具体可参考 Docker 官方文档的详细配置步骤。

相关推荐
JJJennie77712 分钟前
MAI Gateway技术揭秘:大模型网关能做什么?从原理到落地
linux·服务器·网络·ai网关
AugustSkys2 小时前
从 Docker 到 Containerd:Kubernetes 时代容器运行时完全指南
docker·容器·kubernetes·containerd
风哥2号2 小时前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
wuminyu6 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
新时代牛马6 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
猿与禅6 小时前
Linux(Ubuntu)入门到实战:系统管理、常用命令与权限体系完整指南
linux·ubuntu·apt·进程管理·系统运维·用户权限·vi/vim
前端世界6 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮6 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
莫陌尛.7 小时前
Docker MySQL 删表卡死、执行超时(MDL锁阻塞)问题复盘与根治方案
mysql·docker·容器
星辰徐哥11 小时前
本地视频预览别只自己看:把Remotion动效项目发给客户远程验收
docker·ai·node.js·html·音视频·react·remotion