WSL+docker+VScode+GUI 工作流&连接远程服务器桌面:让你享受linux的环境与windows的图形界面

前言

本文主要介绍在windows上的WSL环境中
(1)运行docker的过程
(2)使用远程桌面连接
(3)插入一些linux的网络知识

虚拟机的问题

运行速度慢,性能差;与宿主机的信息传递不方便(文件传输、文件共享);而且正常的虚拟机配置是无法使用主机的

这时,我们有几种使用Linux系统的方法:
(1)安装双系统。但是无法享受到windows的GUI界面,文件共享不太方便
(2)使用WSL
(3)使用docker。docker和前两者是兼容的,能同时使用。

WSL的安装及使用

WSL相当于在windows上运行的Linux虚拟机,但是相比虚拟机性能更高。缺点是没有图形化界面,但是Linux的精华就在于命令行界面,没有GUI界面倒也无所谓。而且我们之后也有解决办法。

可以参考OI wiki的说明来安装WSL。这里不多做介绍,就说两点:(1)把WSL放在一个存储空间较大的地方,它占地方大(2)windows的磁盘是以挂载的形式供WSL访问的,挂在/mnt/c,/mnt/d的目录下

VScode中提供了WSL的插件,用起来特别方便,这样我们点左下角的远程连接标志,就能连接到WSL,在VScode中的命令行中使用Linux环境,正常使用左上角的打开文件夹来查看WSL中的文件,享受到了windows的图形界面。在这个意义上,和远程连接服务器没有什么区别。
在这里插入图片描述
安装之后,可以参考笔者的文章从零开始安装linux双系统(ubuntu)深度学习环境配置踩坑全记录,来配置环境。

远程桌面连接

同样可以参考 WSL (Windows 10) - OI Wiki

基本概念

  • xfce4
    XFCE4 是一个轻量级的桌面环境,旨在为 Linux 和其他类 Unix 操作系统提供快速、高效的用户界面。
    xfce4-session
    会话管理器,负责启动和管理 XFCE4 桌面环境。
    提供会话恢复功能,使用户在重新登录时能够恢复上次的工作状态。
    xfce4-panel
    面板管理器,允许用户添加和配置面板插件。
    常见的面板插件包括任务栏、系统托盘、时钟、快捷启动按钮等。
  • x11协议
    客户端-服务器架构
    X11 使用客户端-服务器模型,其中 X 服务器负责管理显示硬件(如屏幕、键盘和鼠标),而 X 客户端是运行应用程序的进程。
    客户端和服务器可以通过本地进程间通信(IPC)或网络连接进行通信。
    网络透明性
    X11 协议设计为在网络上传输图形数据,这意味着 X 客户端可以在一台机器上运行,而 X 服务器可以在另一台机器上运行。
    这种特性使得远程图形应用成为可能,例如,你可以在本地机器上运行图形应用程序,但显示在远程服务器上。

注意x11是一个协议,而下面的VNC,xrdp等是一个解决方案,xfce4仅仅是一个本地的桌面环境,和远程桌面联系不是很紧密。

  • 网络知识
    具体细节官网有详细说明。
    主机使用一个独特的ip地址和WSL通信,就是windows cmd执行ipconfig后图里的IPv4:
以太网适配器 vEthernet (WSL):
   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : xxxxxxxxx
   IPv4 地址 . . . . . . . . . . . . : xxx.xx.xx.x
   子网掩码  . . . . . . . . . . . . : xxx.xxx.xxx.x
   默认网关. . . . . . . . . . . . . :

WSL命令行执行ip route show | grep -i default | awk '{ print $3}' 表示从 WSL 2 看到的 WINDOWS 计算机的 IP 地址 (WSL 2 VM),和上面的结果是一样的。
WSL命令行执行ip addr show表示WSL认为的WSL ip地址,同时也是ifconfig命令得到的结果
io 打头的是本地的地址,用来访问本机的网络,一般为127.0.0.1,参考什么是127.0.0.1,如何使用这个IP地址


/etc/resolv.conf 文件是 Linux 和其他类 Unix 操作系统中用于配置 DNS(域名系统)解析的重要文件,通常包含以下几个配置选项:

nameserver
含义:指定 DNS 服务器的 IP 地址。
格式:nameserver <IP地址>
search
含义:指定域名搜索列表,用于在解析域名时自动添加后缀。
格式:search <域名1> <域名2> …
domain
含义:指定默认的域名,用于在解析域名时自动添加后缀。
格式:domain <域名>
我们在配置远程桌面的时候可能要修改它。

连接WSL的桌面之前,首先你要保证你的WSL已经安装了xfce4桌面,下面的教程里也有这一点。

WSLg

WSL有自带的图形界面,官网有介绍,但是笔者为了模拟连接远程服务器的使用,没有用这个东西。也不了解怎么用

windows自带的远程桌面连接

在windows的搜索栏中输入“远程桌面连接”即可,输入Linux视角下自己的ip addr show 命令得到的eth0那一段中的inet地址

VcXsrv

使用XLaunch.exe即可,参考:搭建 WSL2 的沙雕版 GUI(VcXsrv+xfce4)

有问题的话,请看解决方案:
Windows11下使用VcXsrv+xfce4实现图形化窗口
WSL2中使用VcXsrv实现xfce4图形界面+声音传输

