win11下使用wsl2 + docker 打造前端开发环境

环境

  • 操作系统:win11家庭版 版本号: 24H2 (版本:26100.3476)
  • CPU类型: 英特尔CPU

安装wsl2

启用Linux子系统

控制面板(查看方式:小图标) > 程序和功能 > 启用或关闭Windows功能

更新wsl版本

bash 复制代码
# 更新wsl为最新版本
wsl --update

如果上面的命令下载速度过慢,则可以采用离线方式更新(使用下面的地址,下载最新的稳定版msi安装包,然后双击安装)

Releases · microsoft/WSL · GitHub

查看当前版本

csharp 复制代码
# 查看当前版本
wsl --version
# 将wsl设置为2(win11默认是2,可以不设置)
wsl --set-default-version 2

wsl2常用命令

  • 列出已安装发行版和发行版运行状态: wsl -l -v
  • 运行某个发行版: wsl -d Ubuntu-24.04(此时会以默认用户登录) wsl -d Ubuntu-20.04 -u yourusername (此时会以特定用户登录)
  • 终止(关闭)指定发行版: wsl --terminate <Distribution Name>
  • 从发行版的命令行中退出(并让发行版继续运行): 先执行sync, 再执行logout
  • 查看默认发行版: wsl -l
  • 设置默认发行版: wsl --set-default-version Ubuntu-24.04
  • 查看wsl状态: wsl --status
  • 查看wsl版本: wsl --version
  • 关闭wsl: wsl --shutdown
  • 导出发行版: wsl --export <Distribution Name> <FileName>
  • 导入发行版: wsl --import <Distribution Name> <InstallLocation> <FileName>
  • 注销或卸载 Linux 发行版: wsl --unregister <DistributionName>
  • 返回通过 WSL 2 安装的 Linux 发行版 IP 地址(WSL 2 VM 地址): wsl hostname -I
  • 返回从 WSL 2 (WSL 2 VM) 看到的 Windows 计算机的 IP 地址: ip route show | grep -i default | awk '{ print $3}'

安装一个 WSL Linux 发行版

从微软应用商店安装(选择一个发行版): ubuntu - Microsoft Apps

我选的是Ubuntu 24.04.1 LTS

安装完毕之后,第一次打开会弹出窗口进行初始化操作,并让你设置账户和密码 (请务必记住该账号和密码)。账户密码设置完后就会自动进入发行版系统,接下来就可以探索咱们安装的Linux系统了

将更新源设置为国内源

注意:新版本的ubuntu更新源设置与旧版本的不同,我这个是新版本更新源设置

备份源配置

shell 复制代码
sudo cp /etc/apt/sources.list.d/ubuntu.sources  /etc/apt/sources.list.d/ubuntu.sources.bak

编辑源配置

bash 复制代码
sudo vim /etc/apt/sources.list.d/ubuntu.sources

将文件内容替换为:

makefile 复制代码
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

更新

csharp 复制代码
# 更新软件源
sudo apt-get update
# 升级所有软件
sudo apt-get upgrade

美化命令行 (可选)

bash 复制代码
sudo apt install zsh git curl -y

sh -c "$(curl -fsSL https://gitee.com/pocmon/ohmyzsh/raw/master/tools/install.sh)"

# 更换主题
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

vim ~/.zshrc

# 在~/.zshrc文件中,将主题设置为 powerlevel10k/powerlevel10k
ZSH_THEME="powerlevel10k/powerlevel10k"

因为这个主题的自由度比较高,因此会需要你进行一系列的选择

安装zsh插件

命令补全插件

ruby 复制代码
git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

命令高亮插件

ruby 复制代码
git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

启用插件

vim ~/.zshrc

ini 复制代码
plugins=(git zsh-autosuggestions zsh-syntax-highlighting z extract web-search)
shell 复制代码
source ~/.zshrc

zsh设置为默认shell (配置好之后下次打开默认就是 zsh 了,也可以输入zsh进入 zsh 环境)

bash 复制代码
chsh -s /bin/zsh

安装git

csharp 复制代码
sudo apt install git -y

# 启用大小写敏感
git config --global core.ignorecase false

# 配置用户名和密码
git config --global user.name "Your Name"  
git config --global user.email "[email protected]"

