沉梦手记 沉梦手记
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 音视频处理
  • Linux 与容器化运维
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 音视频处理
  • Linux 与容器化运维
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 网络

  • 操作系统

    • 硬件结构
    • Windows命令行基础
    • WSL2的安装与使用
      • 什么是 WSL?
        • WSL2 vs WSL1:为什么选 WSL2?
        • WSL1 和 WSL2 的关系
      • 安装 WSL2
        • 前置要求
        • 方式一:一键安装(推荐,Win11 / 较新 Win10)
        • 方式二:手动安装(老版本 Win10 或一键安装失败)
        • 初始化 Ubuntu
        • 验证安装
        • 安装其他发行版
      • 基础配置
        • 1. 换国内软件源(加速 apt)
        • 2. 启用 systemd(Win11 推荐)
        • 3. 限制 WSL2 内存占用
        • 4. 配置默认用户
      • 日常使用
        • 进入 WSL
        • 常用 WSL 命令(在 PowerShell / CMD 中执行)
        • 文件互访
        • VS Code 集成(推荐开发方式)
      • 在 WSL2 中安装 Docker
        • 安装 Docker
        • 配置 Docker 镜像加速
        • Docker Compose
      • 网络与端口
        • WSL2 访问 Windows 服务
        • Windows 访问 WSL2 服务
        • 获取 WSL2 的 IP 地址
        • 固定 WSL2 IP(可选)
      • 常见问题
        • Q1: WSL2 占用内存越来越大?
        • Q2: Windows 重启后 WSL 里的 Docker 没启动?
        • Q3: wsl --install 下载很慢?
        • Q4: 报错 WslRegisterDistribution failed with error: 0x800701bc?
        • Q5: 报错 0x80370102(虚拟机无法启动)?
        • Q6: 如何迁移 WSL2 到其他磁盘?
        • Q7: 如何在多个 WSL 发行版之间切换?
      • 实用配置示例:Docker Compose 部署开发环境
        • restart 重启策略说明
        • 部署项目:复用组件还是新建?
        • 示例:若依项目部署
        • environment 是可选的
        • 什么时候分开?
        • 项目容器内如何连接 MySQL/Redis?
        • 端口映射易错点:容器内端口 vs Windows 访问端口
      • WSL2 架构简述
      • 学习参考
  • 数据结构与算法

  • 计算机基础
  • 操作系统
沉梦听雨
2026-07-22
目录

WSL2的安装与使用

# WSL2的安装与使用

# 什么是 WSL?

WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)是微软在 Windows 10/11 中内置的 Linux 兼容层,让你无需虚拟机或双系统,直接在 Windows 上运行 Linux 环境。

目前有两个版本:

版本 架构 Linux 内核 Docker 支持 文件系统性能 兼容性
WSL1 系统调用翻译层 无(转译为 Windows 调用) ❌ 不支持 Windows 文件快 部分软件不兼容
WSL2 轻量级虚拟机 ✅ 完整 Linux 内核 ✅ 原生支持 Linux 文件快 接近 100%

# WSL2 vs WSL1:为什么选 WSL2?

WSL2 全面优于 WSL1,日常使用务必选 WSL2:

  1. 完整 Linux 内核:WSL2 运行真正的 Linux 内核(微软维护),几乎所有 Linux 软件都能跑
  2. 原生 Docker 支持:WSL1 跑不了 Docker,WSL2 可以直接安装 Linux 版 Docker
  3. systemd 支持:Win11 上的 WSL2 支持 systemd,可以用 systemctl 管理服务
  4. 性能更好:在 Linux 文件系统(/home/)下 I/O 性能远超 WSL1

⚠️ 唯一例外:如果你的项目文件放在 Windows 盘(/mnt/c/)下且需要频繁读写,WSL1 的跨文件系统性能反而更好。但一般建议把项目放在 WSL 内部(~/projects/),用 WSL2。

