如何在Linux上搭建私有Docker Registry并开放公网访问

如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问

一、环境准备与基础部署

1.1 系统要求与依赖安装

建议使用CentOS 7/8或Ubuntu 20.04 LTS等稳定发行版,需满足:

  • 至少2核CPU、4GB内存
  • 100GB以上磁盘空间(根据镜像存储需求调整)
  • 开启防火墙端口(默认5000)

安装必要依赖:

  1. # CentOS系统
  2. sudo yum install -y docker curl wget
  3. # Ubuntu系统
  4. sudo apt update && sudo apt install -y docker.io curl wget

1.2 Docker服务配置

修改Docker守护进程配置以支持私有仓库:

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "insecure-registries": ["your-server-ip:5000"]
  5. }
  6. EOF

重启Docker服务:

  1. sudo systemctl restart docker
  2. sudo systemctl enable docker

二、基础Registry部署

2.1 快速启动Registry容器

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. registry:2.7.1

关键参数说明:

  • -p 5000:5000:端口映射
  • --restart=always:容器异常时自动重启
  • registry:2.7.1:指定稳定版本

2.2 验证基础功能

推送测试镜像:

  1. docker pull alpine:latest
  2. docker tag alpine:latest your-server-ip:5000/alpine:latest
  3. docker push your-server-ip:5000/alpine:latest

三、HTTPS安全配置(生产环境必备)

3.1 证书生成与配置

使用Let’s Encrypt免费证书:

  1. # 安装certbot
  2. sudo apt install -y certbot python3-certbot-nginx
  3. # 获取证书(需域名)
  4. sudo certbot certonly --nginx -d registry.yourdomain.com

3.2 配置HTTPS Registry

创建认证目录:

  1. sudo mkdir -p /etc/docker/registry/auth
  2. sudo mkdir -p /etc/docker/registry/certs

生成HTTP基础认证:

  1. sudo apt install -y apache2-utils
  2. sudo htpasswd -Bc /etc/docker/registry/auth/htpasswd username

启动HTTPS Registry:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /etc/docker/registry/auth:/auth \
  6. -v /etc/docker/registry/certs:/certs \
  7. -e REGISTRY_AUTH=htpasswd \
  8. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  9. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  10. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  11. -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  12. registry:2.7.1

四、公网访问实现方案

4.1 端口转发配置

方案一:云服务器安全组

  • 阿里云/腾讯云:在安全组规则中开放5000端口
  • AWS:修改Security Group入站规则

方案二:本地服务器NAT

  1. # iptables示例配置
  2. sudo iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 192.168.1.100:5000
  3. sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 5000 -j ACCEPT

4.2 反向代理配置(Nginx示例)

  1. server {
  2. listen 443 ssl;
  3. server_name registry.yourdomain.com;
  4. ssl_certificate /etc/letsencrypt/live/registry.yourdomain.com/fullchain.pem;
  5. ssl_certificate_key /etc/letsencrypt/live/registry.yourdomain.com/privkey.pem;
  6. location / {
  7. proxy_pass http://localhost:5000;
  8. proxy_set_header Host $host;
  9. proxy_set_header X-Real-IP $remote_addr;
  10. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11. }
  12. }

4.3 访问控制优化

配置IP白名单:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --name registry \
  4. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  5. -e REGISTRY_AUTH=htpasswd \
  6. -e REGISTRY_HTTP_SECRET=yoursecret \
  7. -e REGISTRY_ACCESS_CONTROL=[{"type":"ip","action":"allow","name":"trusted","ranges":["192.168.1.0/24"]}] \
  8. registry:2.7.1

五、高级功能配置

5.1 镜像清理机制

配置自动清理:

  1. docker run -d \
  2. -v /var/lib/registry:/var/lib/registry \
  3. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  4. registry:2.7.1

手动清理脚本示例:

  1. #!/bin/bash
  2. REGISTRY_DATA_DIR="/var/lib/registry"
  3. find $REGISTRY_DATA_DIR/docker/registry/v2/repositories -name "link" -exec rm {} \;

5.2 存储后端扩展