# 生成 ssh key  
# 用 Github 的话,可以拷贝生成的公钥到 https://github.com/settings/keys  
ssh-keygen

新增用户

复制代码
sudo adduser username

username 替换为你想创建的用户名

该命令将提示你输入并确认新用户的密码,并提供一些可选的用户信息(如全名、房间号等)。你可以直接按 Enter 跳过这些可选项。

为新用户赋予管理员权限(可选)

shell 复制代码
sudo usermod -aG sudo username

# 这里是新建用户组,并将用户加入docker用户组。
# 因为: Docker 守护进程的 Unix 套接字文件 `/var/run/docker.sock`,
# 默认仅允许 `root` 用户或 `docker` 用户组成员操作,后续我需要使用该用户操作docker,
# 因此,我需要将该用户添加到docker用户组
sudo groupadd docker
sudo usermod -aG docker username

# 重新加载用户组权限(需重新登录或执行以下命令)
newgrp docker

# 查看当前用户所属组是否包含 docker
groups

这样,新用户将能够使用 sudo 命令来执行需要管理员权限的操作。

切换到新用户

复制代码
su - username

修改发行版位置,避免C盘空间被占用

shell 复制代码
# 停止发行版运行
wsl --terminate Ubuntu-24.04
# 查看发行版运行状态
wsl -l -v
# 导出指定发行版
wsl --export Ubuntu-24.04 D:\wsl2\bak\Ubuntu-24.tar
# 注销发行版运行
wsl --unregister Ubuntu-24.04
# 查看是否注销成功
wsl -l -v
# 重新导入发行版
wsl --import Ubuntu-2404 D:\wsl2\Ubuntu-24 D:\wsl2\bak\Ubuntu-24.tar
# 重新运行发行版
wsl -d  Ubuntu-2404

永久修改发行版的默认登录用户

bash 复制代码
# 进入发行版,查看是否存在该用户
cat /etc/passwd | grep xxx
sudo vim /etc/wsl.conf
# 加入如下内容
[user]
default = <用户名>

退出重启linux发行版

bash 复制代码
# 退出(这个在linux命令行执行)
logout
# 关闭特定发行版(这个在win命令行执行)
wsl --terminate Ubuntu-2404
# 重启
wsl -d  Ubuntu-2404

ubuntu安装docker

将当前用户授予管理员权限

查看当前用户是否有管理员权限

bash 复制代码
groups

若输出中包含 sudoadmin 组,则用户拥有管理员权限

测试是否真的有 sudo 权限

复制代码
sudo -l
  • 若显示 (ALL : ALL) ALL 或类似内容,表示用户拥有完整 sudo 权限
  • 若提示输入密码后成功执行命令,则用户具有临时管理员权限

如果没有sudo权限,则将当前用户添加到sudo

xml 复制代码
sudo usermod -aG <组名> <用户名> 

卸载docker

shell 复制代码
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
bash 复制代码
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

安装docker

安装需要的依赖包

matlab 复制代码
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common

添加阿里云的Docker CE仓库的GPG密钥

arduino 复制代码
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

添加阿里云的仓库

bash 复制代码
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

再次更新软件源

sql 复制代码
sudo apt update 
sudo apt upgrade

安装Docker

csharp 复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 查看docker版本
docker --version

配置国内的镜像加速源

bash 复制代码
sudo vim /etc/docker/daemon.json
json 复制代码
{
   "registry-mirrors": [
   "https://mirror.baidubce.com",
   "https://mirror.ccs.tencentyun.com",
   "https://docker.mirrors.ustc.edu.cn",
   "https://docker.mirrors.ustc.edu.cn",
   "https://docker.1panel.live",
   "https://b9pmyelo.mirror.aliyuncs.com",
   "https://gmbtuhv4.mirror.aliyuncs.com",
   "https://docker.nju.edu.cn"
  ]
}

加载配置文件并重启

shell 复制代码
# 查看运行状态
sudo systemctl status docker.service
# 重新加载配置文件
sudo systemctl reload docker
# 查看docker配置信息是否更新成功
sudo docker info
# 重启
sudo systemctl restart docker
# 查看运行状态
sudo systemctl status docker.service
bash 复制代码
# 启动docker
sudo systemctl start docker

