在这里插入图片描述

Windows 11 上从零部署 Docker 完整指南:从环境准备到容器实战

这份指南将带你从零开始,在 Windows 11 系统上完成 Docker 的部署与实战。我们会从底层原理讲起,逐步深入到具体操作,确保你不仅会用,还理解为什么这么用。

一、Docker 与 Windows 11:核心概念与优势

在开始之前,我们先快速理解几个关键概念,这将帮助你更好地掌握后续内容。

1. 什么是 Docker?

Docker 是一个开源的应用容器引擎,它允许你将应用程序及其所有依赖项(如库、配置文件等)打包到一个标准化的单元中,这个单元被称为容器(Container)

2. 为什么在 Windows 11 上使用 Docker?

在 Windows 11 上使用 Docker,主要有以下几个优势:

  • 开发环境一致性:在本地创建的容器,可以无缝地在测试服务器、生产服务器上运行,消除了“在我电脑上能跑”的尴尬。
  • 隔离与安全:每个容器都有自己独立的文件系统和网络空间,彼此隔离,一个容器的问题不会影响到其他容器或宿主机。
  • 资源高效:相比于传统虚拟机(VM),容器共享宿主机的操作系统内核,启动速度快,资源占用低。
  • 快速迭代与扩展:可以快速创建、启动、停止和销毁容器,非常适合敏捷开发和微服务架构。

3. WSL 2:Docker 在 Windows 上的最佳搭档

为了在 Windows 上高效地运行 Linux 容器,Docker Desktop 利用了 WSL 2(Windows Subsystem for Linux 2)

  • WSL 2 是什么? 它是一个在 Windows 10/11 上运行的、由微软官方提供的 Linux 内核虚拟机。
  • 为什么是 WSL 2?
    • 性能:WSL 2 中的 Linux 容器直接与宿主机的文件系统和网络进行交互,性能远超以往的方式。
    • 完整的 Linux 内核:提供了更完整的系统调用支持,使得更多的 Linux 工具和应用可以在 Windows 上原生运行。

核心假设:本指南将以 WSL 2 为基础进行讲解,这是目前在 Windows 11 上运行 Docker 的最佳实践


二、前期准备与环境检查

在安装 Docker 之前,请确保你的 Windows 11 系统满足以下条件。

1. 硬件要求

  • CPU 支持虚拟化:绝大多数现代 CPU 都支持。你可以在任务管理器(Ctrl+Shift+Esc)的“性能” -> “CPU”标签页底部查看。

2. 系统要求

  • 版本:Windows 11 专业版、企业版或教育版。(重要:Windows 11 家庭版也支持,但需要额外安装 WSL 2)
  • 已启用相关功能:需要开启“虚拟机平台”和“适用于 Linux 的 Windows 子系统”。

三、安装与配置 WSL 2

这是整个安装过程中最关键的一步。我们将通过命令行快速完成。

步骤 1:以管理员身份打开 PowerShell

在开始菜单搜索 PowerShell,右键点击它,选择“以管理员身份运行”。

步骤 2:启用必要的 Windows 功能

在 PowerShell 窗口中,依次运行以下两条命令。这些命令会启用 WSL 和虚拟机平台功能。

# 启用适用于 Linux 的 Windows 子系统
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 启用虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

提示/norestart 参数意味着命令执行后不会立即重启,但在所有命令执行完毕后,你必须手动重启电脑才能使更改生效。

步骤 3:重启电脑

保存好你正在进行的工作,然后重启 Windows 11。

步骤 4:安装 WSL 并设置默认版本

电脑重启后,再次以管理员身份打开 PowerShell。

运行以下命令,它会自动下载并安装最新的 WSL 组件和一个默认的 Linux 发行版(通常是 Ubuntu)。

wsl --install

对于 Windows 11 家庭版用户:此命令同样适用,它会自动处理所有依赖。

安装完成后,设置 WSL 2 为默认版本,这能确保未来安装的所有 Linux 发行版都将使用 WSL 2。

wsl --set-default-version 2

步骤 5:验证 WSL 安装

运行以下命令来检查 WSL 的状态:

wsl --list --verbose

如果看到类似下面的输出,且 VERSION 列显示为 2,则表示 WSL 2 已成功安装并配置。

  NAME      STATE           VERSION
* Ubuntu    Running         2

四、下载与安装 Docker Desktop

现在,WSL 2 已经就绪,我们可以安装 Docker 的图形化管理工具了。

步骤 1:下载 Docker Desktop

访问 Docker 官方网站的下载页面:
https://www.docker.com/products/docker-desktop/

点击 “Download for Windows” 按钮下载安装程序。

步骤 2:安装 Docker Desktop

  1. 双击下载的安装文件(通常是 Docker Desktop Installer.exe)。
  2. 在安装向导中,请务必勾选 “Use WSL 2 instead of Hyper-V”。这是关键设置,它会将 Docker 的后端指向我们已经配置好的 WSL 2。
  3. 点击 “OK” 开始安装。