# WSL1 和 WSL2 的关系

WSL1 和 WSL2 共用同一套安装机制,不需要分别安装。区别只在于版本切换:

  • wsl --install 在新系统上默认安装 WSL2
  • WSL1 通过 wsl --set-version 命令切换即可,无需单独安装
# 把某个发行版降级为 WSL1
wsl --set-version Ubuntu-22.04 1

# 升回 WSL2
wsl --set-version Ubuntu-22.04 2

# 设置以后新安装的发行版默认用哪个版本
wsl --set-default-version 1   # 默认 WSL1
wsl --set-default-version 2   # 默认 WSL2(推荐)
1
2
3
4
5
6
7
8
9

⚠️ 老版本 Windows 10(内部版本 19041 之前)只支持 WSL1,没有 WSL2。这种系统上 wsl --install 装的就是 WSL1。建议升级 Windows 到较新版本以使用 WSL2。


# 安装 WSL2

# 前置要求

  • Windows 10 版本 2004+(内部版本 19041+)或 Windows 11
  • BIOS 中已开启虚拟化(Intel VT-x / AMD-V),一般默认开启
  • 查看系统版本:Win + R → winver

# 方式一:一键安装(推荐,Win11 / 较新 Win10)

以管理员身份打开 PowerShell(右键开始菜单 → "终端(管理员)"),执行:

wsl --install
1

这条命令会自动完成:

  1. 启用 Virtual Machine Platform 和 WSL 功能
  2. 下载并安装 WSL2 Linux 内核
  3. 设置 WSL2 为默认版本
  4. 安装默认发行版(Ubuntu)

安装完成后重启电脑。

⚠️ 注意:在某些 Windows 版本上,wsl --install 只会启用功能并安装内核,不会自动安装发行版。重启后执行 wsl -l -v 如果提示"没有已安装的分发",需手动安装发行版:

# 查看可用发行版
wsl --list --online

# 安装 Ubuntu 22.04
wsl --install -d Ubuntu-22.04
1
2
3
4
5

也可以打开 Microsoft Store 搜索 "Ubuntu 22.04 LTS" 安装(通常比命令行下载快)。

# 方式二:手动安装(老版本 Win10 或一键安装失败)

步骤 1:启用 WSL 和虚拟机平台功能

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
1
2

重启电脑。

步骤 2:下载并安装 WSL2 Linux 内核更新包

  • 下载地址:https://aka.ms/wsl2kernel
  • 下载 wsl_update_x64.msi,双击安装

步骤 3:设置 WSL2 为默认版本

wsl --set-default-version 2
1

步骤 4:安装 Linux 发行版

  • 打开 Microsoft Store,搜索 "Ubuntu 22.04 LTS",点击安装
  • 或命令行安装:wsl --install -d Ubuntu-22.04

# 初始化 Ubuntu

首次启动 Ubuntu(开始菜单 → Ubuntu),会要求设置:

Installing, this may take a few minutes...
Please create a default UNIX user account.
The username only needs to match the name of a Linux user, not your Windows user.

Enter new UNIX username: cmty          ← 输入用户名(小写字母)
New password: 123456                 ← 输入密码(不显示字符,正常现象)
Retype new password: 123456          ← 再次输入确认
1
2
3
4
5
6
7

设置完成后进入 shell,安装成功。

# 验证安装

PowerShell 执行:

wsl -l -v
1

正常输出:

  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
1
2

⚠️ VERSION 列必须是 2。如果是 1,手动转换:

wsl --set-version Ubuntu-22.04 2
1

# 安装其他发行版

查看可用发行版:

wsl --list --online
1

安装指定发行版:

wsl --install -d Debian
wsl --install -d openSUSE-Tumbleweed
1
2

# 基础配置

# 1. 换国内软件源(加速 apt)

Ubuntu 默认使用国外源,下载慢。进入 Ubuntu shell 执行:

# Ubuntu 22.04 及更早版本
sudo sed -i 's|http://archive.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://security.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
1
2
3
4

ℹ️ Ubuntu 24.04 源文件路径改为 /etc/apt/sources.list.d/ubuntu.sources,需手动编辑该文件替换 URL。

# 2. 启用 systemd(Win11 推荐)

systemd 是 Linux 的初始化系统和服务管理器。启用后可以用 systemctl 管理 Docker、MySQL 等服务,和真实 Linux 体验一致。

sudo tee /etc/wsl.conf <<EOF
[boot]
systemd=true
EOF
1
2
3
4

PowerShell 执行 wsl --shutdown,重新进入 Ubuntu,验证:

systemctl status
1

# 3. 限制 WSL2 内存占用

可选,WSL2 自带 WSL Settings 可以进行图形化配置

WSL2 默认最多占用一半物理内存,且不主动释放。在 Windows 用户目录创建 C:\Users\你的用户名\.wslconfig:

[wsl2]
memory=8GB
processors=4
swap=2GB
1
2
3
4

按你电脑配置调整。修改后 PowerShell 执行 wsl --shutdown 重启生效。

# 4. 配置默认用户

如果安装时设置了用户名,但想切换默认登录用户为 root 或其他用户:

# 在 /etc/wsl.conf 中添加
sudo tee -a /etc/wsl.conf <<EOF

[user]
default=cmty
EOF

# 检查一下
cat /etc/wsl.conf
1
2
3
4
5
6
7
8
9

PowerShell 执行 wsl --shutdown 后重新进入生效。


# 日常使用

# 进入 WSL

方式 操作
开始菜单 搜索 "Ubuntu" → 点击打开
命令行 PowerShell / CMD 输入 wsl
Windows Terminal 推荐,支持多标签页(Win11 自带,Win10 从 Store 安装)
VS Code 安装 WSL 扩展,在 WSL shell 中执行 code . 打开项目

# 常用 WSL 命令(在 PowerShell / CMD 中执行)

wsl                          # 进入默认 WSL 实例
wsl -d Ubuntu-22.04          # 进入指定发行版
wsl -l -v                    # 查看所有发行版及版本
wsl --shutdown               # 关闭所有 WSL 实例(释放内存)
wsl --update                 # 更新 WSL 内核
wsl --unregister Ubuntu-22.04  # 卸载指定发行版(⚠️ 会删除所有数据)
wsl --export Ubuntu-22.04 D:\ubuntu-backup.tar   # 导出备份
wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\ubuntu-backup.tar  # 导入恢复
1
2
3
4
5
6
7
8

# 文件互访

方向 路径
Windows 访问 WSL 文件 资源管理器输入 \\wsl$\Ubuntu-22.04\home\cmty
WSL 访问 Windows 文件 /mnt/c/Users/你的用户名/(C 盘)、/mnt/d/(D 盘)

💡 性能建议:项目文件放在 WSL 内部(如 ~/projects/),I/O 性能比放在 Windows 盘(/mnt/c/)好 10 倍以上。用 VS Code WSL 模式编辑即可。

# VS Code 集成(推荐开发方式)

  1. Windows 安装 VS Code
  2. 安装扩展 WSL(微软官方)
  3. 在 WSL shell 中进入项目目录:
    cd ~/projects/my-app
    code .
    
    1
    2
  4. VS Code 会以 WSL 环境打开,左下角显示 WSL: Ubuntu-22.04,此时所有终端、调试、扩展都在 Linux 环境运行

# 在 WSL2 中安装 Docker

⚠️ 强烈建议:不要装 Docker Desktop(占内存大、启动慢、商用收费),直接在 WSL2 里装 Linux 版 Docker。

# 安装 Docker

# 一键安装(使用阿里云镜像加速)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 将当前用户加入 docker 组(免 sudo 运行 docker)
sudo usermod -aG docker $USER