# 停止docker运行
sudo systemctl stop docker
sudo systemctl stop docker.socket

# 查看docker运行状态
sudo systemctl status docker.service docker.socket

运行测试容器

shell 复制代码
sudo docker run hello-world

docker run 命令的参数

后台运行

docker run -d -p 8080:80 nginx

-d: 就表示后台运行

设置容器名称

docker run -d -p 8080:80 --name web nginx

--name web:将容器名称设置成了web

挂载数据卷实现动态配置

适用场景:需持久化配置或频繁修改,且需配置与容器解耦。适合开发调试环境

操作步骤

  1. 启动容器时挂载宿主机目录
javascript 复制代码
docker run -d -v /宿主机/配置目录:/容器/配置目录 <镜像名>
  1. 在宿主机直接编辑配置文件
bash 复制代码
vi /宿主机/配置目录/config.conf  # 修改后自动同步至容器
  1. 触发容器内服务重载配置(无需重启容器)
bash 复制代码
docker exec <容器名> nginx -s reload  # 例如 Nginx 重载配置
启动容器时指定网络

docker run --network my_custom_network -d nginx

端口映射
  • 映射单个端口: docker run -d -p 8080:80 nginx
  • 映射多个端口: docker run -d -p 8080:80 -p 8443:443 nginx
  • 动态端口映射(Docker自动分配宿主机端口而不是手动指定): docker run -d -P nginx
arduino 复制代码
docker run -d -p 0.0.0.0:8080:80 --name my_nginx nginx

docker常用命令

  • 查看docker版本: docker --version
  • 列出所有本地镜像: sudo docker image ls
  • 列出所有使用中的容器: sudo docker container ls
  • 列出所有本地容器: sudo docker ps -a
  • 删除指定容器: docker rm id/名称
  • 删除所有容器: docker rm $(docker ps -a -q)
  • 删除所有镜像: docker rmi $(docker images -q)
  • 删除指定镜像(如果镜像被引用会删除失败): docker rmi id/名称
  • 查看容器详细信息: docker inspect <容器名称或 ID>
  • 清理所有未使用资源(包括镜像、容器、网络和构建缓存):docker system prune
  • 查看容器的ip地址: sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器id>
  • 查看容器端口映射: sudo docker inspect -f '{{json .NetworkSettings.Ports}}' <container_id>
  • 查看docker的所有网络: sudo docker network ls
  • 查看docker网络的详细信息: sudo docker network inspect <网络id>
  • 创建自定义网络: docker network create my_custom_network
  • 在容器外执行容器内命令(这里的5ca578c91df9是容器id, nginx -v是容器内部命令): sudo docker exec 5ca578c91df9 nginx -v
  • 进入运行中的容器的终端: docker exec -it <容器名或ID> /bin/bash
  • 重启容器: docker restart <容器名>
  • 将宿主机文件复制到容器: docker cp <宿主机路径> <容器名>:<容器内文件路径>
  • 将容器中文件复制到宿主机: docker cp <容器名>:<容器内文件路径> <宿主机路径>
  • 恢复已停止容器的运行: docker start <容器名或ID>
  • docker整个重启: sudo systemctl restart docker

让局域网用户,通过win11的ip访问wsl2中ubuntu中docker容器的服务

通过镜像网络实现

%UserProfile%\.wslconfig

ini 复制代码
[wsl2]
networkingMode=mirrored # 启用镜像网络模式,使 WSL2 与 Windows 共享网络
dnsTunneling=true # 启用 DNS 隧道,提高与 VPN 等复杂网络的兼容性
autoProxy=true # 同步 Windows 的代理设置到 WSL2
firewall=true # 启用 Windows 防火墙集成

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
hostAddressLoopback=true # 允许通过主机的局域网 IP 访问 WSL2 中的服务

wsl --shutdown

验证镜像网络模式

在 WSL2 中运行以下命令查看 IP 地址

复制代码
ip addr

如果 IP 地址与 Windows 主机的 IP 地址一致,说明镜像网络模式已启用。

让win11能够在仅安装docker cli的情况下,操作远程docker

进入远程服务器,查看远程服务器上的docker版本

我们这里的远程服务器就是指wsl2中的ubuntu

复制代码
docker version

可以看到我们的docker版本是: 28.0.1

