## 场景
项目组内多人开发,镜像推送到Docker Hub太慢,或者公司内部代码不想公开。自己搭个Registry最直接。
## 最简单的方案:运行官方Registry镜像
docker run -d -p 5000:5000 --name registry registry:2
这就跑起来了。默认存储在本机容器内,容器删了镜像就没了,生产环境不能这么搞。
## 持久化存储
挂载宿主机目录:
docker run -d -p 5000:5000 --name registry \
-v /data/registry:/var/lib/registry \
registry:2
现在镜像存在`/data/registry`下,容器重启或删除数据还在。
## 配置HTTPS(必须)
Docker客户端默认要求HTTPS推送,除非你给每个开发机配`insecure-registries`。配HTTPS更正规。
用Let’s Encrypt或自签名证书。自签名示例:
mkdir -p /data/registry/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /data/registry/certs/domain.key \
-x509 -days 365 -out /data/registry/certs/domain.crt
启动时挂载证书:
docker run -d -p 5000:5000 --name registry \
-v /data/registry:/var/lib/registry \
-v /data/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
客户端需要把`domain.crt`加到信任列表,或者用`–insecure-registry`跳过验证。
## 添加认证
Registry不带认证,任何人都能推拉。加个HTTP基本认证:
# 安装htpasswd工具
apt install apache2-utils -y
# 创建密码文件,用户名为admin
htpasswd -Bc /data/registry/auth/htpasswd admin
启动时加认证参数:
docker run -d -p 5000:5000 --name registry \
-v /data/registry:/var/lib/registry \
-v /data/registry/certs:/certs \
-v /data/registry/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
推镜像前先登录:
docker login your-registry-domain.com:5000
## 使用Nginx反向代理(推荐)
裸Registry功能太少,加个Nginx做HTTPS终止、认证、限流更灵活。
Nginx配置示例(`/etc/nginx/conf.d/registry.conf`):
upstream registry {
server 127.0.0.1:5000;
}
server {
listen 443 ssl;
server_name registry.example.com;
ssl_certificate /etc/nginx/certs/domain.crt;
ssl_certificate_key /etc/nginx/certs/domain.key;
client_max_body_size 0; # 不限制上传大小
location / {
auth_basic "Registry";
auth_basic_user_file /etc/nginx/auth/htpasswd;
proxy_pass http://registry;
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容器时挂载证书和认证文件,Registry只监听127.0.0.1:5000,不对外暴露。
## 清理旧镜像
Registry不会自动清理。用`registry garbage-collect`命令:
# 先查看Registry容器ID
docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml
手动删镜像需要先删除blob再跑gc,比较麻烦。可以用第三方工具如`cr-harbor`,或者自己写脚本定期清理。
## 推荐的生产方案:Harbor
如果团队超过10人,直接用Harbor。它基于Registry,加了Web UI、LDAP集成、镜像复制、漏洞扫描。部署用docker-compose:
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xzf harbor-offline-installer-*.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 修改hostname、证书路径
./install.sh
Harbor自带管理界面,能分项目、设权限、做镜像同步。如果你用雨云服务器部署Harbor,它的IO性能和网络稳定性都够用,性价比高,跑镜像仓库很合适。
## 客户端推送测试
# 打标签
docker tag nginx:latest registry.example.com:5000/my-nginx:v1
# 登录
docker login registry.example.com:5000
# 推送
docker push registry.example.com:5000/my-nginx:v1
# 拉取
docker pull registry.example.com:5000/my-nginx:v1
## 注意事项
– 存储空间:镜像层是增量的,但长期不清理会占用大量磁盘
– 网络:推送大镜像时带宽要够,雨云的服务器内网带宽高,跨机房推镜像体验好
– 备份:定期备份`/var/lib/registry`目录,或者用S3/NFS做后端存储
– 版本:Registry 2.x和Docker API兼容,老版本别用了
Registry本身不复杂,难点在认证和HTTPS配置。小团队直接用官方镜像+挂载目录,大团队上Harbor,别自己造轮子。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容