我在这里按照教程做并没有成功,最后按照GPT说的方法取得了成功,关键在于配置一个环境变量export DISPLAY=:0
参考:彻底理解Linux的DISPLAY变量的作用DISPLAY环境变量

DISPLAY环境变量格式如下:host:NumA.NumB。
host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器.
如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式。
DISPLAY=:0.0 的含义如下:

  • :0:这部分指定了 X 服务器的显示号(screen number)。在 X Window 系统中,多个显示器可以由不同的显示号标识。:0 通常表示第一个显示器或第一个 X 会话。如果你有多个显示器或多个 X 会话,它们可能会被标识为 :1:2 等。
  • .0:这部分指定了会话号(session number)。在同一个显示器上,不同的 X 会话可以由不同的会话号标识。.0 表示第一个会话。如果有多个会话,它们可能会被标识为 .1.2 等。

你可能还需要使用xhost +local命令: 表示授权本地的所有用户和进程连接到 X11 显示。按理来说,此时执行sudo startxfce4,就能看到桌面了,但是我并没有看到,不知道为什么。但是笔者执行xeyes是可以在本地成功看到图形的,使用matplotlib库也能在本地显示。

xrdp

XRDP(X Remote Desktop Protocol)是一种开源的远程桌面解决方案,允许用户通过 RDP(Remote Desktop Protocol)协议连接到 Linux 系统。XRDP 使得用户可以像使用 Windows 远程桌面一样,从任何支持 RDP 的客户端连接到 Linux 桌面环境。
网上相关的教程比较多:Xrdp服务安装配置实现Linux远程桌面访问

VNC

笔者认为这个方法是最好用的,但它需要远程的服务器也安装vncserver,并且设置密码。本地需要注册一个VNC账号,连接到特定的端口上。你打开远程主机的VNC时,系统会提示给你一个端口号
远程的590x对应本地的x端口,输入地址的时候我们要用WSLip addr show得到的地址后面接上:x端口才能连接上!

笔者使用这个方法成功在本地看到了桌面。

安装docker

关于docker desktop的安装,官网有介绍。
参考https://yeasy.gitbook.io/docker_practice

docker的基本概念

  1. 镜像 image:类似ubuntu的.iso文件,每个人都可以在本地安装一个属于自己版本,但拥有相同的初始环境,好处是省去了配环境的麻烦
  2. 容器 container:镜像的实例化,一个容器内部可以是一个ubuntu的环境

下载的镜像文件需要被docker load才能被docker识别成image,本地的docker image需要被docker run实例化,如果你退出一个容器,那么你相当于docker stop了该实例,但是这个实例(所有的更改)还在,你仍然可以docker start它。执行docker exec -it是进入容器内部,也就是进入ubuntu的命令行。
每个镜像有一个镜像名,是发行者确定的。每个容器有一个id,是一串数字,你也可以给容器起一个简单的名字,便于在命令行中引用它。

在WSL中使用

参考官网链接:https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers

docker常用命令

首先确保 Docker 守护进程已经在你的系统上运行(不过VScode也会帮你处理这一点!),打开Docker Desktop。
请参考https://yeasy.gitbook.io/docker_practice的超级详细讲解。

笔者常用的就几个命令,注意这些命令都是在WSL环境中执行,而不是docker容器内部,按使用顺序:

  1. 导入docker镜像,一般是从网上下载的.iso文件,.tar或.tar.gz文件也都可以。这样我们拥有了ubuntu环境
    docker load -i 镜像文件路径
  2. 查看镜像和容器
    docker image ls docker container ls docker ps -a查看镜像/容器/进程的详细情况
  3. 创建docker容器
    docker run -it --name <你起的容器名》 -v WSL挂载文件 ubuntu:/mnt/ <镜像名>:<标签> /bin/bash
    这个命令-v把WSL挂载在ubuntu的/mnt目录下,-it表示交互式运行,有命令行
  4. 进入docker容器,这样,你会进入一个已经运行的容器内部的命令行页面,与主机隔离开来。
    docker exec -it my_container /bin/bash
    docker exec -it 是 Docker 命令的一部分,用于在已经运行的容器中启动一个新的进程,并提供交互式的终端。这个命令非常有用,特别是在你需要进入容器内部进行调试或执行某些命令时。
    -i 或 --interactive:
    含义:保持 STDIN(标准输入)打开,即使没有附加。
    作用:允许你在终端中输入命令并与容器进行交互。
    -t 或 --tty:
    含义:分配一个伪 TTY(终端)。
    作用:创建一个终端会话,使得你可以看到命令的输出并进行交互。
  5. 与主机的双向文件传输
    docker cp 主机绝对路径 容器名:/home/username/
  6. 删除容器
    docker rm 容器id或容器名
  7. docker容器命令行中exit退出容器

还可以参考docker重启参数–restart=always的作用

VScode使用

每次打开VScode的时候,点击远程资源管理器(电脑形状)的扩展,你会看到下图选项,选择开发容器,并且选择你想要连接的容器即可(如果没有可以试试连接到WSL),例如最下面的图。好处在于,你不用每次指定docker的任何命令,插件会帮你自动解决一切

在新的VScode环境中我们需要安装一些原来安装过的插件的远程版本,因为这些插件的原来版本是为了在本地主机上使用的,无法配合远程连接使用,需要重新安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值