yaml 复制代码
Client: Docker Engine - Community
 Version:           28.0.1
 API version:       1.48
 Go version:        go1.23.6
 Git commit:        068a01e
 Built:             Wed Feb 26 10:41:12 2025
 OS/Arch:           linux/amd64
 Context:           default

下载docker命令行工具

这里下载 docker 命令行工具,选择对应版本即可

若是无法打开上面的网址,那就按照这个格式拼接下载地址,再通过迅雷下载

download.docker.com/win/static/...

将压缩包解压,并将文件放入一个文件夹,如: d:\app\docker-cli-28.0.1文件夹

这里下载 docker-compose 命令行工具

若是无法打开上面的网址,那就按照这个格式拼接下载地址,再通过迅雷下载

github.com/docker/comp...

同样将docker-compose-windows-x86_64.exe重名为docker-compose.exe文件后,放入,如: d:\app\docker-cli-28.0.1文件夹

找到 docker.service 文件位置

find -name "docker.service"

bash 复制代码
./multi-user.target.wants/docker.service

编辑docker.service文件

找到如下内容,并注释掉

ruby 复制代码
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

替换为, 增加如下内容

ruby 复制代码
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

重启docker服务

复制代码
sudo systemctl daemon-reload && systemctl restart docker

在你本地通过浏览器访问http://{服务器IP}:2375/version, 当看到页面显示一串JSON时表示已开放远程访问。

访问wsl2中的docker则是: http://localhost:2375/version, 当看到页面显示一串JSON时表示已开放远程访问。

