如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
一、环境准备与前置条件
在开始部署前,需确保Linux服务器满足以下条件:
- 系统要求:推荐使用CentOS 7/8或Ubuntu 20.04 LTS,需安装Docker CE(版本≥19.03)
- 网络配置:
- 固定公网IP或已配置DDNS的动态IP
- 开放TCP 5000端口(默认Registry端口)或自定义端口
- 域名准备(可选但推荐):
- 注册域名并完成ICP备案(国内服务器需备案)
- 配置DNS解析指向服务器公网IP
二、基础Registry部署
1. 使用Docker运行官方Registry
docker run -d \--name registry \-p 5000:5000 \--restart=always \-v /data/registry:/var/lib/registry \registry:2
参数说明:
-v:将镜像数据持久化到宿主机目录--restart:设置容器异常退出时自动重启registry:2:使用官方最新稳定版镜像
2. 验证基础服务
curl http://localhost:5000/v2/_catalog# 应返回:{"repositories":[]}
三、安全增强配置
1. 启用HTTPS加密
使用Let’s Encrypt免费证书:
# 安装Certbotsudo apt install certbot python3-certbot-nginx # Ubuntusudo yum install certbot python3-certbot-nginx # CentOS# 获取证书(需提前配置好域名解析)sudo certbot --nginx -d registry.yourdomain.com
2. 配置Nginx反向代理
编辑/etc/nginx/conf.d/registry.conf:
server {listen 443 ssl;server_name registry.yourdomain.com;ssl_certificate /etc/letsencrypt/live/registry.yourdomain.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/registry.yourdomain.com/privkey.pem;location / {proxy_pass http://localhost:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
重启Nginx服务:
sudo systemctl restart nginx
3. 访问控制配置
创建/etc/docker/registry/config.yml:
version: 0.1log:fields:service: registrystorage:cache:blobdescriptor: inmemoryfilesystem:rootdirectory: /var/lib/registryhttp:addr: :5000headers:X-Content-Type-Options: [nosniff]auth:htpasswd:realm: Basic Realmpath: /etc/docker/registry/htpasswd
生成密码文件:
sudo apt install apache2-utils # Ubuntusudo yum install httpd-tools # CentOSsudo htpasswd -Bc /etc/docker/registry/htpasswd admin# 输入密码后添加其他用户(省略-c参数)
四、公网访问优化方案
1. 端口映射优化
建议使用非标准端口(如8443)减少扫描攻击:
docker run -d \--name registry \-p 8443:5000 \-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \-v /data/registry:/var/lib/registry \-v /etc/docker/registry:/etc/docker/registry \registry:2
2. 防火墙配置
# Ubuntusudo ufw allow 8443/tcp# CentOSsudo firewall-cmd --permanent --add-port=8443/tcpsudo firewall-cmd --reload
3. 速度优化策略
- 启用镜像缓存:
# 在config.yml中添加proxy:remoteurl: https://registry-1.docker.io
- 配置CDN加速(需商业支持)
五、客户端配置与使用
1. 配置Docker信任仓库
编辑/etc/docker/daemon.json:
{"insecure-registries": [],"registry-mirrors": [],"allow-nondistributable-artifacts": ["registry.yourdomain.com"]}
重启Docker服务:
sudo systemctl restart docker
2. 镜像推送测试
# 标记镜像docker tag ubuntu:latest registry.yourdomain.com/myubuntu:latest# 登录仓库docker login registry.yourdomain.com# 输入用户名密码# 推送镜像docker push registry.yourdomain.com/myubuntu:latest
六、运维监控方案
1. 日志监控
# 查看实时日志docker logs -f registry# 设置日志轮转编辑/etc/logrotate.d/registry:/var/log/docker/registry.log {dailyrotate 7compressmissingoknotifemptycopytruncate}
2. 存储监控
# 查看存储使用du -sh /data/registry# 设置自动清理(添加到cron)0 3 * * * docker exec registry registry garbage-collect /etc/docker/registry/config.yml
七、高可用架构建议
对于生产环境,推荐采用:
- 主从复制:使用
registry:2的mirror配置 - 负载均衡:前端配置HAProxy或Nginx负载均衡器
- 分布式存储:对接S3兼容对象存储(如MinIO)
八、常见问题解决方案
-
证书错误:
- 确保系统时间正确
- 检查证书链是否完整
- 使用
openssl s_client -connect registry.yourdomain.com:443测试
-
权限拒绝:
- 检查存储目录权限:
chown -R 1000:1000 /data/registry - 验证SELinux状态:
setenforce 0(测试用)
- 检查存储目录权限:
-
推送超时:
- 调整客户端超时设置:
export DOCKER_CLIENT_TIMEOUT=300export COMPOSE_HTTP_TIMEOUT=300
- 调整客户端超时设置:
九、升级与维护流程
-
版本升级:
docker pull registry:2.8docker stop registrydocker rm registry# 使用新版本启动(保持相同配置)
-
数据迁移:
# 停止服务后rsync -avz /old/registry/ /new/location/# 更新卷映射后重启
通过以上完整配置,您将获得一个支持HTTPS加密、基于用户名密码认证、具备基础监控能力的企业级Docker Registry服务。实际部署时建议先在测试环境验证所有功能,生产环境应考虑添加双因素认证和审计日志等高级安全特性。