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 "youremail@domain.com"

# 生成 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博客

相关推荐
GIS之路7 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug10 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213812 分钟前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中34 分钟前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路38 分钟前
GDAL 实现矢量合并
前端
hxjhnct40 分钟前
React useContext的缺陷
前端·react.js·前端框架
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全
前端工作日常1 小时前
我学习到的AG-UI的概念
前端
韩师傅1 小时前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端