json 复制代码
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"28.0.1","Details":{"ApiVersion":"1.48","Arch":"amd64","BuildTime":"2025-02-26T10:41:12.000000000+00:00","Experimental":"false","GitCommit":"bbd0a17","GoVersion":"go1.23.6","KernelVersion":"5.15.167.4-microsoft-standard-WSL2","MinAPIVersion":"1.24","Os":"linux"}},{"Name":"containerd","Version":"1.7.25","Details":{"GitCommit":"bcc810d6b9066471b0b6fa75f557a15a1cbf31bb"}},{"Name":"runc","Version":"1.2.4","Details":{"GitCommit":"v1.2.4-0-g6c52b3f"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"28.0.1","ApiVersion":"1.48","MinAPIVersion":"1.24","GitCommit":"bbd0a17","GoVersion":"go1.23.6","Os":"linux","Arch":"amd64","KernelVersion":"5.15.167.4-microsoft-standard-WSL2","BuildTime":"2025-02-26T10:41:12.000000000+00:00"}

配置win环境变量

makefile 复制代码
DOCKER_HOST: tcp://localhost:2375
DOCKER_CLIENT: D:\app\docker-cli-28.0.1

并将:DOCKER_HOST设置到 PATH环境变量中,使得在所有地方,都可以调用docker-cli的命令

%DOCKER_CLIENT%

查看path环境变量中是否包含D:\app\docker-cli-28.0.1这个路径

bash 复制代码
# powershell 中查看path环境变量值
$env:Path

# cmd 中查看path环境变量值
echo %PATH%

验证是否成功

打开windows的CMD,在任意文件夹下执行docker ps查看是否显示服务器上的容器。

打开windows的CMD,在任意文件夹下执行docker-compose version看是否有效

在ubuntu中,基于nexus3搭建私服

nexus-3网盘下载地址

安装jdk 8

复制代码
sudo apt install -y wget openjdk-8-jdk unzip
java -version

解压与安装服务

复制代码
tar -zxvf nexus-3.70.1-02-java8-unix.tar.gz
bash 复制代码
# 必须保持这个目录结构
sudo mv nexus-3.* /opt/nexus 
# 必须保持这个目录结构
sudo mv sonatype-work /opt/sonatype-work

编辑 Nexus 启动文件,设置非 root 用户运行

bash 复制代码
sudo nano /opt/nexus/bin/nexus.rc

不一定要设置为nexus, 只要是非root用户即可

ini 复制代码
run_as_user="nexus"

配置 Nexus 服务

bash 复制代码
sudo nano /etc/systemd/system/nexus.service
ini 复制代码
[Unit]
Description=Nexus Repository Manager
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
# 用户必须与 /opt/nexus/bin/nexus.rc 中配置的一至
User=nexus
# 用户组必须是 /opt/nexus/bin/nexus.rc 中配置的用户,所在的用户组
Group=nexus
# 这里的nexus启动文件地址一定要写正确(这里只是示例)
ExecStart=/opt/nexus/bin/nexus start
# 这里的nexus启动文件地址一定要写正确(这里只是示例)
ExecStop=/opt/nexus/bin/nexus stop
Restart=on-abort

[Install]
WantedBy=multi-user.target

启动并启用 Nexus 服务

重新加载 Systemd 配置:

复制代码
sudo systemctl daemon-reload

启动 Nexus 服务:

sql 复制代码
sudo systemctl start nexus

设置开机启动:

bash 复制代码
sudo systemctl enable nexus

检查服务状态:

lua 复制代码
sudo systemctl status nexus

访问 Nexus Web 界面

arduino 复制代码
http://<你的服务器IP>:8081

首次登录时:

  • 默认用户名:admin
  • 默认密码:在 /opt/sonatype-work/nexus3/admin.password 文件中。
    查看密码命令:
bash 复制代码
cat /opt/sonatype-work/nexus3/admin.password

限制nexus内存占用

bash 复制代码
sudo nano /opt/nexus/bin/nexus.vmoptions
ini 复制代码
-Xms1G   # 设置 JVM 最小内存为 1GB
-Xmx1G   # 设置 JVM 最大内存为 1GB
-XX:MaxDirectMemorySize=1G  # 设置直接内存为 1GB

重启nexus服务

复制代码
sudo systemctl restart nexus

查看 Nexus 的内存使用情况

perl 复制代码
ps aux | grep nexus

通过Nexus搭建Npm私库

【Nexus】通过Nexus搭建Npm私库_nexus npm-hosted-CSDN博客

通过nexus搭建docker私服

Nexus3中搭建Docker私服_如何通过nexus代理拉取外部镜像源-CSDN博客

参考资料

windows10(家庭版)和windows11(家庭版)开启WSL2_启动wsl-CSDN博客

Ubuntu24.04换源方法(新版源更换方式,包含Arm64)-CSDN博客

全网最全Win10/11系统下WSL2+Ubuntu20.04的全流程安装指南(两种支持安装至 D 盘方式)_win10 wsl2安装-CSDN博客

windows11 安装WSL2全流程_wsl2安装-CSDN博客

WSL2 搭建 Windows 更好用的前端开发环境 | Arthur Wang

zsh 安装与配置,使用 oh-my-zsh 美化终端 | Leehow的小站

Ubuntu 24.04.1 LTS 安装Docker 丝滑!!!_ubuntu 24.04.1安装docker-CSDN博客

在 Windows 11 中设置 WSL2 Ubuntu 的 networkingMode=mirrored 详细教程-CSDN博客

Windows远程连接Docker服务_docker运行windows镜像 如何远程访问-CSDN博客

Ubuntu 上安装和配置 Nexus Repository Manager_ubuntu安装nexus-CSDN博客

【Nexus】通过Nexus搭建Npm私库_nexus npm-hosted-CSDN博客

相关推荐
招风的黑耳2 分钟前
Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
前端·elementui·axure
雯0609~3 分钟前
CSS:使用内边距时,解决宽随之改变问题
前端·css
Dolphin_海豚14 分钟前
10 分钟带你入坑 electron
前端·javascript·electron
乐闻x23 分钟前
性能优化:javascript 如何检测并处理页面卡顿
前端·javascript·性能优化
雯0609~29 分钟前
vue3:八、登录界面实现-忘记密码
前端·javascript·vue.js
烂蜻蜓1 小时前
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
开发语言·前端·css·html·html5
木木黄木木1 小时前
HTML5 Canvas弹跳小球游戏开发实战与技术分析
前端·html·html5
Anlici2 小时前
Axios 是基于 Ajax 还是 Fetch?从源码解析其实现
前端·面试
一个处女座的程序猿O(∩_∩)O2 小时前
Vue 中的 MVVM、MVC 和 MVP 模式深度解析
前端·vue.js·mvc
鱼樱前端2 小时前
前端程序员集体破防!AI工具same.dev像素级抄袭你的代码,你还能高傲多久?
前端·javascript·后端