# 启动 docker
# 未启用 systemd 时:
sudo service docker start

# 启用 systemd 后:
sudo systemctl enable docker
sudo systemctl start docker

# 验证安装
docker run hello-world
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

ℹ️ 加入 docker 组后需要重新登录或执行 newgrp docker 才能免 sudo。

# 配置 Docker 镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com"
  ]
}
EOF

# 启用 systemd 时(设置自动启动):
sudo systemctl daemon-reload
sudo systemctl restart docker

# 未启用 systemd 时:
sudo service docker restart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Docker Compose

Docker 20.10+ 已内置 docker compose 子命令(V2 版本),无需单独安装 docker-compose。

docker compose version   # 验证
1

# 网络与端口

# WSL2 访问 Windows 服务

WSL2 中可以直接用 localhost 访问 Windows 上运行的服务:

# Windows 上跑了一个服务在 8080 端口
curl http://localhost:8080
1
2

# Windows 访问 WSL2 服务

WSL2 的端口会自动转发到 Windows,直接用 localhost 即可:

# WSL 中启动一个服务
python3 -m http.server 8000
1
2

Windows 浏览器访问 http://localhost:8000 即可。

# 获取 WSL2 的 IP 地址

WSL2 每次重启 IP 可能变化(172.x.x.x 网段):

# 在 WSL 中执行
hostname -I
# 输出示例(可能返回多个 IP,用空格分隔):
# 172.20.123.45 172.17.0.1

# 或查看指定网卡
ip addr show eth0
1
2
3
4
5
6
7

💡 为什么会有多个 IP?

hostname -I 会返回所有网卡的 IP,常见的两个来源:

IP 来源 说明
172.20.123.45 WSL2 虚拟网卡(eth0) WSL2 实例本身的 IP,Windows 通过它和 WSL2 通信
172.17.0.1 Docker 的 docker0 网桥 安装 Docker 后自动创建,所有容器默认走这个网段(172.17.0.x)

日常开发基本不用关心这些 IP,因为 Windows 访问 WSL2/Docker 服务都可以直接用 localhost(自动端口转发)。只有在需要从局域网其他设备访问、或某些工具不支持 localhost 时才需要用真实 IP。

# 固定 WSL2 IP(可选)

如果需要固定 IP,可以在 Windows 的 hosts 文件中添加:

# C:\Windows\System32\drivers\etc\hosts
172.20.123.45  wsl.local
1
2

IP 用 wsl hostname -I 获取(取 eth0 对应的那个,即第一个 IP)。但更推荐用 localhost 或 Docker 端口映射,不需要固定 IP。


# 常见问题

# Q1: WSL2 占用内存越来越大?

WSL2 不用时不主动释放内存。解决方法:

# 方法 1:手动关闭释放
wsl --shutdown

# 方法 2:配置内存上限(C:\Users\你的用户名\.wslconfig)
[wsl2]
memory=8GB
swap=2GB
1
2
3
4
5
6
7

# Q2: Windows 重启后 WSL 里的 Docker 没启动?

  • 启用 systemd 时:执行过 sudo systemctl enable docker 会自动启动
  • 未启用 systemd 时:需手动执行 sudo service docker start

# Q3: wsl --install 下载很慢?

  • 使用手机热点临时加速
  • 等网络空闲时段重试
  • 改用手动安装方式,从 Microsoft Store 安装 Ubuntu(通常更快)

# Q4: 报错 WslRegisterDistribution failed with error: 0x800701bc?

WSL2 内核未更新。解决:

  1. 下载 https://aka.ms/wsl2kernel 的 wsl_update_x64.msi 并安装
  2. 或 PowerShell 执行 wsl --update

# Q5: 报错 0x80370102(虚拟机无法启动)?

BIOS 虚拟化未开启。解决:

  1. 重启电脑进入 BIOS
  2. 找到 Intel VT-x / AMD-V / Virtualization Technology 选项,设为 Enabled
  3. 保存重启

