---
url: /article/ryxmiytl/index.md
---
## 前言

Windows Subsystem for Linux (WSL) 是 Windows 的一项功能，允许您在 Windows 计算机上运行 Linux 环境，而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。
WSL2 使用虚拟化技术在轻量级实用虚拟机 (VM) 内运行 Linux 内核，与 WSL 架构相比，WSL2 提高了文件系统性能并增加了完整的系统调用兼容性。

## 1. 安装 WSL2

以管理员身份运行`PowerShell`输入以下命令：

```shell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

* 这将启用 WSL 功能，但不会立即重启计算机。

接着输入命令：

```shell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

* 这将启用虚拟机平台，这是运行 WSL2 所必需的。完成后需要重启电脑。

然后打开`Microsoft Store`并搜索`wsl`，选择一个发行版下载安装，例如选择`Ubuntu 20.04.6 LTS`。

然后在 PowerShell 中运行以下命令，将 WSL2 设置为默认的 Linux 版本：

```shell
wsl --set-default-version 2
```

* 这将确保你安装的任何新的 Linux 发行版都将默认使用 WSL2。

然后按照 Ubuntu 系统提示设置好用户名和密码即可。

wsl 常用命令：

```shell
# 启动子系统
wsl
# 列出所有子系统状态
wsl -l -v
# 关闭子系统 
wsl --shutdown
```

## 2. 安装 Docker

### 2.1 安装 Docker Engine

参照 Docker [官网](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) 操作。

### 2.2 设置 Docker 命令无需 sudo

参照 Docker [官网](https://docs.docker.com/engine/install/linux-postinstall/) 操作。

### 2.3 安装 Docker-Compose

参照 Docker [官网](https://docs.docker.com/compose/install/linux/) 操作。

### 2.4 配置镜像源

编辑 `/etc/docker/daemon.json`文件，没有就创建一个，文件内容如下：

```json
{
    "registry-mirrors": [
       "https://registry.docker-cn.com",
       "https://docker.mirrors.ustc.edu.cn",
       "https://hub-mirror.c.163.com"
    ]
}
```

## 3. 优化 WSL2 启动

默认情况下有两个问题：

* 打开命令行输入`wsl`等待几秒钟就会启动子系统，同时也会自启 Docker，一旦关闭命令行后，子系统也会自动关闭，Docker 也就无法访问了；
* 子系统默认会占用主机一半的资源(如CPU、内存等)；

上述问题解决方式，创建一个文件如`wsl-startup.vbs`，填写如下内容：

```shell
set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu-20.04", 0
```

其中发行版的名称根据实际情况写，我这里是`Ubuntu-20.04`，根据`wsl -l -v`命令下显示的名称写的。双击运行会开启 WSL 实例，它会永久等待输入，不会关闭。所以当你下次再使用WSL命令时，就不会遇到需要重新唤醒 WSL 的耗时。
也可以设置为开机启动，`win+R`运行`shell:startup`打开启动目录，将脚本放进去，这样当系统启动登录系统后，Windows会自动执行脚本。

在 Windows 的用户目录，即`%USERPROFILE%`下有个`.wslconfig`文件，没有就创建一个，填写如下内容：

```text
[wsl2]
memory=4GB 
processors=2
```

资源限制根据自己电脑实际配置调整，这样当子系统启动时就会读取这个文件。更多配置请参考[官网](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#wslconfig)

## 附加

记录下`dcoker-compose.yaml`文件配置:

```yaml
version: '3.3'

networks:
  net:
    driver: bridge

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_CHARACTER_SET_SERVER: utf8mb4
      MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - net
    ports:
      - 3306:3306
    volumes:
      # 数据目录
      - ${ROOT_PATH}/mysql/data:/var/lib/mysql
      # 配置文件
      - ${ROOT_PATH}/mysql/conf/my.cnf:/etc/my.cnf
      # 日志
      - ${ROOT_PATH}/mysql/log:/var/log/mysql

  redis:
    image: redis:6.0
    container_name: redis
    restart: unless-stopped
    networks:
      - net
    ports:
      - 6379:6379
    # 设置访问密码
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      # 数据目录
      - ${ROOT_PATH}/redis/data:/data

  # nginx:
  #   image: nginx:1.23
  #   container_name: nginx
  #   restart: unless-stopped
  #   networks:
  #     - net
  #   ports:
  #     - 80:80
  #   volumes:
  #     # 配置文件目录
  #     - ${ROOT_PATH}/nginx/conf:/etc/nginx
  #     # 静态文件
  #     - ${ROOT_PATH}/nginx/html:/usr/share/nginx/html
  #     # 日志目录
  #     - ${ROOT_PATH}/nginx/log:/var/log/nginx
```

同级目录下创建`.env`文件：

```text
ROOT_PATH=~/.docker/develop
#
# mysql
MYSQL_ROOT_PASSWORD=8le0snJvDn
MYSQL_DATABASE=develop
MYSQL_USER=mayee
MYSQL_PASSWORD=LpotkYvf26
# redis
REDIS_PASSWORD=KQglpfgWgZ
```

文件目录即为 compose stack 的名称，创建的网络名称会在前面加 stack 名称前缀。

使用`docker-compose up -d`可创建并启动全部容器，`docker-compose up -d mysql redis` 启动指定容器，`docker-compose down`停止并销毁 compose stack 中定义的所有容器即网络。

可在 `~/.bashrc`文件中定义指令别名，达到简写的目的，如：

```bash
alias dk='docker'
alias dkcp='docker-compose'
alias dev='cd ~/.docker/develop'
```