步骤 3:启动与验证

安装完成后,从开始菜单启动 “Docker Desktop”。

启动后,你会在任务栏的系统托盘区看到 Docker 的小鲸鱼图标。当图标不再显示“starting…”时,说明 Docker 已经成功运行。

为了确认一切正常,打开一个新的 PowerShell 或命令提示符(cmd)窗口,运行以下命令:

docker --version

你应该能看到 Docker 的版本信息输出,例如:
Docker version 24.0.7, build afdd53b

再运行一个更全面的检查命令:

docker run hello-world

如果看到 “Hello from Docker!” 的消息,恭喜你!Docker 已经在你的 Windows 11 上成功运行了。


五、Docker Desktop 核心设置与优化

为了获得更好的使用体验,我们需要对 Docker Desktop 进行一些关键配置。

1. 资源分配(内存与 CPU)

默认情况下,Docker 会占用较多的系统资源。你可以根据自己电脑的配置进行调整。

  • 右键点击任务栏的 Docker 图标,选择 “Settings”。
  • 在左侧导航栏选择 “Resources” -> “Advanced”。
  • 在这里,你可以拖动滑块来限制 Docker 可以使用的内存(Memory)和 CPU 核心数。建议设置为你电脑总内存的一半左右,以保证宿主机系统的流畅运行。
  • 点击 “Apply & Restart” 保存并重启 Docker。

2. 镜像加速(国内用户必做)

由于网络原因,直接从 Docker 官方仓库(Docker Hub)拉取镜像会非常慢。配置国内的镜像加速器是解决此问题的最佳方案。

  • 在 “Settings” 中,选择 “Docker Engine”。
  • 你会看到一个 JSON 格式的配置文件。在 registry-mirrors 数组中添加国内的镜像地址。

这里提供几个常用的公共镜像源(任选其一或多个添加):

  • 网易云"http://hub-mirror.c.163.com"
  • 阿里云"https://<你的专属ID>.mirror.aliyuncs.com" (需要登录阿里云控制台获取)
  • 腾讯云"https://<你的专属ID>.mirror.tencentcloudcr.com" (需要登录腾讯云控制台获取)

修改后的配置文件看起来像这样:

{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false
}
  • 点击 “Apply & Restart” 保存并重启 Docker。

3. 文件共享与挂载路径

理解文件路径是在 Windows 上使用 Docker 的一个难点。

  • Windows 路径在 WSL/Linux 容器中:当你在 Docker 命令中使用 Windows 路径(如 D:\my-project)时,Docker 会自动处理。但更推荐的做法是在 WSL 环境中操作。
  • WSL 路径在 Windows 中:你可以在 Windows 的文件资源管理器地址栏输入 \\wsl$ 来访问所有 WSL 发行版的文件系统。例如,Ubuntu 的根目录在 \\wsl$\Ubuntu
  • 推荐工作流:将你的项目文件放在 WSL 的 home 目录下(如 ~~/projects),然后在 VS Code(安装了 WSL 扩展后)中直接打开这个目录进行开发。这样在运行容器并挂载目录时,性能和路径处理都会是最佳的。

六、Docker 核心概念与常用命令实战

这部分是 Docker 的精髓。我们将通过实战来理解并掌握它们。

1. 三大核心概念

  • 镜像 (Image):可以理解为一个只读的模板,包含了运行某个应用所需的所有代码、运行时、库、环境变量和配置文件。它是创建容器的基础。
  • 容器 (Container):镜像的一个运行实例。你可以把它想象成一个轻量级的、独立的虚拟机。
  • 仓库 (Repository):存放镜像的地方,类似于代码仓库(如 GitHub)。Docker Hub 是官方的公共仓库。

2. 常用命令实战

场景一:拉取并运行一个基础的 Ubuntu 容器

目标:从 Docker Hub 拉取最新的 Ubuntu 镜像,并创建一个名为 my-first-ubuntu 的容器,同时将 Windows 的 D:\docker-data 目录挂载到容器的 /app 目录。

  1. 拉取镜像

    docker pull ubuntu:latest
    
    • ubuntu 是镜像名。
    • :latest 是标签(tag),代表最新版本。
  2. 创建并启动容器

    docker run -dit --name my-first-ubuntu -v D:\docker-data:/app ubuntu /bin/bash
    
    • -d--detach:后台运行容器。
    • -i--interactive:保持标准输入开放。
    • -t--tty:分配一个伪终端。通常 -it 一起使用,以便进入容器交互。
    • --name my-first-ubuntu:为容器指定一个独一无二的名字。
    • -v D:\docker-data:/app--volume ...:挂载目录。格式为 宿主机路径:容器内路径
    • ubuntu:指定使用哪个镜像来创建容器。
    • /bin/bash:容器启动后要执行的命令。
  3. 查看正在运行的容器

    docker ps
    

    你应该能看到 my-first-ubuntu 正在运行。

  4. 进入容器

    docker exec -it my-first-ubuntu /bin/bash
    

    执行后,你的命令行提示符会改变,表示你已经进入了容器的内部。现在你可以像在一个独立的 Linux 系统中一样执行命令了。

  5. 在容器内操作

    • 查看当前目录:pwd (应该是 /)
    • 进入挂载的 /app 目录:cd /app
    • 创建一个文件:touch hello_from_container.txt
    • 退出容器:exit
  6. 验证挂载:退出容器后,回到 Windows 的 D:\docker-data 目录下,你会发现 hello_from_container.txt 文件已经存在于此。

