docker|F盘安装の1键部署软件及数据储存+2个保姆级运行实例

理论篇

🧱 一、核心作用(一句话总结)

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:latestnginx 都会在这里看到对应的容器。


🖼️ 2. Images(镜像)

  • 作用 :查看本地下载的 Docker 镜像(如 tomcat:latesthello-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 demodocker 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:访问

👉 http://localhost:8080

✅ 显示 "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

然后访问:

👉 http://localhost:8080

✅ 成功显示自定义页面!

附录篇: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 可删所有未用镜像)
相关推荐
@时间旅行者@2 小时前
LINUX离线安装postgres,rpm方式安装
linux·运维·服务器·postgresql·离线安装
whlqjn_12112 小时前
Ubuntu 20.04图形界面卸载
linux·运维·ubuntu
杨云龙UP2 小时前
SQL Server 2016通过SSMS(SQL Server Management Studio)图形界面完成创建用户和授权_20251230
运维·服务器·数据库
可爱又迷人的反派角色“yang”2 小时前
GitLab配置与git集成实践
linux·网络·git·docker·云计算·gitlab
斯普信云原生组2 小时前
Linux 平台 Redis Insight 安装卸载与常见问题
linux·运维·redis
qq_416276422 小时前
linux bashrc写各种离线库路径并验证
linux·运维·服务器
航Hang*3 小时前
第二章:网络系统建设与运维(中级)——华为设备基本命令
运维·计算机网络·华为·ensp·交换机
专注VB编程开发20年3 小时前
VB6 UIAutomation 自动化查找元素
运维·自动化·uiautomation·uia
zzhclc3 小时前
pyrosm windows 如何搭建环境 使用conda
linux·运维·服务器