# Q6: 如何迁移 WSL2 到其他磁盘?

# 1. 关闭 WSL
wsl --shutdown

# 2. 导出
wsl --export Ubuntu-22.04 D:\ubuntu-backup.tar

# 3. 注销原实例
wsl --unregister Ubuntu-22.04

# 4. 导入到新位置
wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\ubuntu-backup.tar

# 5. 设置默认用户(导入后默认是 root)
ubuntu2204.exe config --default-user cmty
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Q7: 如何在多个 WSL 发行版之间切换?

wsl -d Ubuntu-22.04     # 进入指定发行版
wsl --setdefault Ubuntu-22.04  # 设置默认发行版
1
2

# 实用配置示例:Docker Compose 部署开发环境

在 WSL2 中创建 ~/docker-compose.yml,一键部署 MySQL + Redis + MinIO:

# 创建文件
touch docker-compose.yml
# 或使用 nano 编辑器
nano ~/docker-compose.yml
1
2
3
4

💡 端口加前缀避免冲突:Windows 本地可能已装了 MySQL(3306)、Redis(6379)等服务。建议把容器映射到 Windows 的端口加个前缀(如 1),即 13306:3306,避免和本地服务冲突。容器内部端口保持不变(3306/6379),只是映射到 Windows 的端口变了。

services:
  mysql:
    image: mysql:8.0
    ports: ["13306:3306"]        # Windows 用 13306 连接,容器内仍是 3306
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: "mydb"
    volumes: ["mysql_data:/var/lib/mysql"]
    restart: unless-stopped

  redis:
    image: redis:7
    ports: ["16379:6379"]        # Windows 用 16379 连接,容器内仍是 6379
    command: redis-server --requirepass 123321
    volumes: ["redis_data:/data"]
    restart: unless-stopped

  minio:
    image: minio/minio
    ports: ["19000:9000", "19001:9001"]   # API 用 19000,控制台用 19001
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    command: server /data --console-address ":9001"
    volumes: ["minio_data:/data"]
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:
  minio_data:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

启动:

docker compose up -d        # 后台启动所有服务
docker compose ps           # 查看运行状态
docker compose down         # 停止并移除容器
1
2
3

Windows 连接地址(WSL2 端口自动转发):

服务 连接地址 说明
MySQL localhost:13306 用 Navicat/DataGrip 等客户端连接
Redis localhost:16379 用 RedisInsight/RDM 等客户端连接
MinIO API http://localhost:19000 项目代码里配置的 endpoint
MinIO 控制台 http://localhost:19001 浏览器访问,账号 minioadmin/minioadmin

# restart 重启策略说明

restart 字段决定容器退出后是否自动重启,常用取值:

策略 含义 适用场景
no 默认值,容器退出后不重启 一次性任务
always 总是重启(手动 docker stop 后,重启 Docker 也会拉起) 生产环境关键服务
unless-stopped 除非手动停止,否则自动重启(手动 stop 后,重启 Docker 不会拉起) 推荐,日常开发/生产
on-failure 仅在非零退出码时重启,可加最大次数 on-failure:3 可能异常退出的服务

💡 推荐用 unless-stopped:日常崩溃/重启电脑会自动恢复,但你手动 stop 后不会偷偷拉起来,方便维护。

# 部署项目:复用组件还是新建?

推荐复用,把项目服务加到同一个 docker-compose.yml 里。原因:

  • 网络互通:同一 compose 文件的服务自动在一个网络里,项目容器可以用服务名直接连 mysql:3306、redis:6379,不用配 IP
  • 统一管理:一条 docker compose up -d 全部启动,docker compose down 全部停止
  • 依赖顺序:depends_on 保证 MySQL 先启动,项目后启动

# 示例:若依项目部署

