查看原文
其他

搞台虚拟机玩玩!

鱼皮 程序员鱼皮 2024-01-21

Linux 虚拟机 + 远程开发保姆级教程,轻松搭建高效开发环境!

大家好,我是鱼皮。最近我正在带大家开发 OJ 系统,需要用 Docker 容器技术 来实现隔离的代码沙箱。

随之而来的是一个难题:很多同学的电脑都是 Windows 的,直接在 Windows 上安装 Docker 容器比较麻烦,需要依赖 WSL(Windows Subsystem for Linux),很容易出现各种报错。

比如 WSL 内核版本太低:

缺少 WSL:

所以,我们不妨直接搞一台 Linux 系统的服务器来安装 Docker 吧,不仅不会影响现有的系统,以后开发和部署项目也都会更方便。

那么如何拥有一台 Linux 服务器呢?

比较常见的有 2 种方式:

  • 购买第三方云服务商的云服务器
  • 使用虚拟机软件,在自己电脑上额外运行 Linux 系统

第一种方式要花钱,就不多说了。本篇文章我会带大家实践第 2 种方式,只需几分钟的时间,手把手带大家在 Windows 上安装 Linux 虚拟机,并且实践 2 种远程开发方法,让大家像使用 Windows 一样轻松地在 Linux 上开发程序。

⭐️ 本文对应视频教程:https://www.bilibili.com/video/BV1h94y1k7Jf/(讲解会更细节,建议配合本文使用)

一、虚拟机安装

1、下载安装

首先我们要下载虚拟机软件,这里比较推荐 VMware Workstation Player,个人不商业使用是 免费 的。

直接到 VMware 官网下载:

指路:https://www.vmware.com/cn/products/workstation-player.html

这里有条件的朋友也可以使用 VMware Workstation Pro,功能更全,但是要付费。

在官网点击免费下载后,即可进入安装流程。

这里要注意勾选 “自动安装 Windows Hypervisor Platform” 和 “将 VMware Workstation 控制台工具添加到系统 PATH” 两个选项:

选择免费、非商用版本:

然后就安装成功了,比起在 Windows 上折腾 WSL,安装虚拟机可方便太多了~

2、安装系统

虚拟机软件安装完成后,我们打开软件,接下来要先新建虚拟机来安装一个 Linux 操作系统:

点击创建新虚拟机,然后它让我们提供一个 Linux 操作系统的镜像:

问题是,Linux 操作系统有很多的发行版,我们安装哪个版本呢?

我学生时代的时候,特别喜欢用 CentOS,但可惜的是,CentOS 已经停止维护了。。。

所以这里我们选择 Linux Ubuntu 18.04 LTS 版本来给大家演示,有图形界面,会更能照顾到新手同学。

Ubuntu 镜像下载:https://releases.ubuntu.com/18.04/

拉到底部,找到 .iso 后缀的文件下载即可:

当然,萝卜青菜,各有所爱,会玩 Linux 的同学可以自由选择版本~

指定完操作系统后,我们继续新建虚拟机,可以根据实际的电脑情况来自定义虚拟机的硬件。如果你的电脑配置还不错,内存和 CPU 可以分配多一点:

点击完成,然后稍等片刻,系统就安装完成并启动啦!

3、修改配置

像购买一台新电脑一样,我们有了新的操作系统后,可以自行修改一些配置,比如修改语言为中文。

修改语言为中文

windows 键,弹出功能搜索按钮,输入 "language",打开 "语言支持":

我这台虚拟机是已经改完语言的,所以截图中已经是中文了

然后点击添加语言,选择中文简体,并且把汉语拖到语言列表的最上面,最后点击应用到整个系统:

稍等片刻,中文语言包、输入法等内容就安装好了,点击右上角重启虚拟机:

重启后,同样是按 windows 键,弹出功能搜索按钮,输入 "language",打开 "区域和语言":

在区域和语言设置中,新增输入源,添加已安装的中文输入法:

修改分辨率

用同样的方法,我们可以调整系统的分辨率。

先打开显示设置:

然后可以调整分辨率和字体大小:

修改时间

默认情况下系统的时区可能是有问题的,我们可以打开“日期和时间”设置,选择时区为“中国上海”:

4、安装软件

基本配置修改完成后,我们就可以给 Linux 系统安装软件并使用了。

和其他操作系统一样,Linux Ubuntu 也有自己的应用商店,能够可视化一键安装软件,比如防火墙之类的,适合新手操作:

当然,大家用 Linux 更多地还是要学习它的终端命令行操作,所以这里我们以 Docker 为例,使用命令行来快速安装。

