WSL2 + Docker + Laradock 配置

系统环境介绍

Win 10 2004
WSL2(Ubuntu 20.04)
Docker 19.03.13

启用 Linux 子系统

打开 控制面板 -> 程序 -> 启用或关闭Windows功能。找到适用于Linux的Windows子系统虚拟机平台,勾选这两项之后确定,并重新启动计算机。

切换系统 WSL 默认版本到 2

使用管理员用户打开 Windows PowerShell,运行:

1
wsl --set-default-version 2

注意,有可能会出现如下提示:

WSL 2 需要更新其内核组件。有关信息,请访问 https://aka.ms/wsl2kernel

出现这个提示,说明需要更新 WSL2 的内核。按照提示打开链接。点击下图中的下载链接,下载并安装 WSL2 内核。

安装 Ubuntu 发行版

安装

打开 Microsoft Store,搜索 Ubuntu,界面如下所示:

根据自己的需要,选择对应的 Ubuntu 版本并安装。
完成之后在开始菜单会出现 Ubuntu 菜单项。打开它,Ubuntu 将会进行初始化操作。等待几分钟后按照提示,为 Ubuntu 设置用户名和密码。
最后,我们需要验证 Ubuntu 是否在 WSL2 的环境下启动。以管理员用户打开 Windows PowerShell,执行:

1
wsl -l -v

如果看到如下信息:

1
2
  NAME            STATE           VERSION
* Ubuntu-20.04 Running 2

说明 Ubuntu 在 WSL2 环境下运行。到此为止安装完毕。
如果发现 VERSION 为 1,说明 Ubuntu 运行在 WSL1 下。需要手工切换。
首先关闭 WSL下运行的 Linux,执行:

1
wsl --shutdown

然后执行:

1
2
wsl --set-version <Linux发行版名称> 2
这边就是输入 wsl --set-version Ubuntu-20.04 2

其中 Linux发行版名称 为前面安装的 Linux 名称,可以通过 wsl -l -v 命令查看。执行命令后等待片刻。等命令行提示转换完成,我们已经成功将 Linux 切换到 WSL2 环境。

systemctl 无法使用的问题

WSL2 经过测试无法使用 systemctl 命令,报如下错误:

1
2
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

参考了Running Snaps on WSL2 (Insiders only for now) 之后给出如下解决方案:

  1. 安装 daemonizefontconfig
1
2
apt update
apt install -y fontconfig daemonize
  1. 编辑 /etc/profile 脚本,加入如下内容:
1
2
3
4
5
6
7
8
9
10
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
  1. 修改 /etc/sudoers 文件,加入如下内容:
1
2
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
  1. 执行 source /etc/profile 或者是重新打开 terminal,执行 systemctl 验证是否能够正常操作。

开启 ssh

  • 卸载旧 ssh server
1
apt remove openssh-server
  • 安装 ssh server
1
apt install openssh-server
  • 修改 ssh server 配置
1
vim /etc/ssh/sshd_config

修改以下配置:

1
2
3
Port 22 #默认即可,如果有端口占用可以自己修改
PasswordAuthentication yes(允许用户名密码方式登录)
PermitRootLogin yes (允许root用户远程登录,有需要 root 登录就开起来)
  • 重启服务
1
sudo service ssh --full-restart
  • 连接

  • 设置 ssh 开机自动启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 开机自动启动ssh命令
sudo systemctl enable ssh

# 关闭ssh开机自动启动命令
sudo systemctl disable ssh

# 单次开启ssh
sudo systemctl start ssh

# 单次关闭ssh
sudo systemctl stop ssh

# 设置好后重启系统
reboot

#查看ssh是否启动,看到Active: active (running)即表示成功
sudo systemctl status ssh

安装 Docker Desktop in Windows 10

官网:https://www.Docker.com/products/Docker-desktop

现在 Docker Desktop Windows 版已经能够支持 WSL 作为 Docker Engine 运行,可以同时支持在 Linux 和 Windows 命令行下操作 Docker。

  • 确保 Ubuntu 内的 Docker 已经卸载,如果没有卸载,可以执行:
1
2
sudo apt remove docker-ce
sudo apt remove docker-ce-cli

注意:如果发现在 Ubuntu 内无法执行 docker 命令,可以通过如下操作打开:
进入 Docker Desktop 的 settings,如下所示:

保存下,即可在 Ubuntu 内直接使用 docker 命令。

迁移 WSL 到非系统盘

默认 WSL 总是安装到 C 盘,这样对于C盘空间紧张的用户完全不友好。

我们可以使用 LxRunOffline 工具来迁移WSL到其他磁盘分区。

LxRunOffline下载链接。在 Windows PowerShell 运行需要下载 LxRunOffline-vx.x.x-msvc.zip 版本。解压到任意目录即可使用。

LxRunOffline 是一个第三方 WSL Linux 发行版管理工具,可以认为是 WSL 命令的增强版。它可以安装和卸载 Linux 发行版,迁移,复制,导入导出和设置环境变量等。具体的使用帮助可执行 .\LxRunOffline.exe \h 查看命令介绍。

迁移过程分为3步:

  1. 获取准备迁移的发行版名称。执行:
1
2
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe list
Ubuntu-20.04

获取系统当前已安装的发行版。例子中返回的发行版名称为 Ubuntu-20.04

  1. 执行迁移命令。格式如下:
1
.\LxRunOffline.exe m -n <发行版名称> -d <目标路径>

比如我们要将 Ubuntu-20.04 移动到 D:\wsl\Ubuntu-20.04(要确保 D:\wsl 目录存在),执行如下命令:

1
.\LxRunOffline.exe m -n Ubuntu-20.04 -d D:\wsl\Ubuntu-20.04

如果 Ubuntu 正在运行,需要先关闭在进行迁移,关闭命令:

1
2
3
PS C:\Users\xxx\Desktop> wsl --shutdown

# 启动命令为 wsl -d Ubuntu-20.04

等待命令执行完毕返回。

  1. 查看迁移后发行版的安装路径。执行:
1
2
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe di -n Ubuntu-20.04
D:\wsl\Ubuntu-20.04

返回的安装位置是 D:\wsl\Ubuntu-20.04,说明迁移成功。

文件系统相互访问

在 Win10 下访问 Linux 子系统文件

进入 CMD 或者 Windows PowerShell,输入:

1
cd \\wsl$\Ubuntu-20.04\

可以进入到 Linux 子系统根目录。如下图所示:

或者打开文件资源管理器,在地址栏输入 \\wsl$\Ubuntu-20.04,也可以跳转到 Linux 子系统根目录。

或者在 Linux 子系统中,输入:

1
explorer.exe .

会自动打开Linux 子系统目录。

Linux 子系统访问 Win10 文件

进入Linux子系统运行 df -h,看到如下输出:

注意观察后两行。本人电脑有两个分区。/mnt/c/mnt/d 正好分别对应本机的C盘和D盘。

Laradock

下载 Laradock,在 Ubuntu 里运行:

1
2
cd /www # 目录自己随意
git clone https://github.com/laradock/laradock.git

进入 ./laradock 目录,将 env-example 复制为 .env

1
2
cd laradock/
cp env-example .env

.env 文件中部分需要注意的变量

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
# 这个变量通常默认就行,最后此时的项目目录会映射到 workspace 容器的 `/var/www/` 目录中
APP_CODE_PATH_HOST=../

# 像mysql等需要volume的数据会存放在宿主机中的位置,如果有需要可以修改一下
DATA_PATH_HOST=~/.laradock/data

# php版本(7.4 - 7.3 - 7.2 - 7.1 - 7.0 - 5.6)
PHP_VERSION=7.4


### MYSQL #################################################
# mysql版本,默认是lastest,根据需要修改
MYSQL_VERSION=5.7
# 默认数据库名字
MYSQL_DATABASE=laravel
# 数据库用户名
MYSQL_USER=default
# 数据库用户密码
MYSQL_PASSWORD=secret
# 数据库端口
MYSQL_PORT=3306
# 数据库root用户的密码
MYSQL_ROOT_PASSWORD=root


