一、环境准备:Windows11下的Docker安装与配置
1.1 启用Windows11的WSL2功能
Docker Desktop for Windows依赖WSL2(Windows Subsystem for Linux 2)作为后端引擎。首先需通过PowerShell以管理员身份运行以下命令启用WSL2:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linuxdism.exe /online /enable-feature /featurename:VirtualMachinePlatformwsl --set-default-version 2
重启系统后,从Microsoft Store安装Ubuntu 22.04 LTS作为默认Linux发行版。
1.2 安装Docker Desktop
访问Docker官网下载Windows版安装包,运行安装向导时注意勾选:
- 添加Docker到PATH环境变量
- 启用WSL2集成(勾选已安装的Ubuntu发行版)
安装完成后,启动Docker Desktop并验证服务状态:
docker version
正常应显示Client和Server版本信息,且Server版本包含”linux”标识。
1.3 配置镜像加速(可选)
国内用户建议配置镜像加速器,编辑C:\ProgramData\Docker\config\daemon.json(需创建文件):
{"registry-mirrors": ["https://<your-mirror-url>.mirror.aliyuncs.com"]}
重启Docker服务生效。
二、镜像构建:从Dockerfile到本地镜像
2.1 创建项目目录结构
以Node.js应用为例,建立如下目录:
my-app/├── app.js├── package.json└── Dockerfile
2.2 编写Dockerfile
示例Dockerfile内容:
# 使用官方Node.js镜像作为基础FROM node:18-alpine# 创建工作目录并设置环境变量WORKDIR /usr/src/appCOPY package*.json ./RUN npm installCOPY . .# 暴露端口并定义启动命令EXPOSE 3000CMD ["node", "app.js"]
关键指令解析:
FROM:指定基础镜像,优先选择带标签的版本(如18-alpine)WORKDIR:创建并切换到工作目录,避免使用RUN cdCOPY:分阶段复制文件,利用Docker缓存机制RUN:执行构建命令,多个命令可用&&合并
2.3 构建镜像
在项目根目录执行:
docker build -t my-node-app:v1 .
参数说明:
-t:指定镜像名称和标签(格式:名称:标签).:表示使用当前目录的Dockerfile
构建完成后验证:
docker images
应看到类似输出:
REPOSITORY TAG IMAGE ID CREATED SIZEmy-node-app v1 abc123456789 2 minutes ago 123MB
三、私有仓库搭建与配置
3.1 使用Docker Registry搭建私有仓库
最简单的私有仓库方案是使用官方Registry镜像:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
验证服务:
curl http://localhost:5000/v2/_catalog
应返回{"repositories":[]}表示仓库已就绪。
3.2 配置HTTPS(生产环境必需)
自签名证书配置步骤:
- 生成证书:
mkdir -p certsopenssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \-x509 -days 365 -out certs/domain.crt -subj "/CN=myregistry.local"
- 启动带证书的Registry:
docker run -d -p 5000:5000 --restart=always --name registry \-v "$(pwd)"/certs:/certs \-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \registry:2
3.3 配置Docker信任私有仓库
编辑C:\ProgramData\Docker\config\daemon.json添加:
{"insecure-registries" : ["myregistry.local:5000"]}
或对于HTTPS仓库直接使用域名访问。
四、镜像上传与验证
4.1 标记镜像
为镜像添加私有仓库标签:
docker tag my-node-app:v1 myregistry.local:5000/my-node-app:v1
4.2 推送镜像
执行推送命令:
docker push myregistry.local:5000/my-node-app:v1
常见问题处理:
- 认证失败:确保已配置正确的认证信息(如使用
docker login) - 连接拒绝:检查防火墙设置和端口映射
- 证书错误:确认客户端信任了仓库证书
4.3 验证上传结果
访问仓库API检查镜像:
curl http://myregistry.local:5000/v2/my-node-app/tags/list
或拉取测试:
docker pull myregistry.local:5000/my-node-app:v1
五、高级实践与优化
5.1 多阶段构建优化
修改Dockerfile实现生产环境优化:
# 构建阶段FROM node:18-alpine AS builderWORKDIR /usr/src/appCOPY package*.json ./RUN npm ci --only=productionCOPY . .RUN npm run build# 运行阶段FROM node:18-alpineWORKDIR /usr/src/appCOPY --from=builder /usr/src/app/node_modules ./node_modulesCOPY --from=builder /usr/src/app/dist ./distCMD ["node", "dist/main.js"]
5.2 使用.dockerignore文件
创建.dockerignore文件排除不必要的文件:
node_modules.git*.log*.env
5.3 自动化构建流程
结合GitHub Actions实现CI/CD:
name: Docker Image CIon:push:branches: [ main ]jobs:build:runs-on: windows-lateststeps:- uses: actions/checkout@v2- name: Build Docker imagerun: docker build -t my-node-app:${{ github.sha }} .- name: Log in to registryrun: docker login myregistry.local:5000 -u ${{ secrets.REGISTRY_USER }} -p ${{ secrets.REGISTRY_PASS }}- name: Push imagerun: |docker tag my-node-app:${{ github.sha }} myregistry.local:5000/my-node-app:${{ github.sha }}docker push myregistry.local:5000/my-node-app:${{ github.sha }}
六、常见问题解决方案
6.1 WSL2网络问题
症状:Docker命令执行超时
解决方案:
- 检查WSL2网络配置:
wsl --shutdownnetsh interface portproxy reset
- 修改Docker Desktop网络设置,使用”Use the WSL 2 based engine”
6.2 磁盘空间不足
清理无用镜像和容器:
docker system prune -a --volumes
6.3 端口冲突
查找占用端口的进程:
netstat -ano | findstr ":5000"
终止对应进程或修改Docker端口映射。
七、总结与展望
本文系统介绍了Windows11环境下Docker镜像构建与私有仓库管理的完整流程,涵盖从环境搭建到自动化部署的全栈实践。关键收获包括:
- 掌握WSL2与Docker Desktop的集成配置
- 理解Dockerfile最佳实践和多阶段构建
- 具备私有仓库搭建和安全配置能力
- 熟悉常见问题的排查与解决方法
未来可探索的方向:
- 使用Docker Compose管理多容器应用
- 集成Kubernetes进行容器编排
- 实现镜像签名和漏洞扫描
- 探索Windows容器与Linux容器的混合部署
通过持续实践和优化,开发者能够构建高效、安全的容器化交付体系,为现代应用开发奠定坚实基础。