理论篇
🧱 一、核心作用(一句话总结)
Docker 将应用 + 运行环境(代码、库、配置、系统工具等)打包成一个轻量、可移植的"容器",在任何支持 Docker 的机器上一致地运行。
🔍 二、为什么需要 Docker?(解决什么问题)
| 传统开发/部署痛点 | Docker 如何解决 |
|---|---|
| "在我机器上能跑!" (开发、测试、生产环境不一致) | 容器包含完整运行环境,消除"环境差异" |
| 依赖冲突 (比如 Python 2 和 Python 3 项目共存) | 每个容器独立环境,互不干扰 |
| 部署复杂 (安装一堆依赖、配置服务) | docker run 一条命令启动整个应用 |
| 资源浪费 (虚拟机太重,每个 VM 几 GB) | 容器共享宿主机内核,启动快、占用少(MB 级) |
| 扩展困难 (手动复制多份服务) | 快速复制容器,实现秒级水平扩展 |
📦 三、Docker 的核心概念
✅ 四、总结表格
| 名称 | 用途 | 类比 |
|---|---|---|
| Containers | 运行中的应用实例 | 虚拟机 / 正在运行的程序 |
| Images | 镜像模板(可运行的基础) | 安装包 / ISO 文件 |
| Volumes | 数据持久化存储 | U盘 / 硬盘分区 |
| Kubernetes | 多容器集群管理 | 服务器编排系统 |
| Builds | 构建自定义镜像 | 编译打包工具 |
| MCP Toolkit | 微软云集成工具 | Azure 集成插件 |
| Docker Hub | 公共镜像仓库 | 软件下载站 |
| Docker Scout | 安全扫描 | 杀毒软件 |
| Extensions | 第三方功能扩展 | 插件市场 |
🐦 五、分解表格:
Docker Desktop 的左侧导航栏,显示了 Docker 管理的核心功能模块。下面我来逐个解读这些概念,并说明它们的作用。
🧩 1. Containers(容器)
🔹 当前选中项
- 作用:查看和管理所有正在运行或已停止的 Docker 容器。
- 类比:就像"虚拟机"或"运行中的程序"。
- 常见操作 :
- 启动/停止/删除容器
- 查看日志、端口映射、资源使用情况
- 进入容器执行命令(
docker exec)
✅ 你平时运行 tomcat:latest 或 nginx 都会在这里看到对应的容器。
🖼️ 2. Images(镜像)
- 作用 :查看本地下载的 Docker 镜像(如
tomcat:latest、hello-world)。 - 类比:就像"软件安装包"或"系统 ISO 文件"。
- 常见操作 :
- 拉取新镜像(
docker pull) - 删除旧镜像(
docker rmi) - 查看镜像大小、创建时间
- 拉取新镜像(
📌 注意:镜像是只读模板,不能直接运行,必须通过它启动容器。
💾 3. Volumes(卷)
- 作用:管理数据持久化存储。
- 类比:相当于"硬盘分区"或"外部U盘",用于保存数据库、配置文件等重要数据。
- 特点 :
- 容器删除后,Volume 中的数据不会丢失
- 可在多个容器间共享
- 常见用途 :
- MySQL 数据库文件
- Tomcat 的
webapps目录 - Nginx 的静态资源
💡 例如:你可以把 F:\data 挂载到容器的 /var/lib/mysql,这样即使容器被删,数据还在。
🐳 4. Kubernetes
- 作用:管理 Kubernetes 集群(用于部署和管理多个容器应用)。
- 适用场景:企业级微服务架构,需要自动扩缩容、负载均衡、服务发现等功能。
- 说明 :
- Docker Desktop 内置轻量级 Kubernetes 环境
- 适合开发和测试 K8s 应用
- 生产环境通常使用独立的 K8s 集群
⚠️ 如果你是初学者,可以先忽略这个选项。
🔧 5. Builds(构建)
-
作用 :查看和管理 Docker 构建任务(如
docker build命令)。 -
核心功能:
- 编译自定义镜像(基于
Dockerfile) - 查看构建历史、缓存、错误日志
- 编译自定义镜像(基于
-
典型流程:
Bash
编辑
1docker run -d ` 2 --name ama2-tomcat ` 3 -p 8080:8080 ` 4 tomcat:latest→ 在这里可以看到构建进度和结果。
⚙️ 6. MCP Toolkit (BETA)
- 作用:微软云平台工具包(Microsoft Cloud Platform Toolkit),用于连接 Azure 和其他 Microsoft 服务。
- 状态:目前为 Beta 版本(测试阶段)。
- 适用人群:使用 Azure 的开发者,可方便地部署容器到 Azure。
📌 初学者可暂不关注。
🌐 7. Docker Hub
- 作用:访问 https://hub.docker.com,搜索和拉取官方镜像。
- 功能 :
- 浏览公开镜像(如
nginx,mysql,tomcat) - 推送私有镜像
- 管理账户、组织、仓库
- 浏览公开镜像(如
✅ docker pull tomcat:latest 命令就是从 Docker Hub 下载的。
🔍 8. Docker Scout
- 作用:安全扫描工具,检测镜像中的漏洞。
- 功能 :
- 自动分析镜像依赖
- 报告已知漏洞(如 CVE)
- 提供修复建议
- 适用场景:生产环境部署前的安全检查
📌 对于学习者来说,可以用来了解镜像安全性。
🧩 9. Extensions(扩展)
- 作用:安装第三方插件,增强 Docker Desktop 功能。
- 示例扩展 :
- Docker Compose:一键启动多个容器
- GitHub Codespaces:集成 GitHub 开发环境
- GitLab CI/CD:CI/CD 工具集成
- 优点:让 Docker Desktop 更强大、更易用
🛠️ 六、典型使用场景
1. 开发环境统一
- 团队成员用同一个 Docker 镜像,避免"你那能跑我这不行"
- 示例:前端用 Node.js 20,后端用 Python 3.11,数据库用 PostgreSQL ------ 全部容器化,一键启动
2. 持续集成/部署(CI/CD)
- 构建镜像 → 推送到仓库 → 在测试/生产环境拉取运行
- 实现自动化、标准化发布流程
3. 微服务架构
- 每个微服务(用户服务、订单服务等)打包成独立容器
- 用 Docker Compose 或 Kubernetes 编排管理
4. 快速搭建中间件
bash
# 30 秒启动一个 Redis
docker run -d --name my-redis redis
# 30 秒启动一个 MySQL
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
5. 隔离实验环境
- 安装有风险的软件?在容器里试,删掉容器就干净了!
⚡ 七、Docker vs 虚拟机(VM)
| 特性 | Docker 容器 | 虚拟机(VM) |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 轻量(共享 OS 内核) | 重量(每个 VM 跑完整 OS) |
| 隔离性 | 进程级隔离 | 硬件级隔离(更强) |
| 适用场景 | 应用交付、微服务 | 运行不同操作系统(如 Windows 上跑 Linux) |
✅ 大多数 Web 应用场景,Docker 足够且更高效。
实践操作篇(下载-安装-配置-运行第一个container)
1.下载直通车:
https://docs.docker.com/desktop/setup/install/windows-install/

2、安装前看:
默认安装解压在C盘,数据后续存储也在C盘,需要放其他盘的请看安装说明,默认C盘直接双击安装既可

3、安装:
安装路径说明:
Docker Desktop 安装目录: F:\Docker,
WSL2 数据目录:F:\wsl
安装包位置:F:\编程软件\Docker Desktop Installer.exe
把镜像、容器等大体积数据存到 F:\wsl
这由 --wsl-default-data-root 控制。
安装注意事项:
必须以管理员身份运行 PowerShell(否则安装会失败)
确保系统已启用 WSL2 和 虚拟机平台(若未启用,先运行 wsl --install 并重启)
安装命令说明:
| 参数 | 作用 |
|---|---|
--installation-dir=F:\docker |
将 Docker Desktop 主程序(exe、dll 等)安装到 F:\docker |
--wsl-default-data-root=F:\wsl |
最重要! 所有镜像、容器、卷等大体积数据将存入 F:\wsl\docker-desktop-data\ext4.vhdx |
--accept-license |
自动接受订阅协议,避免首次启动卡住 |
--quiet |
静默安装,无图形界面干扰 |
--backend=wsl-2 |
强制使用 WSL2 后端(推荐) |
powershell安装直通车:
# 定义路径
$InstallerPath = "F:\编程软件\Docker Desktop Installer.exe"
$InstallDir = "F:\docker"
$WslDataRoot = "F:\wsl"
# 创建目标目录(如果不存在)
if (-not (Test-Path $InstallDir)) {
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
}
if (-not (Test-Path $WslDataRoot)) {
New-Item -ItemType Directory -Path $WslDataRoot -Force | Out-Null
}
# 执行 Docker Desktop 安装
Start-Process -FilePath $InstallerPath -Wait -ArgumentList @(
'install',
'--accept-license',
'--quiet',
"--installation-dir=$InstallDir",
"--wsl-default-data-root=$WslDataRoot",
'--backend=wsl-2'
)
Write-Host "✅ Docker Desktop 安装完成!" -ForegroundColor Green
Write-Host " 主程序路径: $InstallDir" -ForegroundColor Cyan
Write-Host " WSL2 数据路径: $WslDataRoot" -ForegroundColor Cyan
✅ 安装后验证
检查目录是否生成
F:\docker\ → 应包含 Docker Desktop.exe 等文件
F:\wsl\docker-desktop-data\ext4.vhdx → 应存在(可能几百 MB 起)
启动 Docker Desktop
从开始菜单或 F:\docker\Docker Desktop.exe 启动
4、配置
1)、Docker Engine原配置:
原配json:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false
}
2)、配置镜像(2025年12月30日测试可用):
之后就不确定,因为目前国内镜像不稳定。
docker.desktop>>settings>>docker engine>>配置>>4. 点击 Apply & Restart

{
"features": {
"buildkit": true
},
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker-0.unsee.tech",
"https://docker.m.daocloud.io",
"https://ccr.ccs.tencentyun.com",
"https://hub.xdark.top",
"https://dhub.kubesre.xyz",
"https://docker.kejilion.pro",
"https://docker.xuanyuan.me",
"https://docker.hlmirror.com",
"https://run-docker.cn",
"https://docker.sunzishaokao.com",
"https://image.cloudlayer.icu",
"https://docker.tbedu.top",
"https://hub.crdz.gq",
"https://docker.melikeme.cn",
"https://xuanyuan.cloud"
]
}
测试加速器是否配置完成:
docker info

测试是否可以拉取:
docker pull hello-world

5、运行实例1:本地构建镜像,并在此基础上运行容器(项目:welcome-to-docker)
STEP1:下载官方指引新人用的示例文件 ,
当然有GIT也可以用代码下载。这里下载的路径要做下笔记。
https://github.com/docker/welcome-to-docker

STEP2:找到下载的dockerfile文件,在空白处右键打开power shell
docker build -t welcome-to-docker .
如果是第一次运行,他会拉取node:22-alpine

问?为什么下载本地文件还需要拉取镜像?
docker build -t welcome-to-docker 本身并不需要 node:22-alpine ------
真正需要它的是你的 Dockerfile 内容。
因为你项目的
Dockerfile里写了FROM node:22-alpine,所以构建时必须拉取这个基础镜像。
Docker 构建过程是"从零开始搭环境",而 node:22-alpine 提供了:
- Node.js 运行时(版本 22)
- npm 包管理器
- 轻量 Linux 系统(Alpine)
没有它,你的 Node.js 应用就无法运行。
🔍 详细解释
1. Docker 镜像是分层构建的
你的 Dockerfile 通常长这样(来自 welcome-to-docker 项目):
Dockerfile
编辑
1# 第1行:指定基础镜像 ← 关键!
2FROM node:22-alpine
3
4# 第2行:设置工作目录
5WORKDIR /app
6
7# 第3行:复制 package.json
8COPY package*.json ./
9
10# 第4行:安装依赖
11RUN npm install
12
13# 第5行:复制源码
14COPY . .
15
16# 第6行:暴露端口
17EXPOSE 3000
18
19# 第7行:启动应用
20CMD ["npm", "start"]
FROM node:22-alpine是所有后续操作的基础- 如果没有这行,Docker 不知道该用什么系统、有没有 Node.js
2. 为什么选 node:22-alpine?
| 原因 | 说明 |
|---|---|
| ✅ 官方支持 | Docker Hub 上由 Node.js 团队维护 |
| ✅ 版本明确 | Node.js 22 是当前 LTS(长期支持版) |
| ✅ 体积小 | Alpine 基础镜像仅 ~120MB,适合容器化 |
| ✅ 安全性高 | 最小化攻击面,无多余软件 |
3. 能不能不用 node:22-alpine?
可以!但你必须提供 Node.js 环境,比如:
方案一:换其他 Node 镜像
Dockerfile
编辑
1FROM node:22-slim # Debian 基础,兼容性更好
2# 或
3FROM node:22 # 完整 Debian,体积大(~1GB)
方案二:自己装 Node(不推荐)
Dockerfile
编辑
1FROM alpine:latest
2RUN apk add --no-cache nodejs npm
3# ...后续步骤
→ 更复杂,容易出错,且失去官方镜像优化
方案三:用多阶段构建(高级)
Dockerfile
编辑
1# 构建阶段
2FROM node:22-alpine AS builder
3...
4
5# 运行阶段
6FROM alpine:latest
7# 手动复制 node 二进制和产物 → 极复杂
💡 结论:直接用
node:22-alpine是最简单、最标准的做法
🧪 举个反例:如果删掉 FROM 会怎样?
如果你的 Dockerfile 没有 FROM 行:
Dockerfile
编辑
1# ❌ 错误!没有基础镜像
2COPY . .
3RUN npm install
执行 docker build 会报错:
Text
编辑
1ERROR: failed to solve: dockerfile parse error: base image must be specified
📌 总结
| 问题 | 答案 |
|---|---|
为什么需要 node:22-alpine? |
因为你的 Dockerfile 用它作为基础环境 |
| 能不用吗? | 可以换其他 Node 镜像,但不能完全不用(除非自己搭建环境) |
| 它是必须的吗? | 对于 Node.js 应用 → 是的,必须有一个包含 Node 的基础镜像 |
| 为什么选 Alpine? | 小、快、安全,适合容器 |
💡 建议
- 如果你在中国大陆,配置镜像加速器 后再构建(否则拉取
node:22-alpine会超时) - 如果遇到 native 模块编译失败(如
bcrypt),可改用node:22-slim
你的
welcome-to-docker项目是一个纯 JavaScript 应用(无 native 依赖),node:22-alpine是最佳选择 ✅
STEP3:查看images
然后你会得到新建的第一个images ,在docker.desktop可以看到:

STEP4:运行,启动容器并映射 3000 端口
docker run -d -p 3000:3000 --name demo welcome-to-docker

端口画面:

命令结构分解:
| 部分 | 含义 | 详细说明 |
|---|---|---|
docker run |
启动一个新容器 | 这是 Docker 最常用的命令之一,用于从镜像创建并运行一个容器 |
-d |
detached mode(后台运行) | 容器在后台运行,不会占用当前终端。如果不加 -d,日志会直接输出到你的终端,且你无法继续输入其他命令(除非按 Ctrl+C,但这会停止容器) |
-p 3000:3000 |
端口映射(Port mapping) | 格式:-p <主机端口>:<容器端口> • 主机(你的 Windows/Mac/Linux 电脑)的 3000 端口 → 映射到容器内部的 3000 端口 • 这样你就能通过 http://localhost:3000 访问容器里的服务 |
--name demo |
给容器起个名字 | 默认情况下,Docker 会给容器分配一个随机名字(如 festive_golick)。用 --name demo 可以指定为 demo,方便后续管理(比如 docker stop demo、docker logs demo) |
welcome-to-docker |
使用的镜像名称 | 表示使用本地名为 welcome-to-docker 的镜像来启动容器(这个镜像是你之前通过 docker build -t welcome-to-docker . 构建的) |
🌐 端口映射详解:-p 3000:3000
- 左边
3000:你电脑上的端口(Host) - 右边
3000:容器内部应用监听的端口(Container)
STEP5命令行简单控制
可以用以下命令管理它:
powershell:
1docker logs demo # 查看日志
2docker stop demo # 停止容器
3docker start demo # 重新启动
4docker rm demo # 删除容器(需先停止)
6、运行实例2:直接创建tomcat镜像的容器并解决404映射端口问题。
docker run -d
` --name ama2-tomcat
` -p 8080:8080
` tomcat:latest
✅ 详细解释
Docker 在执行 docker run 时的镜像处理逻辑:
- 检查本地是否存在 tomcat:latest 镜像
- 执行:docker images | findstr tomcat
- 如果存在 →直接用本地镜像启动容器
- 如果不存在 → 自动执行 docker pull tomcat:latest,从 Docker Hub下载,然后再启动容器
📌 这是 docker run 的默认行为:自动拉取远程镜像(如果本地缺失)
🔍 运行结果:
首次运行(本地无镜像):
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
...
Status: Downloaded newer image for tomcat:latest
然后容器启动。
再次运行(已有镜像):
直接启动容器,不会重新拉取(除非你加 --pull=always)
运行情况

综合分析
✅ 1. 容器已成功启动
Powershell
docker run -d --name ama2-tomcat -p 8080:8080 tomcat:latest
→ 命令执行成功,返回了容器 ID:
169...b7
说明:
- Tomcat 镜像存在
- 端口映射正常
- 容器已创建并运行
✅ 容器没问题!
❌ 2. 为什么是 404?
虽然容器运行了,但访问 http://localhost:8080 返回 404 - 未找到,说明:
🚨 Tomcat 的默认欢迎页(ROOT 应用)没有被正确部署或加载
📌 3.根本原因分析
在 Docker 中,tomcat:latest 镜像自带一个 ROOT Web 应用,它应该提供:
http://localhost:8080/
→ 显示欢迎页面。
但如果发生以下情况之一,就会导致 404:
| 可能原因 | 解释 |
|---|---|
挂载了 webapps 目录 |
如果你在运行时加了 -v F:\docker:/usr/local/tomcat/webapps,会覆盖原生的 ROOT 应用 |
webapps/ROOT 被删除或替换 |
挂载后可能为空目录或损坏文件 |
Tomcat 启动时未解压 ROOT.war |
极少数情况下,镜像层问题 |
❕️ 4.确认问题:
-
Tomcat 10+(包括 Tomcat 11) 遵循 Jakarta EE 9+ 规范,包名从
javax.*改为jakarta.* -
官方 Docker 镜像
tomcat:latest现在默认指向 Tomcat 11 -
从 Tomcat 10 开始,官方镜像不再内置
ROOT欢迎应用!-
即:
/usr/local/tomcat/webapps/目录是 空的 -
所以访问
/会返回 404 -
验证:
docker exec ama2-tomcat ls -l /usr/local/tomcat/webapps/
返回:
total 0→ **空目录!没有
ROOT,也没有 `ROOT.war -
❓️解决404画面------解决方案(任选其一):
✅ 方案一:部署一个简单的欢迎页(推荐)
步骤 1:创建本地测试目录
Powershell
编辑
mkdir F:\docker\root -Force
2Set-Content F:\docker\root\index.html -Value "<h1>Welcome to Tomcat 11!</h1>"
步骤 2:挂载为 ROOT 应用
Powershell
编辑
1# 先删除旧容器
2docker rm -f ama2-tomcat
3
4# 启动新容器,挂载到 ROOT
5docker run -d `
6 --name ama2-tomcat `
7 -p 8080:8080 `
8 -v F:\docker\root:/usr/local/tomcat/webapps/ROOT `
9 tomcat:latest
💡 注意:挂载到
.../webapps/ROOT(不是webapps),这样访问/就会加载这个目录。
步骤 3:访问
✅ 显示 "Welcome to Tomcat 11!"
✅ 方案二:使用带欢迎页的旧版 Tomcat(如 Tomcat 9)
如果你需要默认欢迎页,可以指定旧版本:
Powershell
编辑
1docker run -d --name ama2-tomcat -p 8080:8080 tomcat:9-jdk11
tomcat:9仍包含ROOT欢迎页- 访问
http://localhost:8080会直接显示 Apache Tomcat 页面
✅ 方案三:手动添加 ROOT.war(高级)
你可以从 Tomcat 9 的镜像中提取 ROOT 应用,或自己打包一个。
但对大多数用户,方案一更简单可靠。
👀验证是否成功
Powershell
编辑
1# 查看 webapps 内容
2docker exec ama2-tomcat ls -l /usr/local/tomcat/webapps/
3
4# 应该看到:
5# drwxr-xr-x 2 root root ... ROOT
✅ 总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
http://localhost:8080 返回 404 |
Tomcat 11 默认无 ROOT 应用 |
挂载自己的 ROOT 目录,或使用 tomcat:9 |
🔧 推荐命令(立即生效):
Powershell
编辑
#清理
docker rm -f ama2-tomcat
#创建欢迎页
mkdir F:\docker\root -Force
Set-Content F:\docker\root\index.html -Value "<h1>Hello from Tomcat 11!</h1>"
#启动
docker run -d --name ama2-tomcat -p 8080:8080 -v F:\docker\root:/usr/local/tomcat/webapps/ROOT tomcat:latest
然后访问:
✅ 成功显示自定义页面!
附录篇:Docker 核心命令速查
1. 镜像(Image)管理
| 命令 | 说明 |
|---|---|
docker images |
列出本地所有镜像 |
docker pull <image> |
从仓库拉取镜像(如 docker pull tomcat:9) |
docker build -t <name>:<tag> . |
从当前目录的 Dockerfile 构建镜像 |
docker rmi <image> |
删除本地镜像 |
docker tag <src> <target> |
给镜像打标签(用于重命名或准备推送) |
docker push <image> |
将镜像推送到仓库(如 Docker Hub) |
2. 容器(Container)管理
| 命令 | 说明 |
|---|---|
docker ps |
查看正在运行的容器 |
docker ps -a |
查看所有容器(包括已停止的) |
docker run [OPTIONS] <image> |
启动新容器 常用选项: -d 后台运行 -p host:container 端口映射 -v host:container 挂载卷 --name name 指定容器名 -it 交互式终端 |
docker start/stop/restart <container> |
启动 / 停止 / 重启容器 |
docker rm <container> |
删除容器(需先停止) |
docker rm -f <container> |
强制删除正在运行的容器 |
docker exec -it <container> /bin/bash |
进入运行中的容器执行命令 |
docker logs [-f] <container> |
查看容器日志(-f 实时跟踪) |
3. 数据卷(Volume)
| 命令 | 说明 |
|---|---|
docker volume ls |
列出所有数据卷 |
docker volume create <name> |
创建数据卷 |
docker volume rm <name> |
删除数据卷 |
docker run -v <host_path>:<container_path> ... |
挂载主机目录到容器 |
docker run -v <volume_name>:<container_path> ... |
使用命名数据卷 |
4. 网络(Network)
| 命令 | 说明 |
|---|---|
docker network ls |
列出所有网络 |
docker network create <name> |
创建自定义网络 |
docker run --network=<name> ... |
将容器加入指定网络 |
| 容器间可通过 容器名 直接通信(在自定义网络中) |
5. 系统与信息
| 命令 | 说明 |
|---|---|
docker info |
显示 Docker 系统信息 |
docker version |
查看 Docker 版本 |
docker system df |
查看磁盘使用情况(镜像、容器、卷等) |
docker system prune |
清理未使用的容器、镜像、网络、缓存(加 -a 可删所有未用镜像) |