配置S3兼容存储

  1. docker run -d \
  2. -e REGISTRY_STORAGE=s3 \
  3. -e REGISTRY_STORAGE_S3_ACCESSKEY=your-access-key \
  4. -e REGISTRY_STORAGE_S3_SECRETKEY=your-secret-key \
  5. -e REGISTRY_STORAGE_S3_REGION=us-west-1 \
  6. -e REGISTRY_STORAGE_S3_BUCKET=your-bucket-name \
  7. -e REGISTRY_STORAGE_S3_ENCRYPT=true \
  8. registry:2.7.1

六、监控与维护

6.1 基础监控指标

  1. # 查看存储使用情况
  2. du -sh /var/lib/registry
  3. # 检查容器状态
  4. docker stats registry

6.2 日志分析配置

配置日志驱动:

  1. docker run -d \
  2. --log-driver=json-file \
  3. --log-opt max-size=10m \
  4. --log-opt max-file=3 \
  5. --name registry \
  6. registry:2.7.1

七、常见问题解决方案

7.1 推送镜像报错处理

错误示例

  1. The push refers to repository [your-server-ip:5000/alpine]
  2. Get https://your-server-ip:5000/v2/: http: server gave HTTP response to HTTPS client

解决方案

  1. 检查/etc/docker/daemon.json配置
  2. 确认是否使用HTTPS且证书有效
  3. 对于测试环境可临时使用insecure-registries

7.2 性能优化建议

  • 启用Registry缓存:-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io
  • 调整JVM参数(如使用Java版Registry):-e JAVA_OPTS="-Xmx2g -Xms2g"

八、完整部署脚本示例

  1. #!/bin/bash
  2. # 基础环境准备
  3. sudo apt update && sudo apt install -y docker.io certbot python3-certbot-nginx apache2-utils
  4. # 配置Docker守护进程
  5. sudo mkdir -p /etc/docker
  6. sudo tee /etc/docker/daemon.json <<-'EOF'
  7. {
  8. "insecure-registries": [],
  9. "registry-mirrors": ["https://registry.docker-cn.com"]
  10. }
  11. EOF
  12. sudo systemctl restart docker
  13. # 获取SSL证书(需提前配置域名DNS)
  14. sudo certbot certonly --nginx -d registry.yourdomain.com
  15. # 创建认证目录
  16. sudo mkdir -p /etc/docker/registry/{auth,certs}
  17. sudo htpasswd -Bc /etc/docker/registry/auth/htpasswd admin
  18. # 启动Registry容器
  19. docker run -d \
  20. -p 5000:5000 \
  21. --restart=always \
  22. --name registry \
  23. -v /etc/docker/registry/auth:/auth \
  24. -v /etc/docker/registry/certs:/certs \
  25. -e REGISTRY_AUTH=htpasswd \
  26. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  27. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  28. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  29. -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  30. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  31. registry:2.7.1
  32. # 配置Nginx反向代理
  33. sudo tee /etc/nginx/sites-available/registry <<-'EOF'
  34. server {
  35. listen 443 ssl;
  36. server_name registry.yourdomain.com;
  37. ssl_certificate /etc/letsencrypt/live/registry.yourdomain.com/fullchain.pem;
  38. ssl_certificate_key /etc/letsencrypt/live/registry.yourdomain.com/privkey.pem;
  39. location / {
  40. proxy_pass http://localhost:5000;
  41. proxy_set_header Host $host;
  42. proxy_set_header X-Real-IP $remote_addr;
  43. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  44. }
  45. }
  46. EOF
  47. sudo ln -s /etc/nginx/sites-available/registry /etc/nginx/sites-enabled/
  48. sudo nginx -t && sudo systemctl restart nginx
  49. echo "部署完成!访问地址:https://registry.yourdomain.com"

九、最佳实践建议

  1. 定期备份:设置cron任务备份/var/lib/registry目录
  2. 访问审计:通过Nginx日志分析镜像访问情况
  3. 版本控制:使用registry:2.7.1等明确版本号而非latest
  4. 资源监控:配置Prometheus监控Registry容器指标

通过以上步骤,您可以在Linux服务器上构建一个安全、可靠且支持公网访问的私有Docker Registry,满足企业级镜像管理需求。实际部署时建议先在测试环境验证所有功能,再迁移到生产环境。