在Docker Desktop for Windows下搭建本地镜像仓库全攻略

一、环境准备与前置条件

1.1 Docker Desktop for Windows安装与配置

在Windows系统上部署本地镜像仓库前,需确保Docker Desktop for Windows已正确安装并运行。安装过程中需注意:

  • WSL2后端选择:推荐使用WSL2作为后端引擎,可获得更好的性能和兼容性。在安装向导中勾选”Use WSL 2 instead of Hyper-V”选项。
  • 资源分配:根据开发需求合理分配CPU(建议4核以上)、内存(建议8GB以上)和磁盘空间(建议100GB以上)。
  • Kubernetes集成:若需使用Kubernetes功能,可在设置中启用”Enable Kubernetes”选项。

安装完成后,通过命令行验证安装状态:

  1. docker version
  2. # 应显示Client和Server版本信息,且Server状态为"running"

1.2 网络环境要求

本地镜像仓库需要稳定的网络连接,特别注意:

  • 防火墙设置:确保入站规则允许5000端口(默认registry端口)的TCP连接。
  • 代理配置:若企业网络使用代理,需在Docker Desktop设置中配置代理:
    1. {
    2. "proxies": {
    3. "default": {
    4. "httpProxy": "http://proxy.example.com:8080",
    5. "httpsProxy": "http://proxy.example.com:8080"
    6. }
    7. }
    8. }

    配置文件位于~/.docker/config.json(Windows路径为%USERPROFILE%\.docker\config.json

二、本地镜像仓库部署方案

2.1 使用Docker官方Registry镜像

最简单的方式是直接运行官方Registry容器:

  1. docker run -d -p 5000:5000 --restart=always --name registry registry:2

参数说明:

  • -d:后台运行
  • -p 5000:5000:端口映射(主机端口:容器端口)
  • --restart=always:容器退出时自动重启
  • --name registry:指定容器名称

验证服务是否运行:

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

2.2 增强型Registry配置(带认证)

生产环境建议启用基本认证:

  1. 创建密码文件:

    1. mkdir auth
    2. docker run --entrypoint htpasswd httpd:2 -Bbn username password > auth/htpasswd
  2. 运行带认证的Registry:

    1. docker run -d -p 5000:5000 --restart=always --name registry \
    2. -v "$(pwd)"/auth:/auth \
    3. -e "REGISTRY_AUTH=htpasswd" \
    4. -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    5. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
    6. -v registry-data:/var/lib/registry \
    7. registry:2

2.3 使用Docker Compose部署(推荐)

创建docker-compose.yml文件:

  1. version: '3.8'
  2. services:
  3. registry:
  4. image: registry:2
  5. container_name: local_registry
  6. ports:
  7. - "5000:5000"
  8. volumes:
  9. - registry-data:/var/lib/registry
  10. - ./auth:/auth
  11. environment:
  12. REGISTRY_AUTH: htpasswd
  13. REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  14. REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
  15. REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry
  16. restart: always
  17. volumes:
  18. registry-data:

启动服务:

  1. docker-compose up -d

三、镜像操作全流程

3.1 标记并推送镜像

  1. 获取本地镜像ID:

    1. docker images
    2. # 示例输出:
    3. # REPOSITORY TAG IMAGE ID CREATED SIZE
    4. # nginx latest 602e111c06b6 2 weeks ago 142MB
  2. 标记镜像(注意添加localhost:5000前缀):

    1. docker tag nginx:latest localhost:5000/my-nginx:v1
  3. 推送镜像到本地仓库:

    1. docker push localhost:5000/my-nginx:v1

3.2 从本地仓库拉取镜像

  1. docker pull localhost:5000/my-nginx:v1

3.3 常见问题处理

问题1:推送时出现”denied: requested access to the resource is denied”

  • 原因:未标记正确的仓库前缀
  • 解决方案:确保镜像标签包含localhost:5000

问题2:出现”x509: certificate signed by unknown authority”

  • 原因:Docker默认要求HTTPS连接
  • 解决方案(仅测试环境):
    1. 编辑%PROGRAMDATA%\docker\config\daemon.json
    2. 添加:
      1. {
      2. "insecure-registries": ["localhost:5000"]
      3. }
    3. 重启Docker服务

四、高级配置与管理

4.1 存储驱动配置

Registry支持多种存储驱动,在config.yml中配置(需挂载到容器):

  1. version: 0.1
  2. log:
  3. level: debug
  4. storage:
  5. filesystem:
  6. rootdirectory: /var/lib/registry
  7. delete:
  8. enabled: true # 允许删除镜像

4.2 镜像清理策略

定期清理未使用的镜像层:

  1. # 进入Registry容器
  2. docker exec -it registry sh
  3. # 手动执行清理(需安装jq)
  4. apt-get update && apt-get install -y jq
  5. catalog=$(curl http://localhost:5000/v2/_catalog)
  6. for repo in $(echo $catalog | jq -r '.repositories[]'); do
  7. tags=$(curl http://localhost:5000/v2/$repo/tags/list | jq -r '.tags[]')
  8. for tag in $tags; do
  9. # 这里可以添加清理逻辑
  10. echo "Processing $repo:$tag"
  11. done
  12. done

更推荐使用registry-cli等专用工具进行管理。

4.3 与CI/CD集成

在Jenkinsfile中添加本地仓库认证:

  1. pipeline {
  2. agent any
  3. environment {
  4. REGISTRY_CRED = credentials('registry-cred')
  5. }
  6. stages {
  7. stage('Build') {
  8. steps {
  9. script {
  10. docker.build("localhost:5000/my-app:${env.BUILD_ID}")
  11. }
  12. }
  13. }
  14. stage('Push') {
  15. steps {
  16. script {
  17. docker.withRegistry('http://localhost:5000', REGISTRY_CRED) {
  18. docker.image("localhost:5000/my-app:${env.BUILD_ID}").push()
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }

五、最佳实践建议

  1. 命名规范:采用<项目>/<镜像名>:<版本>的命名方式,如devops/nginx:1.21
  2. 版本控制:使用语义化版本号(Major.Minor.Patch)
  3. 备份策略:定期备份registry-data
  4. 监控告警:通过Prometheus监控Registry指标
  5. 安全加固
    • 定期轮换认证密码
    • 限制Registry容器的网络访问
    • 启用日志审计

六、扩展应用场景

  1. 开发环境隔离:为不同项目创建独立Registry
  2. 镜像缓存:在离线环境中作为镜像缓存层
  3. 测试环境管理:存储预构建的测试镜像
  4. 混合云方案:作为私有云与公有云的镜像中转站

通过以上配置,开发者可以在Windows环境下快速搭建功能完善的本地镜像仓库,实现镜像的全生命周期管理。实际部署时建议先在测试环境验证,再逐步推广到生产环境。