Skip to content

私有仓库搭建

企业通常需要将内部镜像存储在私有仓库中,避免代码和配置泄露,同时提升内网拉取速度。

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/htpasswd

3. 启动带认证的 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:2

4. 客户端登录使用:

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:latest

Docker 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,参见下一节

国内云厂商托管仓库

如果不想自建,可以使用云厂商的托管服务:

服务地址特点
阿里云 ACRcr.console.aliyun.com免费额度高,国内速度快
腾讯云 TCRconsole.cloud.tencent.com/tcr免费额度,支持个人版
华为云 SWRconsole.huaweicloud.com/swr企业级功能

总结

私有仓库选型建议:

场景推荐方案
个人/小团队Docker Registry + 简单认证
中小企业云厂商托管仓库(免运维)
大型企业Harbor(功能完整,可控)
离线环境Docker Registry 或 Harbor