0. 前言

VNC是虚拟网络控制台(Virtual Network Console)的缩写,是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美,但是由于VNC协议自身的限制,无法提供文件上传下载的能力。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下用户只需要其中的两个命令:vncserver 和 vncviewer。
VNC基本上是由两部分组成:一部分是客户端的应用程序(vncviewer);另外一部分是服务器端的应用程序(vncserver)。在任何安装了客户端的应用程序(vncviewer)的计算机(Windows, linux均可)上都能方便地和安装了服务器端应用程序(vncserver)的计算机相互连接。vncserver可以在服务器端生成一个虚拟的桌面环境,连接成功后就可以在本地屏幕上显示。

所以我们的整体思路,就是在docker容器中安装vnc-server和一个桌面软件,然后在本地机器安装vnc-viewer;在docker容器中启动vnc-server服务,就可以在本地Windows中用vnc-viewer指定ip和端口来连接docker容器,从而可视化容器的UI操作界面。

环境:

远程服务器:

  • Docker版本:20.10.18
  • 使用的镜像:pytorch/pytorch 1.11.0-cuda11.3-cudnn8-runtime

本地机器环境

  • Windows11

1. 容器端配置

1.1 启动Docker容器

sudo docker run -itd --gpus all --name CONTAINER-NAME --restart unless-stopped -e USER=root -v /local/directorty:/workspace -v /dev/shm:/dev/shm -p xxxx:5901 pytorch/pytorch:1.11.0-cuda11.3-cudnn8-runtime

命令中的名字、目录等替换成自己的,-e USER=root-v /dev/shm:/dev/shm-p xxxx:5901不要改,-e USER=root是后续容器中启动vncserver所需的环境变量,5901端口是vncserver启动时默认使用的端口,-v /dev/shm:/dev/shm保证容器的内存不会不够。

启动成功后进入容器:

sudo docker exec --it CONTAINER-NAME bash

1.2 安装x11

x11是一个用于远程图形界面的程序,若只安装x11,也可以通过ssh -x连接后显示图形程序。

apt-get install xorg openbox

1.3 安装桌面环境

本示例中,桌面环境使用Xfce,它是一个精简的轻量化桌面,与Gnome和KDE相比更小巧,并且界面美观、对用户友好,适合云服务器远程连接场景下使用。其他的桌面环境还有ubuntu-desktop等。

更新软件列表

apt update

安装Xfce桌面环境,顺便装个vim,方便后续文件编辑

sudo apt install xfce4 xfce4-goodies vim

1.4 安装tightvncserver

apt install tightvncserver

执行完成后,输入vncserver命令进行配置:

  • 密码:输入一个6-8位的密码,后续用VNC viewer连接会用
  • 是否创建仅查看密码:使用仅查看密码登录的用户将无法使用鼠标或键盘控制云服务器。此处输入“n”

2. 配置VNC Server

2.1. 首先停止刚刚新建的虚拟化桌面

上一步输入vncserver时创建了一个新的虚拟化桌面
输入以下命令先删除它

vncserver -kill :1

2.2 修改xstartup文件

修改xstartup文件

vim ~/.vnc/xstartup

i进入编辑模式,添加以下内容之后保存并退出

#!/bin/sh
xrdb $HOME/.Xresources
startxfce4 &

这里我的配置文件里只少最后一行,所以只添加最后一行即可。
其中,

  • 第一个命令xrdb $HOME/.Xresources告诉VNC的GUI框架读取服务器用户的.Xresources文件。用户可以在.Xresources中更改图形桌面的某项设置,如终端颜色、光标主题和字体渲染。
  • 第二个命令startxfce4 &告诉系统启动Xfce。

在这里插入图片描述

为了保证VNC服务正常启动,需要配置xstartup为可执行文件。

chmod +x ~/.vnc/xstartup

2.3 启动新的虚拟化桌面

vncserver -geometry 1280x960

-geometry参数用来设置分辨率,vncserver --help可以查看更多参数

在这里插入图片描述
回显信息中出现类似这样的一条信息:Log file is /root/.vnc/xxx:1.log。其中,“1”表示当前用户分配的是VNC的第一个虚拟桌面。


3. 本地安装VNC Viewer

VNC Viewer在Windows, Linux中都有相应的安装包。 我的本地机器使用的Win11系统,直接下载安装包安装即可。
VNC Viewer下载地址: https://www.realvnc.com/en/connect/download/viewer
安装完成后,启动VNC Viewer,在上方输入框中输入ip:端口号并确定,弹出的警告窗口选择Continue,然后密码即为1.4中创建的密码。
在这里插入图片描述
连接成功后的界面:

在这里插入图片描述


4. 遇到的问题

4.1 终端无法启动

在桌面点击终端图标启动终端报错:

Failed to execute default terminal. Emulator. input/output error

在docker容器的命令行中输入下面命令

sudo apt-get install xfce4-terminal
sudo update-alternatives --config x-terminal-emulator

按照输出的提示选择xfce4-terminal.
参考链接:Getting input/output error running anything on remote desktop

4.2 浏览器无法启动

Failed to execute default web browser. input/output error

解决办法:安装一个Chrome浏览器并设置为默认
安装wget

apt install wget

下载Chrome安装包

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

安装Chrome

apt install ./google-chrome-stable_current_amd64.deb

设置为默认浏览器,打开终端输入

xfce4-settings-manager

选择"Preferred Applications"
找到 Web Browser,然后选择Other...,选择Google-Chrome或者输入/usr/bin/google-chrome即可

参考链接:Failed to execute default web browser. input/output error

4.3 浏览器中显示的中文为乱码

  1. 安装locales并配置
    apt install locales
    dpkg-reconfigure locales
    
  2. 语言编码选择 en_US.UTF8,zh_CN GB2312,zh_CN GBK GBK,zh_CN UTF-8 UTF-8
  3. 为当前用户配置默认语言为中文zh_CN UTF-8 UTF-8,在~/.bashrc最后添加一行
    export LANG=zh_CN.UTF-8
    vim ~/.bashrc
    
    添加即可
    export LANG=zh_CN.UTF-8
    
  4. 安装中文字体
    apt install fonts-wqy-zenhei
    
    重新启动即可
    参考链接: xfce4 设置中文
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