services:
  # ===== 基础组件 =====
  mysql:
    image: mysql:8.0
    ports: ["13306:3306"]        # Windows 用 13306 连接,容器内仍是 3306
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: "ry-vue"   # 若依默认库名
    volumes:
      - mysql_data:/var/lib/mysql
      - ./sql/ry_20240629.sql:/docker-entrypoint-initdb.d/ry_20240629.sql   # 初始化 SQL
      - ./sql/ry_config_20240629.sql:/docker-entrypoint-initdb.d/ry_config_20240629.sql
    restart: unless-stopped

  redis:
    image: redis:7
    ports: ["16379:6379"]        # Windows 用 16379 连接,容器内仍是 6379
    command: redis-server --requirepass 123321
    volumes: ["redis_data:/data"]
    restart: unless-stopped

  # ===== 若依后端(Spring Boot)=====
  ruoyi-admin:
    build: ./ruoyi-admin         # 后端 Dockerfile 所在目录
    ports: ["18080:8080"]        # Windows 用 18080 访问,容器内仍是 8080
    # environment 是可选的:如果 application.yml 里的配置和 compose 服务名/端口/密码一致,就不用写
    # 这里用 environment 覆盖,是因为若依默认 yml 里写的是 localhost,容器内连不到
    environment:
      # MySQL:容器间用服务名 + 容器内端口
      SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      SPRING_DATASOURCE_DRUID_MASTER_USERNAME: root
      SPRING_DATASOURCE_DRUID_MASTER_PASSWORD: "123456"
      # Redis:容器间用服务名 + 容器内端口
      SPRING_DATA_REDIS_HOST: redis
      SPRING_DATA_REDIS_PORT: "6379"
      SPRING_DATA_REDIS_PASSWORD: "123321"
    depends_on:
      - mysql
      - redis
    restart: unless-stopped

  # ===== 若依前端(Vue3 + Nginx)=====
  ruoyi-ui:
    build: ./ruoyi-ui            # 前端 Dockerfile 所在目录
    ports: ["180:80"]            # Windows 用 180 访问,容器内仍是 80
    depends_on:
      - ruoyi-admin
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

💡 说明:

  • 后端:若依 ruoyi-admin 模块打包成 jar,用 Dockerfile 构建。环境变量覆盖 application.yml 中的数据库/Redis 配置(Spring Boot 自动绑定)
  • 前端:ruoyi-ui 构建后用 Nginx 托管静态文件,并反向代理 /prod-api 到后端 ruoyi-admin:8080(容器间通信用服务名)
  • MySQL 初始化:把若依的 SQL 文件挂载到 /docker-entrypoint-initdb.d/,MySQL 首次启动会自动执行
  • MinIO:若依默认配置已支持 OSS,如需本地文件存储再加 minio 服务

# environment 是可选的

environment 字段不是必须的,取决于 application.yml 的配置情况:

情况 是否需要 environment 说明
application.yml 里写的是 localhost:3306 ✅ 需要 容器内 localhost 是容器自己,连不到 MySQL,必须用 environment 覆盖成服务名 mysql
application.yml 里已改成 mysql:3306(服务名) ❌ 不需要 yml 配置和 compose 服务名一致,直接用 yml 即可
用 Spring Profile 区分环境(application-docker.yml) ❌ 不需要 打包时指定 --spring.profiles.active=docker,用专门的 docker 配置文件

两种配置方式对比:

# 方式 1:用 environment 覆盖(不改 yml,推荐)
# 优点:yml 保持默认值,方便本地 IDE 调试;docker 部署时用环境变量覆盖
ruoyi-admin:
  environment:
    SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue

# 方式 2:直接改 application.yml(不用 environment)
# 优点:compose 文件更简洁
# 缺点:yml 改成服务名后,本地 IDE 跑项目就连不上 docker 里的 MySQL 了,需要再改回来
# application-druid.yml:
# url: jdbc:mysql://mysql:3306/ry-vue   ← 改成服务名
1
2
3
4
5
6
7
8
9
10
11

