如何在Linux上实现私有Docker镜像仓库的公网访问?

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

一、环境准备与前置条件

在开始部署前,需确保Linux服务器满足以下条件:

  1. 系统要求:推荐使用CentOS 7/8或Ubuntu 20.04 LTS,需安装Docker CE(版本≥19.03)
  2. 网络配置
    • 固定公网IP或已配置DDNS的动态IP
    • 开放TCP 5000端口(默认Registry端口)或自定义端口
  3. 域名准备(可选但推荐):
    • 注册域名并完成ICP备案(国内服务器需备案)
    • 配置DNS解析指向服务器公网IP

二、基础Registry部署

1. 使用Docker运行官方Registry

  1. docker run -d \
  2. --name registry \
  3. -p 5000:5000 \
  4. --restart=always \
  5. -v /data/registry:/var/lib/registry \
  6. registry:2

参数说明:

  • -v:将镜像数据持久化到宿主机目录
  • --restart:设置容器异常退出时自动重启
  • registry:2:使用官方最新稳定版镜像

2. 验证基础服务

  1. curl http://localhost:5000/v2/_catalog
  2. # 应返回:{"repositories":[]}

三、安全增强配置

1. 启用HTTPS加密

使用Let’s Encrypt免费证书:

  1. # 安装Certbot
  2. sudo apt install certbot python3-certbot-nginx # Ubuntu
  3. sudo yum install certbot python3-certbot-nginx # CentOS
  4. # 获取证书(需提前配置好域名解析)
  5. sudo certbot --nginx -d registry.yourdomain.com

2. 配置Nginx反向代理

编辑/etc/nginx/conf.d/registry.conf

  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. }
  11. }

重启Nginx服务:

  1. sudo systemctl restart nginx

3. 访问控制配置

创建/etc/docker/registry/config.yml

  1. version: 0.1
  2. log:
  3. fields:
  4. service: registry
  5. storage:
  6. cache:
  7. blobdescriptor: inmemory
  8. filesystem:
  9. rootdirectory: /var/lib/registry
  10. http:
  11. addr: :5000
  12. headers:
  13. X-Content-Type-Options: [nosniff]
  14. auth:
  15. htpasswd:
  16. realm: Basic Realm
  17. path: /etc/docker/registry/htpasswd

生成密码文件:

  1. sudo apt install apache2-utils # Ubuntu
  2. sudo yum install httpd-tools # CentOS
  3. sudo htpasswd -Bc /etc/docker/registry/htpasswd admin
  4. # 输入密码后添加其他用户(省略-c参数)

四、公网访问优化方案

1. 端口映射优化

建议使用非标准端口(如8443)减少扫描攻击:

  1. docker run -d \
  2. --name registry \
  3. -p 8443:5000 \
  4. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  5. -v /data/registry:/var/lib/registry \
  6. -v /etc/docker/registry:/etc/docker/registry \
  7. registry:2

2. 防火墙配置

  1. # Ubuntu
  2. sudo ufw allow 8443/tcp
  3. # CentOS
  4. sudo firewall-cmd --permanent --add-port=8443/tcp
  5. sudo firewall-cmd --reload

3. 速度优化策略

  • 启用镜像缓存:
    1. # 在config.yml中添加
    2. proxy:
    3. remoteurl: https://registry-1.docker.io
  • 配置CDN加速(需商业支持)

五、客户端配置与使用

1. 配置Docker信任仓库

编辑/etc/docker/daemon.json

  1. {
  2. "insecure-registries": [],
  3. "registry-mirrors": [],
  4. "allow-nondistributable-artifacts": ["registry.yourdomain.com"]
  5. }

重启Docker服务:

  1. sudo systemctl restart docker

2. 镜像推送测试

  1. # 标记镜像
  2. docker tag ubuntu:latest registry.yourdomain.com/myubuntu:latest
  3. # 登录仓库
  4. docker login registry.yourdomain.com
  5. # 输入用户名密码
  6. # 推送镜像
  7. docker push registry.yourdomain.com/myubuntu:latest

六、运维监控方案

1. 日志监控

  1. # 查看实时日志
  2. docker logs -f registry
  3. # 设置日志轮转
  4. 编辑/etc/logrotate.d/registry
  5. /var/log/docker/registry.log {
  6. daily
  7. rotate 7
  8. compress
  9. missingok
  10. notifempty
  11. copytruncate
  12. }

2. 存储监控

  1. # 查看存储使用
  2. du -sh /data/registry
  3. # 设置自动清理(添加到cron)
  4. 0 3 * * * docker exec registry registry garbage-collect /etc/docker/registry/config.yml

七、高可用架构建议

对于生产环境,推荐采用:

  1. 主从复制:使用registry:2mirror配置
  2. 负载均衡:前端配置HAProxy或Nginx负载均衡器
  3. 分布式存储:对接S3兼容对象存储(如MinIO)

八、常见问题解决方案

  1. 证书错误

    • 确保系统时间正确
    • 检查证书链是否完整
    • 使用openssl s_client -connect registry.yourdomain.com:443测试
  2. 权限拒绝

    • 检查存储目录权限:chown -R 1000:1000 /data/registry
    • 验证SELinux状态:setenforce 0(测试用)
  3. 推送超时

    • 调整客户端超时设置:
      1. export DOCKER_CLIENT_TIMEOUT=300
      2. export COMPOSE_HTTP_TIMEOUT=300

九、升级与维护流程

  1. 版本升级

    1. docker pull registry:2.8
    2. docker stop registry
    3. docker rm registry
    4. # 使用新版本启动(保持相同配置)
  2. 数据迁移

    1. # 停止服务后
    2. rsync -avz /old/registry/ /new/location/
    3. # 更新卷映射后重启

通过以上完整配置,您将获得一个支持HTTPS加密、基于用户名密码认证、具备基础监控能力的企业级Docker Registry服务。实际部署时建议先在测试环境验证所有功能,生产环境应考虑添加双因素认证和审计日志等高级安全特性。