Appearance
私有仓库搭建
企业通常需要将内部镜像存储在私有仓库中,避免代码和配置泄露,同时提升内网拉取速度。
Docker Registry(官方方案)
Docker Registry 是 Docker 官方提供的开源镜像仓库,轻量级,适合简单场景。
快速启动
bash
# 启动 Registry(最简单方式,不带认证)
docker run -d \
--name registry \
--restart always \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry:2使用私有仓库
bash
# 给镜像打标签(使用私有仓库地址)
docker tag nginx:alpine localhost:5000/nginx:alpine
# 推送到私有仓库
docker push localhost:5000/nginx:alpine
# 从私有仓库拉取
docker pull localhost:5000/nginx:alpine
# 查看仓库中的镜像
curl http://localhost:5000/v2/_catalog
# {"repositories":["nginx"]}
# 查看镜像的所有标签
curl http://localhost:5000/v2/nginx/tags/list
# {"name":"nginx","tags":["alpine"]}配置远程访问(带认证)
在远程服务器上部署时,需要配置 HTTPS 和认证:
1. 生成自签名证书:
bash
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout certs/domain.key \
-x509 -days 365 \
-out certs/domain.crt \
-subj "/CN=registry.example.com"2. 创建认证文件:
bash
mkdir -p auth
docker run --rm \
httpd:2 \
htpasswd -Bbn admin secretpassword > auth/htpasswd3. 启动带认证的 Registry:
bash
docker run -d \
--name registry \
--restart always \
-p 443:443 \
-v $(pwd)/certs:/certs \
-v $(pwd)/auth:/auth \
-v registry-data:/var/lib/registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-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:24. 客户端登录使用:
bash
# 如果使用自签名证书,需要添加信任
sudo mkdir -p /etc/docker/certs.d/registry.example.com
sudo cp certs/domain.crt /etc/docker/certs.d/registry.example.com/ca.crt
sudo systemctl restart docker
# 登录
docker login registry.example.com -u admin -p secretpassword
# 推送
docker tag myapp:latest registry.example.com/myapp:latest
docker push registry.example.com/myapp:latestDocker Registry 配置文件
/etc/docker/registry/config.yml 或通过环境变量配置:
yaml
version: 0.1
log:
level: info
storage:
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true # 允许删除镜像
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3配置 Docker 使用不安全仓库
在测试环境中,如果没有 HTTPS,需要配置信任:
bash
# 编辑 /etc/docker/daemon.json
sudo tee /etc/docker/daemon.json <<EOF
{
"insecure-registries": [
"192.168.1.100:5000",
"registry.internal:5000"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker使用 Compose 管理私有仓库
yaml
# docker-compose.yml
services:
registry:
image: registry:2
restart: unless-stopped
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- registry-data:/var/lib/registry
- ./registry-config.yml:/etc/docker/registry/config.yml:ro
registry-ui:
image: joxit/docker-registry-ui:latest
restart: unless-stopped
ports:
- "8080:80"
environment:
SINGLE_REGISTRY: "true"
REGISTRY_TITLE: "My Private Registry"
REGISTRY_URL: http://registry:5000
DELETE_IMAGES: "true"
depends_on:
- registry
volumes:
registry-data:bash
docker compose up -d
# 访问 UI:http://localhost:8080
# 仓库 API:http://localhost:5000镜像清理(垃圾回收)
Registry 删除镜像后,磁盘空间不会立即释放,需要运行垃圾回收:
bash
# 执行垃圾回收(只清理未引用的层)
docker exec registry registry garbage-collect /etc/docker/registry/config.yml
# 先执行 dry run(预览)
docker exec registry registry garbage-collect \
--dry-run \
/etc/docker/registry/config.yml推荐:使用 Harbor(企业级)
Harbor 是 VMware 开源的企业级镜像仓库,功能远超 Docker Registry,参见下一节。
国内云厂商托管仓库
如果不想自建,可以使用云厂商的托管服务:
| 服务 | 地址 | 特点 |
|---|---|---|
| 阿里云 ACR | cr.console.aliyun.com | 免费额度高,国内速度快 |
| 腾讯云 TCR | console.cloud.tencent.com/tcr | 免费额度,支持个人版 |
| 华为云 SWR | console.huaweicloud.com/swr | 企业级功能 |
总结
私有仓库选型建议:
| 场景 | 推荐方案 |
|---|---|
| 个人/小团队 | Docker Registry + 简单认证 |
| 中小企业 | 云厂商托管仓库(免运维) |
| 大型企业 | Harbor(功能完整,可控) |
| 离线环境 | Docker Registry 或 Harbor |