💡 推荐方式 1:保持 application.yml 用 localhost(方便本地 IDE 调试连 Windows 上的 MySQL),docker 部署时用 environment 覆盖成服务名。这样一套代码既能本地跑,也能 docker 部署,不用改来改去。

# 什么时候分开?

场景 建议 原因
开发环境 基础组件单独一个 compose 常驻,项目用 IDE 跑 方便调试,不用每次重启数据库
生产/演示环境 全部合并到一个 compose,一键部署 统一管理,依赖有序

# 项目容器内如何连接 MySQL/Redis?

⚠️ 关键:用服务名作为主机名,不要写 localhost!

# ❌ 错误:容器内的 localhost 是容器自己,连不到 MySQL
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://localhost:3306/ry-vue

# ✅ 正确:用 compose 里的服务名
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue
1
2
3
4
5

Docker Compose 会自动为同一网络内的服务做 DNS 解析,mysql、redis、minio 这些服务名可以直接当主机名用。

# 端口映射易错点:容器内端口 vs Windows 访问端口

⚠️ 关键区分:ports: ["13306:3306"] 中,左边 13306 是 Windows 访问端口,右边 3306 是容器内端口。两者不要搞混!

场景 用哪个端口 示例
容器之间互相连接(ruoyi-admin 连 mysql) 用容器内端口(右边) jdbc:mysql://mysql:3306/ry-vue
Windows 客户端连接(Navicat 连 MySQL) 用映射端口(左边) localhost:13306
项目代码跑在 Windows 本地(IDE 调试若依) 用映射端口(左边) jdbc:mysql://localhost:13306/ry-vue
# ❌ 错误:容器间通信用了 Windows 映射端口
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:13306/ry-vue   # 容器内没有 13306 端口

# ✅ 正确:容器间通信用容器内端口
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue
1
2
3
4
5

# WSL2 架构简述

┌─────────────────────────────────────────┐
│              Windows 主机                │
│  ┌─────────────┐   ┌─────────────────┐  │
│  │  Windows 应用 │   │   WSL 管理服务   │  │
│  │  (浏览器等)   │   │  (wslservice)   │  │
│  └─────────────┘   └────────┬────────┘  │
│                             │            │
│  ┌──────────────────────────▼─────────┐  │
│  │      轻量级 Hyper-V 虚拟机          │  │
│  │  ┌───────────────────────────────┐ │  │
│  │  │     完整 Linux 内核 (微软维护)  │ │  │
│  │  │  ┌──────┐  ┌──────┐  ┌──────┐ │ │  │
│  │  │  │Ubuntu│  │Debian│  │ ...  │ │ │  │
│  │  │  └──────┘  └──────┘  └──────┘ │ │  │
│  │  │     ext4 文件系统 (vhdx)       │ │  │
│  │  └───────────────────────────────┘ │  │
│  └────────────────────────────────────┘  │
└─────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • WSL 管理服务:负责启动/停止虚拟机,管理发行版
  • 轻量级虚拟机:启动极快(约 1-2 秒),资源按需分配
  • Linux 内核:微软维护的开源内核(https://github.com/microsoft/WSL2-Linux-Kernel),完整支持 Linux 系统调用
  • vhdx 虚拟磁盘:每个发行版的文件系统存储在一个 .vhdx 文件中,动态扩展

# 学习参考

  • 保姆级教程:WSL2(Windows Subsystem for Linux)的安装和使用 - 知乎 (opens new window)
  • 微软官方 WSL 文档 (opens new window)
  • WSL2 Linux 内核源码 (GitHub) (opens new window)
上次更新: 2026/8/31 14:36:37
Windows命令行基础
数据结构基础小结

← Windows命令行基础 数据结构基础小结→

Theme by Vdoing | Copyright © 2023-2026 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式