Windows11 Docker实战:镜像构建与私有仓库上传全流程

一、环境准备:Windows11下的Docker安装与配置

1.1 启用Windows11的WSL2功能

Docker Desktop for Windows依赖WSL2(Windows Subsystem for Linux 2)作为后端引擎。首先需通过PowerShell以管理员身份运行以下命令启用WSL2:

  1. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux
  2. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform
  3. wsl --set-default-version 2

重启系统后,从Microsoft Store安装Ubuntu 22.04 LTS作为默认Linux发行版。

1.2 安装Docker Desktop

访问Docker官网下载Windows版安装包,运行安装向导时注意勾选:

  • 添加Docker到PATH环境变量
  • 启用WSL2集成(勾选已安装的Ubuntu发行版)

安装完成后,启动Docker Desktop并验证服务状态:

  1. docker version

正常应显示Client和Server版本信息,且Server版本包含”linux”标识。

1.3 配置镜像加速(可选)

国内用户建议配置镜像加速器,编辑C:\ProgramData\Docker\config\daemon.json(需创建文件):

  1. {
  2. "registry-mirrors": ["https://<your-mirror-url>.mirror.aliyuncs.com"]
  3. }

重启Docker服务生效。

二、镜像构建:从Dockerfile到本地镜像

2.1 创建项目目录结构

以Node.js应用为例,建立如下目录:

  1. my-app/
  2. ├── app.js
  3. ├── package.json
  4. └── Dockerfile

2.2 编写Dockerfile

示例Dockerfile内容:

  1. # 使用官方Node.js镜像作为基础
  2. FROM node:18-alpine
  3. # 创建工作目录并设置环境变量
  4. WORKDIR /usr/src/app
  5. COPY package*.json ./
  6. RUN npm install
  7. COPY . .
  8. # 暴露端口并定义启动命令
  9. EXPOSE 3000
  10. CMD ["node", "app.js"]

关键指令解析:

  • FROM:指定基础镜像,优先选择带标签的版本(如18-alpine)
  • WORKDIR:创建并切换到工作目录,避免使用RUN cd
  • COPY:分阶段复制文件,利用Docker缓存机制
  • RUN:执行构建命令,多个命令可用&&合并

2.3 构建镜像

在项目根目录执行:

  1. docker build -t my-node-app:v1 .

参数说明:

  • -t:指定镜像名称和标签(格式:名称:标签
  • .:表示使用当前目录的Dockerfile

构建完成后验证:

  1. docker images

应看到类似输出:

  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. my-node-app v1 abc123456789 2 minutes ago 123MB

三、私有仓库搭建与配置

3.1 使用Docker Registry搭建私有仓库

最简单的私有仓库方案是使用官方Registry镜像:

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

验证服务:

  1. curl http://localhost:5000/v2/_catalog

应返回{"repositories":[]}表示仓库已就绪。

3.2 配置HTTPS(生产环境必需)

自签名证书配置步骤:

  1. 生成证书:
    1. mkdir -p certs
    2. openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
    3. -x509 -days 365 -out certs/domain.crt -subj "/CN=myregistry.local"
  2. 启动带证书的Registry:
    1. docker run -d -p 5000:5000 --restart=always --name registry \
    2. -v "$(pwd)"/certs:/certs \
    3. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
    4. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    5. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    6. registry:2

3.3 配置Docker信任私有仓库

编辑C:\ProgramData\Docker\config\daemon.json添加:

  1. {
  2. "insecure-registries" : ["myregistry.local:5000"]
  3. }

或对于HTTPS仓库直接使用域名访问。

四、镜像上传与验证

4.1 标记镜像

为镜像添加私有仓库标签:

  1. docker tag my-node-app:v1 myregistry.local:5000/my-node-app:v1

4.2 推送镜像

执行推送命令:

  1. docker push myregistry.local:5000/my-node-app:v1

常见问题处理:

  • 认证失败:确保已配置正确的认证信息(如使用docker login
  • 连接拒绝:检查防火墙设置和端口映射
  • 证书错误:确认客户端信任了仓库证书

4.3 验证上传结果

访问仓库API检查镜像:

  1. curl http://myregistry.local:5000/v2/my-node-app/tags/list

或拉取测试:

  1. docker pull myregistry.local:5000/my-node-app:v1

五、高级实践与优化

5.1 多阶段构建优化

修改Dockerfile实现生产环境优化:

  1. # 构建阶段
  2. FROM node:18-alpine AS builder
  3. WORKDIR /usr/src/app
  4. COPY package*.json ./
  5. RUN npm ci --only=production
  6. COPY . .
  7. RUN npm run build
  8. # 运行阶段
  9. FROM node:18-alpine
  10. WORKDIR /usr/src/app
  11. COPY --from=builder /usr/src/app/node_modules ./node_modules
  12. COPY --from=builder /usr/src/app/dist ./dist
  13. CMD ["node", "dist/main.js"]

5.2 使用.dockerignore文件

创建.dockerignore文件排除不必要的文件:

  1. node_modules
  2. .git
  3. *.log
  4. *.env

5.3 自动化构建流程

结合GitHub Actions实现CI/CD:

  1. name: Docker Image CI
  2. on:
  3. push:
  4. branches: [ main ]
  5. jobs:
  6. build:
  7. runs-on: windows-latest
  8. steps:
  9. - uses: actions/checkout@v2
  10. - name: Build Docker image
  11. run: docker build -t my-node-app:${{ github.sha }} .
  12. - name: Log in to registry
  13. run: docker login myregistry.local:5000 -u ${{ secrets.REGISTRY_USER }} -p ${{ secrets.REGISTRY_PASS }}
  14. - name: Push image
  15. run: |
  16. docker tag my-node-app:${{ github.sha }} myregistry.local:5000/my-node-app:${{ github.sha }}
  17. docker push myregistry.local:5000/my-node-app:${{ github.sha }}

六、常见问题解决方案

6.1 WSL2网络问题

症状:Docker命令执行超时
解决方案:

  1. 检查WSL2网络配置:
    1. wsl --shutdown
    2. netsh interface portproxy reset
  2. 修改Docker Desktop网络设置,使用”Use the WSL 2 based engine”

6.2 磁盘空间不足

清理无用镜像和容器:

  1. docker system prune -a --volumes

6.3 端口冲突

查找占用端口的进程:

  1. netstat -ano | findstr ":5000"

终止对应进程或修改Docker端口映射。

七、总结与展望

本文系统介绍了Windows11环境下Docker镜像构建与私有仓库管理的完整流程,涵盖从环境搭建到自动化部署的全栈实践。关键收获包括:

  1. 掌握WSL2与Docker Desktop的集成配置
  2. 理解Dockerfile最佳实践和多阶段构建
  3. 具备私有仓库搭建和安全配置能力
  4. 熟悉常见问题的排查与解决方法

未来可探索的方向:

  • 使用Docker Compose管理多容器应用
  • 集成Kubernetes进行容器编排
  • 实现镜像签名和漏洞扫描
  • 探索Windows容器与Linux容器的混合部署

通过持续实践和优化,开发者能够构建高效、安全的容器化交付体系,为现代应用开发奠定坚实基础。