从单机到私有仓库:在CentOS7上用Docker Compose搭建带Web界面的镜像仓库全记录

在当今的云原生时代,Docker已经成为应用开发和部署的标准工具之一。对于开发团队而言,拥有一个私有的Docker镜像仓库不仅能提高构建效率,还能更好地管理内部镜像资产。本文将带你从零开始,在CentOS7系统上使用Docker Compose部署一个功能完整的私有Docker Registry,并为其添加直观的Web管理界面。

1. 环境准备与Docker安装

在开始搭建私有仓库之前,我们需要确保基础环境准备就绪。CentOS7作为一款稳定可靠的Linux发行版,是运行Docker服务的理想选择。

首先检查系统内核版本是否符合要求:

uname -r

输出应显示内核版本不低于3.10。

如果系统中存在旧版Docker,建议先进行清理:

sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

安装必要的依赖工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

配置阿里云Docker CE镜像源以加速安装:

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast

安装Docker CE社区版:

sudo yum install -y docker-ce docker-ce-cli containerd.io

配置Docker服务开机自启并立即启动:

sudo systemctl enable docker
sudo systemctl start docker

验证Docker安装是否成功:

docker --version

正常应输出类似"Docker version 20.10.12, build e91ed57"的版本信息。

2. Docker Compose安装与配置

Docker Compose是定义和运行多容器Docker应用的工具,我们将使用它来编排我们的私有仓库服务。

下载Docker Compose二进制文件:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

授予执行权限:

sudo chmod +x /usr/local/bin/docker-compose

创建符号链接以便全局调用:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

验证安装:

docker-compose --version

应输出类似"docker-compose version 1.29.2"的版本信息。

为提高命令行使用体验,可以安装bash补全功能:

sudo curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

3. 私有仓库架构设计与部署

我们将部署一个包含两个核心组件的私有仓库系统:

  • Registry: Docker官方的镜像存储服务
  • UI: 基于joxit/docker-registry-ui的Web管理界面

创建项目目录并编写docker-compose.yml文件:

mkdir docker-registry && cd docker-registry
touch docker-compose.yml

编辑docker-compose.yml文件,内容如下:

version: '3.8'

services:
  registry:
    image: registry:2
    container_name: registry
    restart: always
    ports:
      - "5000:5000"
    volumes:
      - ./registry-data:/var/lib/registry
    environment:
      REGISTRY_STORAGE_DELETE_ENABLED: "true"

  ui:
    image: joxit/docker-registry-ui:static
    container_name: registry-ui
    restart: always
    ports:
      - "8080:80"
    environment:
      - REGISTRY_TITLE=My Private Registry
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

这个配置实现了:

  • Registry服务监听5000端口,数据持久化到本地registry-data目录
  • UI服务通过8080端口提供Web界面
  • 启用了镜像删除功能(默认禁用)

启动服务:

docker-compose up -d

验证服务运行状态:

docker-compose ps

应显示两个容器都处于"Up"状态。

4. 系统配置与安全设置

私有仓库部署完成后,还需要进行一些必要的配置才能正常使用。

4.1 配置Docker客户端信任私有仓库

由于我们使用的是HTTP协议而非HTTPS,需要配置Docker客户端信任我们的私有仓库地址。

编辑或创建daemon.json文件:

sudo vi /etc/docker/daemon.json

添加以下内容(假设服务器IP为192.168.1.100):

{
  "insecure-registries": ["192.168.1.100:5000"]
}

重新加载配置并重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

4.2 防火墙配置

如果系统启用了防火墙,需要开放相关端口:

sudo firewall-cmd --permanent --add-port=5000/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

4.3 测试私有仓库

现在我们可以测试私有仓库是否正常工作。

拉取一个测试镜像:

docker pull alpine

为镜像打上私有仓库标签:

docker tag alpine 192.168.1.100:5000/my-alpine

推送镜像到私有仓库:

docker push 192.168.1.100:5000/my-alpine

通过Web界面验证: 访问http://192.168.1.100:8080,应该能看到刚刚推送的my-alpine镜像。

也可以通过API直接查询:

curl http://192.168.1.100:5000/v2/_catalog

应返回类似{"repositories":["my-alpine"]}的JSON响应。

5. 高级配置与优化

基础功能部署完成后,我们可以进一步优化私有仓库的配置。

5.1 启用身份验证

为增强安全性,可以为私有仓库添加基本的HTTP认证。

创建认证密码文件:

mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn admin securepassword > auth/htpasswd

修改docker-compose.yml,在registry服务下添加:

environment:
  REGISTRY_AUTH: htpasswd
  REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
volumes:
  - ./auth:/auth

更新服务:

docker-compose down && docker-compose up -d

现在操作仓库需要先登录:

docker login 192.168.1.100:5000

5.2 配置存储后端

默认使用本地文件系统存储,对于生产环境可以考虑其他存储后端。

例如配置使用S3存储:

environment:
  REGISTRY_STORAGE: s3
  REGISTRY_STORAGE_S3_ACCESSKEY: your-access-key
  REGISTRY_STORAGE_S3_SECRETKEY: your-secret-key
  REGISTRY_STORAGE_S3_REGION: us-east-1
  REGISTRY_STORAGE_S3_BUCKET: my-docker-registry
  REGISTRY_STORAGE_S3_ROOTDIRECTORY: /registry

5.3 日志与监控

为更好地了解仓库运行状况,可以配置日志和监控。

启用JSON格式日志:

services:
  registry:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

集成Prometheus监控:

environment:
  REGISTRY_HTTP_DEBUG_ADDR: :5001
  REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED: "true"

6. 日常维护与管理

私有仓库投入运行后,需要定期进行维护以确保稳定运行。

6.1 垃圾回收

随着时间推移,仓库中会积累无用的镜像层数据,需要定期清理。

执行垃圾回收:

docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml

可以设置为定期任务:

0 3 * * * root docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml > /dev/null 2>&1

6.2 数据备份

为确保数据安全,应定期备份registry-data目录:

tar czvf registry-backup-$(date +%Y%m%d).tar.gz ./registry-data

6.3 版本升级

升级Registry或UI服务版本:

docker-compose pull
docker-compose up -d

6.4 常见问题排查

问题1: 推送镜像时报错"http: server gave HTTP response to HTTPS client"

解决方案: 确保已正确配置insecure-registries并重启Docker服务

问题2: Web界面无法显示镜像

解决方案: 检查REGISTRY_URL环境变量是否正确指向registry服务

问题3: 存储空间不足

解决方案: 执行垃圾回收或考虑使用外部存储后端

7. 实际应用场景

私有Docker仓库在多种场景下都能发挥重要作用:

场景1: 企业内部CI/CD流水线

  • 存储构建的中间镜像
  • 加速后续构建过程
  • 控制镜像分发

场景2: 离线环境部署

  • 在内网环境中缓存公共镜像
  • 避免每次部署都需要从外网拉取

场景3: 定制镜像分发

  • 分发经过安全扫描的镜像
  • 管理专有软件的镜像版本

场景4: 多团队协作

  • 共享基础镜像
  • 管理团队间的依赖关系

在实际项目中,我们通常会结合这些场景,构建完整的镜像生命周期管理流程。例如,在CI流程中自动构建并推送镜像到私有仓库,然后在CD流程中从私有仓库拉取指定版本的镜像进行部署。

更多推荐