# 更换中国镜像源,改为true
CHANGE_SOURCE=true
# 上面 `CHANGE_SOURCE` 改为`true`之后,就会更换为aliyun镜像源
UBUNTU_SOURCE=aliyun


### WORKSPACE #############################################
# 将comoser更换为阿里镜像源(更改为其他国内镜像源也可以,否则速度不稳定)
WORKSPACE_COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/
# 设置NVM安装node的淘宝镜像源
WORKSPACE_NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
# 设置node的淘宝的registry
WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org/
# 时间改为PRC
WORKSPACE_TIMEZONE=PRC

如果不需要 node,可以将以下配置改为 false,上面的 node 淘宝镜像源就不需要配置了

1
2
3
4
5
6
WORKSPACE_INSTALL_NODE=false
WORKSPACE_INSTALL_YARN=false
WORKSPACE_INSTALL_NPM_GULP=false
WORKSPACE_INSTALL_NPM_BOWER=false
WORKSPACE_INSTALL_NPM_VUE_CLI=false
WORKSPACE_INSTALL_NPM_ANGULAR_CLI=false

构建并启动 Docker 容器

要在 ./laradock 目录下 执行命令

默认会启动 workspacephp-fpmcomposer 等,都会自动配置

1
docker-compose up -d nginx mysql

每次打 docker-compose 命令太长了,这边设置个 dc 别名:

1
2
vim  ~/.bashrc
source ~/.bashrc

添加别名:alias dc='docker-compose'

保存退出,然后执行命令:source ~/.bashrc

构建完成后,进入 workspace,安装 Laravel 框架

1
2
3
4
5
# 进入workspace容器
$ dc exec workspace bash

# 在容器中执行composer命令将Laravel框架安装在 ./laravel 目录中
root@b0cf8f8333e4:/var/www# composer create-project --prefer-dist laravel/laravel laravel

配置 nginx 站点:./laradock/nginx/sites/

1
cp laravel.conf.example laravel.conf

修改 laravel.conf 配置:

重启 nginx 容器,使站点配置文件生效

1
2
3
dc restart nginx
或者
dc exec nginx nginx -s reload

Win10 hosts 文件 中加入对应的 ip 和域名,即可访问。

出现这个错误,说明目录没有权限,需要更改目录权限:

1
2
chown -R www-data:www-data /var/www/laravel
项目目录的 storage 文件夹没有写入权限。在项目目录执行 chmod -R 777 storage

Laravel 中数据库配置:./laravel/.env

laradock 的 mysql 容器不是以 ip 地址连接的,而是以 mysql 标签名连接的所以 ./laravel/.env 中关于 DB_HOST 的值不是 ip 地址,而是 mysql 这个单词

1
2
3
4
5
6
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

关于 mysql 数据库管理工具

  • 途径一:通过 phpmyadmin

workspace 占用着 8080 端口,所以需要修改 ./laradock/.env 中的端口

1
2
# 把phpmyadmin默认的8080改为不被占用的端口
PMA_PORT=8081

启动 phpmyadmin

1
dc up -d phpmyadmin

浏览器网址:localhost:8081

如果用户名:root,密码:root 并不能正常登录 phpmyadmin

这是 PHP7 和 MySQL8 的 authentication 方法不一致的问题,重新修改用户名密码即可:

1
2
3
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

回到 phpmyadmin 中,使用 host: mysql, user: root, password: root 就可以正常登录了

  • 途径二:通过 adminer

修改 ./laradock/.env 中的端口

1
2
# 把adminer默认的8080改为不被占用的端口
ADM_PORT=8082

启动 adminer

1
dc up -d adminer

浏览器网址:localhost:8082

  • 途径三:通过宿主机数据库管理工具管理

修改 ./laradock/.env 中 mysql 客户端端口号

1
MYSQL_PORT=3308

至此,基本的配置和安装都结束了。

WSL2 的一些网络访问问题

参考此链接