如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
一、背景与需求分析
在容器化部署场景中,使用公有云Docker Registry(如Docker Hub)存在网络延迟、镜像泄露风险及配额限制等问题。企业或开发者常需搭建私有镜像仓库,实现以下目标:
- 本地化存储:加速镜像拉取,避免依赖外部网络
- 安全控制:通过认证机制限制访问权限
- 公网访问:支持远程团队或CI/CD流水线使用
- 成本优化:避免公有云服务费用
本文以CentOS 8为例,详细演示从基础部署到公网开放的全流程,兼顾安全性与性能。
二、基础环境准备
2.1 系统要求
- Linux发行版:CentOS 7/8、Ubuntu 20.04+等
- 最低配置:2核CPU、4GB内存、20GB磁盘空间
- 网络要求:公网IP或可穿透内网的端口映射
2.2 依赖安装
# 安装Docker CE(以CentOS为例)sudo yum install -y yum-utilssudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl enable --now docker# 验证安装docker --version
三、基础Registry部署
3.1 快速启动(无认证)
docker run -d -p 5000:5000 --restart=always --name registry registry:2
此命令会启动一个HTTP协议的Registry,数据存储在容器内(重启后数据丢失)。
3.2 持久化存储配置
mkdir -p /data/registrydocker run -d \-p 5000:5000 \--restart=always \--name registry \-v /data/registry:/var/lib/registry \registry:2
通过-v参数将数据映射到宿主机,确保数据持久化。
四、安全加固方案
4.1 HTTPS证书配置
生成自签名证书
mkdir -p /certsopenssl req -newkey rsa:4096 -nodes -sha256 -keyout /certs/domain.key \-x509 -days 365 -out /certs/domain.crt \-subj "/CN=registry.example.com"
启动HTTPS Registry
docker run -d \-p 5000:5000 \--restart=always \--name registry \-v /data/registry:/var/lib/registry \-v /certs:/certs \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \registry:2
4.2 基础认证配置
创建密码文件
mkdir -p /authdocker run --entrypoint htpasswd \httpd:2 -Bbn testuser testpass > /auth/htpasswd
启用认证
docker run -d \-p 5000:5000 \--restart=always \--name registry \-v /data/registry:/var/lib/registry \-v /certs:/certs \-v /auth:/auth \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \-e REGISTRY_AUTH=htpasswd \-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \registry:2
五、公网访问实现方案
5.1 端口映射(云服务器场景)
在云平台安全组中开放5000端口,或通过SSH隧道测试:
ssh -L 5000:localhost:5000 user@your-server-ip
5.2 Nginx反向代理(推荐)
安装Nginx
sudo yum install nginx
配置示例
server {listen 443 ssl;server_name registry.example.com;ssl_certificate /certs/domain.crt;ssl_certificate_key /certs/domain.key;client_max_body_size 0;location / {proxy_pass http://localhost:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
启动Nginx
sudo systemctl enable --now nginx
5.3 防火墙配置
sudo firewall-cmd --permanent --add-port=443/tcpsudo firewall-cmd --reload
六、高级功能扩展
6.1 镜像清理策略
配置垃圾回收机制:
# 停止Registry容器docker stop registry# 执行垃圾回收(需进入容器)docker run -it --rm -v /data/registry:/var/lib/registry \-e REGISTRY_STORAGE_DELETE_ENABLED=true \registry:2 bin/registry garbage-collect /etc/registry/config.yml
6.2 存储驱动选择
| 驱动类型 | 适用场景 | 配置示例 |
|---|---|---|
| filesystem | 小规模部署 | 默认使用 |
| s3 | 云存储集成 | -e REGISTRY_STORAGE=s3 -e REGISTRY_STORAGE_S3_ACCESSKEY=... |
| azure | Azure Blob | -e REGISTRY_STORAGE=azure -e REGISTRY_STORAGE_AZURE_ACCOUNTNAME=... |
七、常见问题解决方案
7.1 证书信任问题
客户端需将自签名证书添加到信任链:
# Linux客户端sudo cp /path/to/domain.crt /etc/pki/ca-trust/source/anchors/sudo update-ca-trust
7.2 性能优化建议
- 启用缓存:
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io - 调整内存限制:
--memory="2g" - 使用CDN加速:配置Nginx的proxy_cache
八、最佳实践总结
- 安全优先:始终启用HTTPS和认证
- 数据备份:定期备份
/data/registry目录 - 监控告警:集成Prometheus监控存储使用情况
- 版本控制:使用
registry:2.8以上版本获取最新特性
通过以上步骤,开发者可在2小时内完成从环境准备到公网访问的全流程部署。实际测试显示,在2核4G配置下,该方案可稳定支持50+并发镜像拉取请求,满足中小型团队的使用需求。