Windows 11下Docker镜像构建与私有仓库上传全攻略

一、环境准备与Docker安装

1.1 启用Windows 11虚拟化功能

Docker Desktop依赖WSL 2或Hyper-V运行,需确保系统已启用虚拟化:

  • BIOS设置:重启电脑进入BIOS(不同厂商按键不同,如F2/Del),找到”Intel VT-x”或”AMD-V”选项并启用。
  • Windows功能:通过”控制面板 > 程序 > 启用或关闭Windows功能”,勾选”虚拟机平台”和”Windows子系统用于Linux”(WSL 2)。

1.2 安装Docker Desktop

  1. 访问Docker官网下载Windows版安装包。
  2. 双击安装程序,按向导完成安装(需勾选”Use WSL 2 instead of Hyper-V”以获得更好性能)。
  3. 启动Docker Desktop,首次运行需配置资源限制(建议分配4GB内存和2核CPU)。

1.3 验证安装

打开PowerShell或CMD,输入以下命令检查Docker状态:

  1. docker version

若显示客户端和服务端版本信息,则安装成功。

二、构建Docker镜像

2.1 创建Dockerfile文件

在项目目录下新建Dockerfile(无后缀),示例内容如下(以Node.js应用为例):

  1. # 基础镜像
  2. FROM node:18-alpine
  3. # 创建工作目录
  4. WORKDIR /app
  5. # 复制依赖文件并安装
  6. COPY package*.json ./
  7. RUN npm install
  8. # 复制应用代码
  9. COPY . .
  10. # 暴露端口
  11. EXPOSE 3000
  12. # 启动命令
  13. CMD ["npm", "start"]

关键点

  • FROM指定基础镜像,优先选择轻量级镜像(如alpine)。
  • WORKDIR定义容器内的工作目录。
  • COPY指令需分两步执行,避免重复安装依赖。

2.2 构建镜像

在Dockerfile所在目录执行:

  1. docker build -t my-node-app:v1 .
  • -t参数指定镜像名称和标签(<名称>:<标签>)。
  • .表示使用当前目录的Dockerfile。

常见问题

  • 权限错误:确保以管理员身份运行终端。
  • 网络超时:更换国内镜像源(修改Docker Desktop的Settings > Docker Engine,添加"registry-mirrors": ["https://registry.docker-cn.com"])。

三、搭建个人镜像仓库

3.1 使用Docker Registry

官方提供的轻量级私有仓库,启动命令:

  1. docker run -d -p 5000:5000 --restart=always --name registry registry:2
  • -p 5000:5000将容器端口映射到主机。
  • --restart=always确保容器崩溃后自动重启。

3.2 配置HTTPS(可选但推荐)

自签名证书配置步骤:

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

3.3 验证仓库

访问http://localhost:5000/v2/_catalog,应返回{}表示仓库已就绪。

四、上传镜像至私有仓库

4.1 标记镜像

将本地镜像标记为私有仓库格式:

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

若仓库有域名(如myregistry.example.com),替换localhost:5000即可。

4.2 推送镜像

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

注意事项

  • 确保Docker Desktop信任该仓库(若使用HTTPS自签名证书,需在Settings > Docker Engine中添加"insecure-registries": ["myregistry.example.com"])。
  • 推送大镜像时,可通过--compress参数启用压缩。

4.3 验证上传结果

访问http://localhost:5000/v2/my-node-app/tags/list,应返回包含v1的标签列表。

五、高级技巧与优化

5.1 多阶段构建

减少镜像体积的示例Dockerfile:

  1. # 构建阶段
  2. FROM node:18-alpine AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN npm install && npm run build
  6. # 运行阶段
  7. FROM nginx:alpine
  8. COPY --from=builder /app/dist /usr/share/nginx/html
  9. EXPOSE 80
  10. CMD ["nginx", "-g", "daemon off;"]

5.2 使用.dockerignore文件

排除不必要的文件(如node_modules、日志文件):

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

5.3 自动化构建(CI/CD集成)

在GitHub Actions中示例配置:

  1. name: Docker Build & Push
  2. on: [push]
  3. jobs:
  4. build:
  5. runs-on: windows-latest
  6. steps:
  7. - uses: actions/checkout@v2
  8. - name: Build Docker Image
  9. run: docker build -t my-node-app:${{ github.sha }} .
  10. - name: Push to Private Registry
  11. run: |
  12. docker tag my-node-app:${{ github.sha }} myregistry.example.com/my-node-app:${{ github.sha }}
  13. docker push myregistry.example.com/my-node-app:${{ github.sha }}

六、常见问题解决方案

  1. 推送失败(401 Unauthorized)

    • 检查Registry是否配置认证(若启用REGISTRY_AUTH环境变量,需先登录:docker login localhost:5000)。
  2. 镜像层已存在但未复用

    • 确保基础镜像版本一致,使用docker history检查镜像层。
  3. Windows路径问题

    • 在PowerShell中使用$PWD代替.,如:docker build -t my-app $PWD

七、总结与扩展

通过本文,您已掌握在Windows 11下:

  1. 安装并配置Docker Desktop。
  2. 编写Dockerfile构建应用镜像。
  3. 搭建私有Registry仓库(支持HTTP/HTTPS)。
  4. 推送和拉取镜像的完整流程。

下一步建议

  • 探索Kubernetes集成(通过kindminikube在本地测试)。
  • 学习镜像扫描工具(如Trivy)保障安全性。
  • 研究镜像签名机制(如Cosign)实现不可变部署。

附:完整命令速查表
| 操作 | 命令 |
|———|———|
| 启动Registry | docker run -d -p 5000:5000 registry:2 |
| 构建镜像 | docker build -t my-app . |
| 标记镜像 | docker tag my-app localhost:5000/my-app |
| 推送镜像 | docker push localhost:5000/my-app |
| 拉取镜像 | docker pull localhost:5000/my-app |