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 官方文档的详细配置步骤。

相关推荐
mCell1 小时前
从删库到跑路?这50个Linux命令能保你职业生涯
linux·windows·macos
杰克逊的日记1 小时前
GPU运维常见问题处理
linux·运维·gpu
誰能久伴不乏2 小时前
Linux系统调用概述与实现:深入浅出的解析
linux·运维·服务器
程序员学习随笔3 小时前
Linux进程深度解析(2):fork/exec写时拷贝性能优化与exit资源回收机制(进程创建和销毁)
linux·运维·服务器
mmoyula3 小时前
【RK3568 PWM 子系统(SG90)驱动开发详解】
android·linux·驱动开发
-SGlow-3 小时前
MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
linux·运维·服务器·数据库·mysql
代码改变世界ctw3 小时前
Linux内核设计与实现 - 第14章 块I/O层
linux·运维·服务器
勇哥的编程江湖4 小时前
starrocks官网docker部署mysql无法连接
运维·docker·容器
水瓶_bxt5 小时前
Centos安装HAProxy搭建Mysql高可用集群负载均衡
mysql·centos·负载均衡
van叶~6 小时前
Linux网络-------1.socket编程基础---(TCP-socket)
linux·网络·tcp/ip