Docker for Windows 完整教程
目录
- 前置条件:你需要什么?
- 第一步:安装 Docker Desktop for Windows
- 第二步:验证安装与配置
- 第三步:核心概念快速入门
- 镜像
- 容器
- Dockerfile
- 第四步:实战演练 - 部署一个 Nginx 网站
- 第五步:实战演练 - 构建一个自定义 Web 应用
- 创建一个简单的 Node.js 应用
- 编写 Dockerfile
- 构建镜像
- 运行容器
- 第六步:常用 Docker 命令速查
- 第七步:Docker Compose 简介(多容器应用)
- 常见问题与解决方案
前置条件:你需要什么?
在安装 Docker 之前,请确保你的 Windows 系统满足以下要求:

- 操作系统版本:
- Windows 10 64-bit: Pro, Enterprise, or Education (Build 16299 or higher)
- Windows 11 64-bit: Home, Pro, Enterprise, or Education
- 硬件要求:
- CPU:支持虚拟化技术,这通常在 BIOS 中默认开启,但某些情况下可能需要手动检查。
- 内存:至少 4GB RAM,推荐 8GB 或更多。
- 硬盘空间:至少 20GB 可用空间。
- 虚拟化技术:
- Hyper-V:Docker for Windows 依赖于 Hyper-V 来创建轻量级的虚拟机(Linux VM)来运行容器,Windows 10/11 的专业版和企业版通常默认包含 Hyper-V。
- WSL 2 (Windows Subsystem for Linux 2):这是 Docker Desktop 的推荐后端,它提供了一个完整的 Linux 内核,性能更好,与 Windows 文件系统集成更紧密,WSL 2 通常会随 Docker Desktop 自动安装和配置。
如何检查 Hyper-V 是否已启用?
- 打开“控制面板” -> “程序” -> “程序和功能” -> “启用或关闭 Windows 功能”。
- 在列表中勾选 “Hyper-V” 和 “适用于 Linux 的 Windows 子系统”。
- 点击“确定”,系统会自动重启并安装所需组件。
第一步:安装 Docker Desktop for Windows
Docker for Windows 现在被称为 Docker Desktop,安装过程非常简单。
-
下载安装程序
- 访问 Docker 官网下载页面:https://www.docker.com/products/docker-desktop/
- 点击 "Download for Windows" 下载
.exe安装文件。
-
运行安装程序
(图片来源网络,侵删)- 双击下载的
Docker Desktop Installer.exe文件。 - 按照安装向导的提示进行操作,通常只需一路点击 "Next" 或 "OK" 即可。
- 双击下载的
-
启动 Docker Desktop
- 安装完成后,Docker Desktop 会自动启动,你会在 Windows 任务栏的右下角看到 Docker 的鲸鱼图标。
- 首次启动时,Docker 可能需要下载一些初始组件(如 Linux 内镜),这需要一些时间,请耐心等待。
第二步:验证安装与配置
当 Docker 图标从静止变为活动状态(或显示绿色的对勾)时,表示 Docker 服务已成功启动。
-
打开命令行工具
- 打开 PowerShell 或 命令提示符 (CMD)。
-
运行
docker version命令
(图片来源网络,侵删)docker version
如果安装成功,你将看到客户端和服务端的版本信息,表明 Docker 可以与守护进程通信。
-
运行
docker run hello-world命令docker run hello-world
这个命令会从 Docker Hub 下载一个
hello-world镜像,并在容器中运行它,如果一切正常,你会看到一条欢迎消息,这证明了你的 Docker 环境已经完全可用。
第三步:核心概念快速入门
在开始实战前,理解这三个核心概念至关重要。
-
镜像
- 是什么:一个只读的模板,用来创建容器,可以把它想象成一个虚拟机的快照或安装光盘的 ISO 文件。
- 特点:包含了运行某个应用所需的所有代码、运行时、库、环境变量和配置文件。
- 来源:可以从 Docker Hub 这样的公共仓库拉取,也可以自己创建。
-
容器
- 是什么:镜像的运行实例,它是轻量级、可移植、自包含的执行环境。
- 特点:一个镜像可以运行多个容器,每个容器都是相互隔离的,拥有自己的文件系统、进程空间和网络栈。
- 类比:如果镜像是“蓝图”,那么容器就是“根据蓝图建造好的房子”。
-
Dockerfile
- 是什么:一个文本文件,包含了构建 Docker 镜像所需的所有指令。
- 作用:它记录了如何从一个基础镜像开始,一步步添加代码、安装依赖、配置环境,最终创建出你所需的自定义镜像,这确保了构建过程的自动化和可重复性。
第四步:实战演练 - 部署一个 Nginx 网站
让我们用最简单的方式体验 Docker:直接运行一个现成的 Nginx Web 服务器。
-
运行 Nginx 容器 在 PowerShell 中执行以下命令:
docker run --name my-web-server -d -p 8080:80 nginx
--name my-web-server:给容器起一个容易记的名字。-d:在后台(Detached mode)运行容器。-p 8080:80:将主机的 8080 端口映射到容器的 80 端口,这样你就可以通过http://localhost:8080访问 Nginx 服务。nginx:要运行的镜像名称。
-
验证容器是否运行
docker ps
你应该能看到
my-web-server容器正在运行。 -
访问网站 打开你的浏览器,访问
http://localhost:8080,你应该能看到 Nginx 的欢迎页面。 -
停止并删除容器 当你使用完后,可以清理掉这个容器。
- 停止容器:
docker stop my-web-server
- 删除容器:
docker rm my-web-server
- 停止容器:
第五步:实战演练 - 构建一个自定义 Web 应用
我们来构建自己的应用并为其创建 Docker 镜像,我们将创建一个简单的 Node.js "Hello World" 应用。
A. 创建一个简单的 Node.js 应用
-
创建一个项目文件夹:
mkdir my-docker-app cd my-docker-app
-
创建
package.json文件: 在my-docker-app文件夹中,创建一个名为package.json的文件,内容如下:{ "name": "my-docker-app", "version": "1.0.0", "description": "A simple Node.js app for Docker", "main": "server.js", "scripts": { "start": "node server.js" }, "author": "", "license": "ISC" } -
创建
server.js文件: 在同一文件夹下,创建server.js如下:const http = require('http'); const hostname = '0.0.0.0'; // 监听所有网络接口,以便从容器外部访问 const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello from Docker!\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
B. 编写 Dockerfile
在 my-docker-app 文件夹中,创建一个名为 Dockerfile(没有后缀名)的文件,内容如下:
# 1. 使用官方的 Node.js 镜像作为基础镜像 # alpine 是一个轻量级的 Linux 发行版 FROM node:18-alpine # 2. 在容器内创建一个工作目录 WORKDIR /usr/src/app # 3. 将 package.json 和 package-lock.json (如果存在) 复制到工作目录 # 这一步可以充分利用 Docker 的缓存机制 COPY package*.json ./ # 4. 运行 npm install 安装应用依赖 RUN npm install # 5. 将应用代码(当前目录下的所有文件)复制到工作目录 COPY . . # 6. 暴露容器将要监听的端口 EXPOSE 3000 # 7. 定义容器启动时要执行的命令 # 这里相当于在容器内执行 'npm start' CMD [ "npm", "start" ]
C. 构建镜像
在 my-docker-app 文件夹下,打开 PowerShell,执行以下命令来构建镜像:
docker build -t my-node-app .
-t my-node-app:给镜像打上my-node-app的标签。- 表示 Dockerfile 位于当前目录。
构建完成后,你可以用 docker images 命令查看新创建的镜像。
D. 运行容器
基于我们刚刚构建的镜像来运行一个容器:
docker run --name my-app-container -d -p 4000:3000 my-node-app
-p 4000:3000:将主机的 4000 端口映射到容器的 3000 端口。
E. 验证结果
打开浏览器,访问 http://localhost:4000,你应该能看到页面显示 "Hello from Docker!"。
第六步:常用 Docker 命令速查
| 命令 | 描述 | 示例 |
|---|---|---|
docker pull <image> |
从仓库拉取一个镜像 | docker pull nginx |
docker run <options> <image> |
运行一个容器 | docker run -d -p 80:80 nginx |
docker ps |
列出当前正在运行的容器 | docker ps |
docker ps -a |
列出所有容器(包括已停止的) | docker ps -a |
docker stop <container> |
停止一个正在运行的容器 | docker stop my-app-container |
docker start <container> |
启动一个已停止的容器 | docker start my-app-container |
docker rm <container> |
删除一个已停止的容器 | docker rm my-app-container |
docker rmi <image> |
删除一个镜像 | docker rmi my-node-app |
docker logs <container> |
查看容器的日志输出 | docker logs my-app-container |
docker exec -it <container> <command> |
在运行的容器中执行命令 | docker exec -it my-app-container sh |
docker build -t <tag> . |
根据 Dockerfile 构建镜像 | docker build -t my-app . |
第七步:Docker Compose 简介
当你需要管理多个容器(例如一个 Web 服务器 + 一个数据库)时,手动使用 docker run 会变得很复杂。Docker Compose 就是解决这个问题的工具。
- 是什么:一个用于定义和运行多容器 Docker 应用程序的工具。
- 如何工作:你通过一个
docker-compose.yml文件来定义你的应用服务(如web,db),然后使用一个命令就可以启动和停止整个应用。
docker-compose.yml 示例(简化版)
version: '3.8'
services:
web:
build: .
ports:
- "4000:3000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
- 启动所有服务:
docker-compose up -d - 停止并删除所有服务:
docker-compose down
对于初学者,先掌握单容器操作,再学习 Docker Compose 会更容易。
常见问题与解决方案
-
问题:
docker run提示docker: Error response from daemon: driver failed programming external connectivity on endpoint...- 原因:通常是因为 Hyper-V 或 WSL 2 配置有问题,或者端口已被其他程序占用。
- 解决:
- 检查端口是否被占用:
netstat -ano | findstr :8080 - 尝试重启 Docker Desktop。
- 确保 Windows 的 Hyper-V 功能已正确启用。
- 检查端口是否被占用:
-
问题:Docker Desktop 启动很慢,或者一直卡在 "Starting..."。
- 原因:可能是虚拟机磁盘空间不足,或系统资源紧张。
- 解决:
- 检查 C 盘空间。
- 在 Docker Desktop 设置中,可以尝试切换 WSL 2 和 Hyper-V 后端(设置 -> General -> "Use the WSL 2 based engine")。
-
问题:在 Windows 中编辑文件,容器内没有实时更新。
- 原因:Docker 默认将文件挂载为只读。
- 解决:在
docker run命令中使用-v参数进行数据卷挂载,并确保路径正确,或者,在 Docker Desktop 设置中启用 "File sharing" 并添加你的项目目录。