Ctrl + Alt + T 快速打开终端,输入以下命令来一键安装 Docker:

apt 命令是软件包管理工具,能够让我们方便地安装软件

sudo apt install docker.io

如下图:

安装完成后,输入 docker -v ,查看版本号,如下图:

然后输入 docker run 命令,测试 Docker 能否正常运行:

sudo docker run hello-world

能看到如下信息,表示 Docker 安装成功:

怎么样,比在 Windows 安装方便多了吧?

二、Java 远程开发

有了 Linux 系统后,我们怎么在 Linux 上开发呢?

是直接在 Linux 上安装常用的开发工具,然后在虚拟机里编写代码么?

No、No、No,这样不仅要改变你原本的编码习惯,还可能会出现卡顿。如果你的项目有的在 Windows、有的在 Linux,需要同时开发的话,来回切换系统可太麻烦了。

所以这里我会教大家使用远程开发,直接在自己的 Windows 电脑上操作 Linux 服务器,和之间的开发方式完全一致!

两个字:“丝滑”!

下面我会以 Java 开发为例,带大家掌握 2 种远程开发的方式:远程部署纯远程开发 ,大家可以根据实际情况选择合适的方式。

1、前置准备

在学习远程开发前,我们要先做一些准备工作。

1)网络连通

要确保我们本地的 Windows 电脑能够连接到 Linux 虚拟机。

首先在设置中搜索网络,点击查看网络设置:

获取到虚拟机的 IPv4 地址,这个地址一定要记好了:

在自己的 Windows 电脑上 ping 这个 IP 地址,测试能否 ping 通。

如下图,表示网络正常连通:

2)开启 SSH

光能 ping 通虚拟机还不够,很多远程开发工具都是通过 SSH 协议连接远程服务器的,所以我们要在 Linux 虚拟机上开启 SSH。

在 Linux 虚拟机上打开终端,输入下列命令安装 SSH 服务器:

sudo apt-get install openssh-server

安装后,输入下列命令检查 SSH 是否已开启:

ps -e |grep ssh

如下图,则表示 SSH 开启成功:

如果未启动,执行 sudo service ssh start 手动启动服务试试

3)安装 Java

因为我们要演示 Java 远程开发,所以 Java JDK 的安装是必不可少的。

Linux 下安装 JDK 还是很方便的,首先打开终端,输入命令来更新软件源信息:

sudo apt update

然后执行下列命令来安装 Java 8(经典版本):

sudo apt install openjdk-8-jdk

安装完成后,输入命令检查 Java 版本:

java -version

看到如下输出,表示 Java 安装成功:

4)安装 Maven

除了安装 Java 外,我们还要安装 Java 的项目依赖管理工具 Maven,便于接下来我们测试 Spring Boot 项目的远程开发。

打开终端,输入如下命令安装 Maven:

sudo apt install maven

安装完成后,输入命令来查看 Maven 的版本号:

mvn -v

看到如下输出,表示 Maven 安装成功:

环境准备完毕,接下来开始远程开发之旅~

2、远程部署

第一种远程开发方式是 远程部署,就像我们真实做项目时,先在本地用代码编辑器完成开发,再把代码放到 Linux 服务器上去部署一样。远程部署的思路是在本地编写代码,然后把本地的代码文件定期同步到 Linux 服务器,再用本地电脑操作远程服务器完成部署和运行。

如下图:

这种方式更多地是为了提高将代码放到服务器部署的效率,不算是真正意义上的远程开发,但可以达到接近的效果。

远程开发主要分为 6 个阶段:编码、文件同步、运行、编译构建、部署、调试。接下来让我们以一个最简单干净的 Spring Boot 项目为例,实战上述几个操作。

0)编码

假设我们本地已经有了一个示例项目,仅提供一个 checkHealth 接口,用于测试服务能否正常访问,端口为 8080。

核心代码如下:

@RestController("/")
public class MainController {

    @GetMapping("/health")
    public String checkHealth() {
        return "ok";
    }
}

1)文件同步

打开 JetBrains IDEA 开发工具,点击 Tools => Development => Configuration:

进入到如下操作界面,需要先来配置 SSH,和服务器建立连接:

进入 SSH 配置,输入自己实际的服务器 IP!不一定和下图的 IP 地址相同!

点击测试连接,能看到连接成功的弹窗;如果报错,可能是 IP 地址、用户名或密码输错了。

回到部署界面,点击 Mappings 来配置路径映射,就是把本地电脑的文件同步到远程服务器的指定路径:

保存,在 IDEA 右侧就能看到我们虚拟机的所有文件列表啦:

然后点击 Tools => Development => Automatic Upload,开启自动同步:

现在,尝试在自己电脑的代码文件夹中新建一个文件,该文件就会自动同步到 Linux 虚拟机~

但目前如果你删除了自己电脑的文件,Linux 虚拟机的对应文件不会删除,所以我们还要进入 Options 配置:

勾选上文件删除的同步:

至此,你在本地编写的代码都会自动同步到服务器上了。

2)运行项目

可以直接在 IDEA 的终端中快速创建一个能够远程访问远程服务器的终端:

然后使用 cd 命令进入到代码目录:

输入 Maven 命令来运行项目:

mvn clean
mvn spring-boot:run

能够看到项目成功启动:

然后访问远程服务器的接口地址(比如 http://192.168.170.132:8080/health),能够看到如下输出:

表示我们已经能够正常访问到 Linux 服务器上运行的项目了。

还可以在 Deployment 界面中配置 web server url,相当于一个快捷访问方式:

3)构建项目

和上面运行项目的方式相同,在自己的电脑打开终端访问远程虚拟机,然后执行 Maven 打包命令:

mvn package

看到如下输出,表示打包成功:

然后在服务器上就能看到生成的可执行 jar 包:

4)部署项目

现在项目可执行 jar 包已经放到了服务器上,我们只需启动即可。

输入下列命令,以生产环境运行 jar 包:

java -jar /home/yupi/code/target/yuoj-code-sandbox-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

看到如下信息,启动成功:

5)远程调试

现在程序已经在 Linux 虚拟机上启动了,那么我们如何调试远程的程序呢?比如打断点、查看变量信息等。

首先强调一点,远程调试不要乱用,可以在开发时调试,但千万别给线上打断点!影响正常用户的访问。

开启远程调试的方法很简单,首先在 IDEA 右上角找到编辑配置:

然后新建一个远程 JVM Debug 配置:

更改配置,修改自己虚拟机的 IP、希望占用的远程调试端口、JDK 版本等,IDEA 会自动生成一段远程调试参数:

在启动项目时,给启动命令追加上述界面生成的 command line 参数,注意要加到 jar 包路径之前

示例命令如下:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /home/yupi/code/target/yuoj-code-sandbox-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

启动项目后,在右上角开启 Debug:

然后给代码打个断点:

再访问对应的端口,可以看到 Debug 已经生效:

现在,你就可以把 Linux 虚拟机当做自己的电脑进行远程开发啦~

3、纯远程开发

除了上面的方式外,还有一种更简单的远程开发方法。

使用 IDEA 自带的远程开发功能,可以直接将本地的编译、构建、调试、运行等工作全部都放在远程服务器上执行!而本地仅运行客户端软件连接服务器,像之前一样编写代码、进行其他开发操作即可。

这种方式就很像云游戏,自己的电脑不存放代码、不负责程序的运行,只需要运行一个操作界面即可,而 “脏活累活”都交给服务器。适合本地电脑性能差(服务器性能强)、开发环境多人协作开发、需要统一开发环境的场景。

如下图:

这种方式也更简单,进入 IDEA 主页,找到 SSH 选项,点击新建项目:

配置 SSH 连接:

指定远程开发的代码路径:

首次使用时,需要等待下载 JetBrains Client 客户端:

服务器上也会自动安装对应的远程开发后端:

然后进入远程开发:

打开任务管理器,可以看到 JetBrains 的 client 非常 “轻量”:

进入客户端界面,软件会自动加载 Maven 项目,但是需要手动指定服务器上已安装的 JDK:

然后直接以 Debug 模式启动项目:

还可以配置请求转发,像访问本地服务一样访问远程端口:

接下来访问本机地址 http://127.0.0.1:8080/health,就能够访问到项目啦,而且直接支持 Debug!无须做任何多余的配置!


至此,使用 Linux 虚拟机 + 远程开发的教程就结束了,个人更喜欢第二种远程开发方式,非常简单、而且丝滑,接下来大家就可以愉快地学习 Linux、Docker 等技术啦~

原创不易,大家如果学会了的话,希望能点赞收藏支持下 🌹

往期推荐

新项目又来咯!

看完这个,我直接把 SQL 刷通了!

一次很意外的网站故障经历。

实习天天crud,很迷茫...

最近面试了一些人,有些槽点跟大家说说。

有自信了,再战阿里!

继续滑动看下一个

搞台虚拟机玩玩!

鱼皮 程序员鱼皮
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存