从单机到私有仓库:在CentOS7上用Docker Compose搭建带Web界面的镜像仓库全记录
从单机到私有仓库:在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流程中从私有仓库拉取指定版本的镜像进行部署。
更多推荐
所有评论(0)