场景二:运行一个 Web 应用(Nginx)

目标:运行一个 Nginx 服务器容器,并通过 Windows 的浏览器访问它。

  1. 拉取并运行 Nginx 容器

    docker run --name my-nginx -p 8080:80 -d nginx
    
    • -p 8080:80--publish ...:端口映射。格式为 宿主机端口:容器内端口。这里将宿主机的 8080 端口映射到容器的 80 端口(Nginx 默认端口)。
  2. 访问 Web 服务
    打开你的浏览器(如 Edge、Chrome),在地址栏输入 http://localhost:8080。如果看到 Nginx 的欢迎页面,说明一切正常。

场景三:构建自己的 Docker 镜像

目标:创建一个简单的 “Hello, Docker!” Node.js 应用,并为它构建一个 Docker 镜像。

  1. 创建项目文件
    在你的电脑上创建一个新文件夹 my-docker-app,并在其中创建两个文件。

    • app.js (应用代码)

      const http = require('http');
      const port = 3000;
      
      const server = http.createServer((req, res) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello, Docker!\n');
      });
      
      server.listen(port, () => {
        console.log(`Server running at http://localhost:${port}/`);
      });
      
    • Dockerfile (构建指令)

      # 使用官方 Node.js LTS 版本作为基础镜像
      FROM node:lts-alpine
      
      # 在容器中创建一个目录来存放应用代码
      WORKDIR /usr/src/app
      
      # 将 package.json 和 package-lock.json 复制到工作目录
      COPY package*.json ./
      
      # 安装应用依赖
      RUN npm install
      
      # 将你的应用源代码复制到容器的工作目录
      COPY . .
      
      # 暴露应用监听的端口
      EXPOSE 3000
      
      # 定义容器启动时运行的命令
      CMD [ "node", "app.js" ]
      
    • package.json (依赖描述)

      {
        "name": "my-docker-app",
        "version": "1.0.0",
        "description": "A simple Node.js app",
        "main": "app.js",
        "dependencies": {
          "express": "^4.18.2" 
        },
        "scripts": {
          "start": "node app.js"
        }
      }
      
  2. 构建镜像
    my-docker-app 文件夹中打开命令行,运行以下命令:

    docker build -t my-node-app:1.0 .
    
    • -t my-node-app:1.0:为镜像打上标签。my-node-app 是镜像名,1.0 是版本号。
    • .:表示 Dockerfile 所在的当前目录。
  3. 运行你自己的镜像

    docker run --name my-running-app -p 4000:3000 -d my-node-app:1.0
    
  4. 访问你的应用
    在浏览器中访问 http://localhost:4000,你应该能看到 “Hello, Docker!” 的字样。


七、常见问题与排错

问题现象 可能原因与解决方案
Docker 启动失败,提示 WSL 2 未安装 1. 按照本指南第三部分重新检查并安装 WSL 2。
2. 确保 BIOS/UEFI 中的虚拟化功能已开启。
拉取镜像速度极慢或失败 1. 检查网络连接。
2. 按照本指南第五部分第2点配置国内镜像加速器。
挂载目录后,容器内无法访问或权限错误 1. 检查路径格式是否正确。
2. 如果在 WSL 中操作,推荐使用 WSL 的路径(如 ~)而非 Windows 路径。
3. Windows 路径中的反斜杠 \ 在某些情况下需要转义为 \\
docker ps 看不到容器,但 docker ps -a 可以 容器已经停止运行。使用 docker logs <容器名> 查看日志,分析为何退出。
端口映射后,无法从宿主机访问 1. 检查端口映射命令是否正确 (-p host_port:container_port)。
2. 检查容器内的应用是否监听在 0.0.0.0 而非 127.0.0.1
3. 检查 Windows 防火墙是否有相关拦截规则。

八、下一步与进阶方向

当你掌握了以上基础后,可以探索以下方向:

  1. Docker Compose:学习如何使用 docker-compose.yml 文件来定义和管理多个容器的应用(例如,一个 Web 应用 + 一个数据库)。
  2. Dockerfile 最佳实践:深入学习如何编写更高效、更安全、更小的 Docker 镜像。
  3. CI/CD 集成:将 Docker 融入到你的自动化构建和部署流程中(例如使用 GitHub Actions)。
  4. Kubernetes (K8s):当你需要管理成百上千个容器时,学习 Kubernetes 这个容器编排系统将是你的下一个目标。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