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 | NAME STATE VERSION |
说明 Ubuntu 在 WSL2 环境下运行。到此为止安装完毕。
如果发现 VERSION 为 1,说明 Ubuntu 运行在 WSL1 下。需要手工切换。
首先关闭 WSL下运行的 Linux,执行:
1 | wsl --shutdown |
然后执行:
1 | wsl --set-version <Linux发行版名称> 2 |
其中 Linux发行版名称
为前面安装的 Linux 名称,可以通过 wsl -l -v
命令查看。执行命令后等待片刻。等命令行提示转换完成,我们已经成功将 Linux 切换到 WSL2 环境。
systemctl 无法使用的问题
WSL2 经过测试无法使用 systemctl
命令,报如下错误:
1 | System has not been booted with systemd as init system (PID 1). Can't operate. |
参考了Running Snaps on WSL2 (Insiders only for now) 之后给出如下解决方案:
- 安装
daemonize
和fontconfig
1 | apt update |
- 编辑
/etc/profile
脚本,加入如下内容:
1 | SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}') |
- 修改
/etc/sudoers
文件,加入如下内容:
1 | %sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target |
- 执行
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 | Port 22 #默认即可,如果有端口占用可以自己修改 |
- 重启服务
1 | sudo service ssh --full-restart |
- 连接
- 设置 ssh 开机自动启动
1 | # 开机自动启动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 | sudo apt remove docker-ce |
注意:如果发现在 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 | PS C:\Users\xxx\Desktop> .\LxRunOffline.exe list |
获取系统当前已安装的发行版。例子中返回的发行版名称为 Ubuntu-20.04
- 执行迁移命令。格式如下:
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 | PS C:\Users\xxx\Desktop> wsl --shutdown |
等待命令执行完毕返回。
- 查看迁移后发行版的安装路径。执行:
1 | PS C:\Users\xxx\Desktop> .\LxRunOffline.exe di -n 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 | cd /www # 目录自己随意 |
进入 ./laradock
目录,将 env-example
复制为 .env
1 | cd laradock/ |
.env
文件中部分需要注意的变量
1 | # 这个变量通常默认就行,最后此时的项目目录会映射到 workspace 容器的 `/var/www/` 目录中 |
如果不需要 node,可以将以下配置改为 false,上面的 node 淘宝镜像源就不需要配置了
1 | WORKSPACE_INSTALL_NODE=false |
构建并启动 Docker 容器
要在 ./laradock 目录下 执行命令
默认会启动 workspace
、php-fpm
和 composer
等,都会自动配置
1 | docker-compose up -d nginx mysql |
每次打 docker-compose
命令太长了,这边设置个 dc
别名:
1 | vim ~/.bashrc |
添加别名:alias dc='docker-compose'
保存退出,然后执行命令:source ~/.bashrc
构建完成后,进入 workspace,安装 Laravel 框架
1 | # 进入workspace容器 |
配置 nginx 站点:./laradock/nginx/sites/
1 | cp laravel.conf.example laravel.conf |
修改 laravel.conf
配置:
重启 nginx 容器,使站点配置文件生效
1 | dc restart nginx |
在 Win10 hosts 文件 中加入对应的 ip 和域名,即可访问。
出现这个错误,说明目录没有权限,需要更改目录权限:
1 | chown -R www-data:www-data /var/www/laravel |
Laravel 中数据库配置:./laravel/.env
laradock 的 mysql 容器不是以 ip 地址连接的,而是以 mysql 标签名连接的所以 ./laravel/.env 中关于 DB_HOST 的值不是 ip 地址,而是 mysql 这个单词
1 | DB_CONNECTION=mysql |
关于 mysql 数据库管理工具
- 途径一:通过 phpmyadmin
workspace 占用着 8080 端口,所以需要修改 ./laradock/.env
中的端口
1 | # 把phpmyadmin默认的8080改为不被占用的端口 |
启动 phpmyadmin
1 | dc up -d phpmyadmin |
浏览器网址:localhost:8081
如果用户名:root,密码:root 并不能正常登录 phpmyadmin
这是 PHP7 和 MySQL8 的 authentication 方法不一致的问题,重新修改用户名密码即可:
1 | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; |
回到 phpmyadmin 中,使用 host: mysql, user: root, password: root 就可以正常登录了
- 途径二:通过 adminer
修改 ./laradock/.env
中的端口
1 | # 把adminer默认的8080改为不被占用的端口 |
启动 adminer
1 | dc up -d adminer |
浏览器网址:localhost:8082
- 途径三:通过宿主机数据库管理工具管理
修改 ./laradock/.env
中 mysql 客户端端口号
1 | MYSQL_PORT=3308 |
至此,基本的配置和安装都结束了。
WSL2 的一些网络访问问题
参考此链接