1 安装Xfce和TigerVNC

前提要求:

1、安装docker

2、拉取pytorch/pytorch镜像

常用的桌面环境

  • xface4: 轻量级桌面环境,适合远程桌面
  • gnome-session-flashback: Gnome2的经典桌面环境(Metacity),但用了GTK+3。有人提到安装gnome-session-fallback,这个已经被flashback替代了,不用fallback了。
  • ubuntu-gnome-desktop: 当前最新版本的Gnome桌面环境

这里,我们安装Xfce4.

1.1 Xfce和TigerVNC安装流程

# 启动新容器
docker run -it --runtime=nvidia --shm-size 32G --name pytorch8205 -p 8205:5901 -v /media/wen/ST_4T/Pytorch_Volume:/DateVolume pytorch/pytorch

# 更新系统关键软件包
apt update

# 安装Xfce DE
apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

# 安装TigerVNC服务器及其依赖项
apt install tigervnc-standalone-server tigervnc-common

# 创建启动脚本
touch $HOME/.vnc/xstartup

# 执行此命令之前在容器内安装了vim
vim $HOME/.vnc/xstartup

## 添加以下脚本(如果有乱码,删除脚本中的中文配置)
#!/bin/sh

unset SESSION_MANAGER 
unset DBUS_SESSION_BUS_ADDRESS 
startxfce4 &    #启动xface4
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup 
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources 
xsetroot -solid grey    #设置背景色

# 保存并关闭文件。无论何时启动或者重启TigerVNC服务器,都将会自动执行上述命令

# 使用chmod
chmod +x ~/.vnc/xstartup

1.2 新建vncserver

# 启动vnc
vncserver :1 -localhost no

# -localhost no是为了让其他计算机可以访问,而不仅仅是本地。没有这个option的话就只能本地VNC连接。从下面vnc监听状态可以看出,监听地址是0.0.0.0,而不是默认的127.0.0.1。
# vncserver -localhost no
# 不添加:1也可以,默认是1

# 容器安装net-tools 以使用 netstat命令
apt install net-tools

# 查询状态
root@1d5c98abd011:/workspace# netstat -ntupl     
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      9233/Xtigervnc      
tcp6       0      0 :::5901                 :::*                    LISTEN      9233/Xtigervnc  
# tigervnc已经在监听5901端口

1.3 容器保存为镜像

到这里,vncserver已经可以使用,接下来将此容器提交为新镜像

# 还是上文的容器,删除所有的vncserver
vncserver -kill :*
# 删除之后可能残留有日志文件,需要检查一下,按照提示删除
# 提交新镜像
docker commit -m="delete .X1-lock" bab8deed58d3 xfce/pytorch:1.1 
# 查看本地的镜像
wen@wen-Sys:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xfce/pytorch        1.1                 a1f6386b894b        2 hours ago         8.01GB
xfce/pytorch        1.0                 734a57546843        3 hours ago         8.01GB
pytorch/pytorch     latest              5ffed6c83695        2 months ago        7.25GB

接下来就可以根据镜像xfce/pytorch:1.1,开启新的容器

2 启动新容器

启动时要设置端口映射,vncserver默认的端口为5900,开启的第一个vncserver的端口为5901,所以,端口映射为宿主机端口:5901。这里也可以设置文件挂载。

# 启动新容器pytorch8206
docker run -it --runtime=nvidia --shm-size 32G --name pytorch8206 -p 8206:5901 xfce/pytorch:1.1
# 启动vncserver
root@baafffafdbfa:/workspace# vncserver -localhost no

New 'baafffafdbfa:1 (root)' desktop at :1 on machine baafffafdbfa

Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/baafffafdbfa:1.log

Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /root/.vnc/passwd baafffafdbfa:1 to connect to the VNC server.
# 重设密码
# 系统将提示输入并确定密码,以及是否将其设置为仅查看密码。如果输入 y ,则用户将无法使用鼠标和键盘与VNC实例进行交互

-localhost no是为了让其他计算机可以访问,而不仅仅是本地。没有这个option的话就只能本地VNC连接

# 启动vncserver
root@baafffafdbfa:/workspace# vncserver -localhost no

New 'baafffafdbfa:1 (root)' desktop at :1 on machine baafffafdbfa

Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/baafffafdbfa:1.log

Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /root/.vnc/passwd baafffafdbfa:1 to connect to the VNC server.

注意,上面输出中主机名之后的:1。这表示运行vnc服务器的显示端口号。在我们的例子中,服务器在TCP端口5901(5900+1)上运行。如果创建第二个实例,vncserver它将在下一个空闲端口上运行,即2,这意味着服务器会在端口5902(5900+2)上运行。

重设密码。系统将提示输入并确定密码,以及是否将其设置为仅查看密码。如果输入 y ,则用户将无法使用鼠标和键盘与VNC实例进行交互

root@baafffafdbfa:/workspace# vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n

到此为止,容器中已经安装Xfce和TigerVNC,并且启动运行。之后就可以在Ubuntu中使用vncViewer;在Windows中使用Putty和vncViewer。远程访问容器中的图形化Ubuntu。

3 Ubuntu开放端口

主要参考博文:Ubuntu系统中防火墙的使用和开放端口

在关闭宿主机防火墙的情况下,这一部分不需要进行。

端口开放均在宿主机上操作,容器中的系统我没有进行端口的操作。

# 开启宿主机防火墙
sudo ufw enable

# 开放22端口
sudo ufw enable 22

# 开启后效果
wen@wen-Sys:~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)  

# 查看哪些端口是开放的,分别是什么进程在监听
wen@wen-Sys:~$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1064/systemd-resolv 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1213/cupsd          
tcp6       0      0 :::5901                 :::*                    LISTEN      30334/docker-proxy  
tcp6       0      0 ::1:631                 :::*                    LISTEN      1213/cupsd