Docker容器中GUI软件的远程图形界面交互:mobaXterm+SSH,以脑影像处理软件FSL为例;FSL6.0.3完整安装与可视化;docker容器图形化;远程登录docker容器;
前言 对docker容器中软件的操作,是基于命令行的,这就导致了习惯图形化界面的人比较难以使用docker,而它又是一个神器,所以很难受。一般情况下,可以给容器安装一个桌面环境,然后用类似VNC的方法去远程访问它。但是容器在服务器上时,我们大多数时候并不希望给它安装桌面环境,如果有程序需要操作图形界面时,多用X视窗系统,将该软件的图形界面转移到远程服务端。X是一种协议,当前版本为11,俗称X11
前言
对docker容器中软件的操作,是基于命令行的,这就导致了习惯图形化界面的人比较难以使用docker,而它又是一个神器,所以很难受。一般情况下,可以给容器安装一个桌面环境,然后用类似VNC的方法去远程访问它。但是容器在服务器上时,我们大多数时候并不希望给它安装桌面环境,如果有程序需要操作图形界面时,多用X视窗系统,将该软件的图形界面转移到远程服务端显示。X是一种协议,当前版本为11,俗称X11。X视窗系统由客户端和服务端组成,服务端X Server负责图形显示,而客户端库X Client输出要显示的内容。客户端和服务端用SSH协议连接。对docker容器而言,docker容器就是客户端,安装mobaXterm的主机就是服务端。mobaXterm不仅可以远程SSH连接docker容器,而且能用X协议对docker容器中的图形化软件远程进行图形界面交互(只有软件图形界面,不像远程桌面是一个完整的图形化环境)。搭建过程中踩了很多坑,故记录在此,供大家参考。
有图形界面的软件:FSL(由于笔者要用FSL,其实随便选个有图形化界面软件就可以,如gedit)。鉴于直接apt-get install的FSL版本过低,而较高版本的FSL安装不易,所以文末笔者将提供一个含有X11客户端环境和FSL6.0.3的完整docker环境,通过它你可以在30分钟内,在win10上搭建一个FSL6.0.3和fsleyes的软件环境,且有图形化界面。
宿主机操作系统:win10pro
服务端操作系统:win10pro
工具1:mobaxterm
工具2:win10 powershell
docker原理与基本操作:Doker入门一条龙
FSL简易安装:FSL5.0,安装容易,但版本老旧
docker下完整安装FSL:FSL 6.0.3,部署容易,便于分享环境,但配置GUI麻烦
Linux上单独安装FSL:FSL6.0.3/FSL6.0.4,离线安装,修复FSLeyes not found,无法分享环境
VMware安装FSL等:FSL6.0.3/FSL6.0.4,离线安装,修复FSLeyes not found,并放在虚拟机上,便于分享环境
注:笔者的客户端和服务端在同一台主机上,操作系统均为win10pro。原创不易,转载请注明出处。
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
创建容器并映射SSH端口——客户端
由于远程访问docker容器时,是通过宿主机的端口来访问的(记住它,很重要),所以需要先分配宿主机的端口给docker容器。先查看宿主机被使用的端口,选一个没有被占用到的。powershell中输入:
netstat -a
SSH默认端口是22,所以将宿主机的某空闲端口映射到容器的端口22,笔者选的50002。此时外部访问宿主机50002端口,就相当于在访问容器的22端口。
docker pull ubuntu:latest
docker run -it --privileged=true -p 50002:22 --name ubuntu_fsl_disp -v /d/docker/ubuntu_fsl_disp:/shared_data ubuntu bash
# 在容器中安装某些大型软件,如matlab时可能需要让--privileged=true,
# -p后跟端口映射,--name后跟你喜欢的容器名,-v后跟地址映射,根据你的需求来指定文件夹
docker GUI中查看端口情况:
用如下镜像源sources.list
替换/etc/apt/sources.list
,然后执行:
apt-get update
sources.list
# 163源 for ubuntu 2020.04
deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
apt-get install vim
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
容器中配置SSH——连接
容器中安装SSH server
apt-get install openssh-server
修改sshd_config,开放22端口,并允许密码登录
echo "Port 22">>/etc/ssh/sshd_config
echo "PermitRootLogin yes">>/etc/ssh/sshd_config
启动ssh服务
service ssh start
查看ssh状态
service ssh status
ssh自启,输入以下命令有问题,按照提示操作也没有解决,暂时不采用开机启动而直接采用打开终端时启动SSH。
systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
打开终端时启动SSH。写如下脚本ssh_auto_start.sh
,把它放在某个位置,笔者放在根目录下的。
#!/bin/bash
service ssh start
service ssh status
修改其权限为可执行。
chmod 755 /ssh_auto_start.sh
添加脚本路径与脚本名到/root/.bashrc。重启终端,就会提示SSH已经启动。
echo "/ssh_auto_start.sh ssh_auto_start.sh">>/root/.bashrc
测试容器SSH:mobaXterm远程登录docker容器——连接
先设置容器root用户密码,没有密码外部无法登陆。
passwd
查看22端口是否处于监听状态。
netstat -ap | grep 22
若不是,service ssh restart
重启一下SSH
另开一个powershell,查看宿主机IP地址。由于路由器在局域网内是动态分配IP地址的,那样我们每次联网宿主机被分配的IP地址都可能不一样。这样每次的连接都需要重新配置,非常麻烦,此处可以先给宿主机配置一下静态IP:Windows动态IP改静态IP。
ipconfig
笔者用的无线网:宿主机IP为192.168.1.104。宿主机IP即为docker容器IP。
打开mobaXterm,新建一个连接。宿主机IP即为docker容器IP,宿主机的50002端口即为容器的22端口。故SSH连接参数如下。注意修改端口号。
连接建好之后,输入用户名:root,加上上面设置的密码便可远程登录到容器里了。到此SSH连接成功。
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
mobaXterm远程图形化docker容器——服务端
通过mobaXterm远程向容器中装FSL(用不到FSL的朋友,安装gedit即可)。另外,此处只是为了阐述通用的搭建过程,通过apt安装是FSL5.0,版本很老,可能很多功能不能用,最新版FSL要通过其官网提供的方法才能安装完整。如果你的docker里已经有fsl软件,则跳过安装与配置环境变量,直接键入fsl。
apt-get install fsl
配置fsl环境变量
echo ". /etc/fsl/fsl.sh" >>/etc/bash.bashrc
mobaXterm上断开SSH连接,再重新连接。键入:
fsl
将显示:DISPLAY is not set. Please set your DISPLAY environment variable!,因为此时客户端的显示输出还没有投射到服务端,只需要为DISPLAY环境变量赋值(DISPLAY environment variable)即可。
可以在每次打开bash窗口时用以下命令手动赋值。yourIPaddress用你的服务端的IP地址代替。笔者服务端和客户端都在同一台电脑上,所以它与docker宿主机的IP地址相同,即192.168.1.104。
export DISPLAY=yourIPaddress:0.0
或者将该赋值命令写到.bashrc里。重启一下bash,此后每次启动bash便会自动赋值。
echo "export DISPLAY=yourIPaddress:0.0" >> /root/.bashrc
查看环境变量是否赋值成功。
echo $DISPLAY
赋值成功后,再次键入fsl(或者gedit),回车,奇迹出现了,fsl的交互界面以浮窗形式清晰的呈现在我们眼前。X11协议,真的是一个大神器。而mobaXterm集成了SSH与X服务,更是一个大神器。
另外,将下图中第四步改成full,这样就不会每次要显示一个窗口前都弹出询问框了。
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
容器导出与导入
导出我们配置好的客户端容器成镜像到本地,分享给朋友,他们就有了我们配置的客户端环境。
docker export -o d:/docker/ubuntu_fsl_x11.tar ubuntu_fsl_disp
# 导出位置与容器名,根据需要自定义
他们使用时,只需导入镜像,然后运行镜像,就可以得到上述所有的客户端配置。
docker import d:/docker/ubuntu_fsl_X11.tar ubuntu_fsl_x11
docker run -it --privileged=true -p 50003:22 --name ubuntu_fsl_x11 -v /d/docker/ubuntu_fsl_x11:/shared_data ubuntu_fsl_x11 bash
然后再从这个步骤:测试容器SSH:mobaXterm远程登录docker容器——连接,开始往下操作,他们就可以很快搞定图形化界面的远程投影啦。
FSL6.0.3通过容器完整安装
通过FSL官网的方式安装:用fslinstaller.py,亲测非常难安装成功。
通过安装包的形式安装,参见此文,安装完成之后fsleyes会无法使用。即fsleyes not found,可以参见此文进行修复,但是笔者没有修复成功。
通过docker用容器来安装,笔者用dockerhub上的一个容器改出了一个有图形化界面的FSL6.0.3,卸载了一些软件,配置了SSH,换了国内镜像源,也配置了X11。你可以通过以下方式获取并使用它。
直接DockerHub上pull:https://hub.docker.com/r/poetair/fsl6.0.3_x11
docker pull poetair/fsl6.0.3_x11
docker run -it --privileged=true -p 50000:22 --name fsl6.0.3_x11 -v /d/docker/fsl6.0.3_x11:/shared_data poetair/fsl6.0.3_x11 bash
或者通过百度网盘下载再导入:链接:https://pan.baidu.com/s/16QmXoWafai0QSKvB-gPy4w
提取码:55gb
将tar文件下载到本地某个位置:如D:\docker
docker import d:/docker/fsl6.0.3_docker_x11.tar fsl6.0.3_x11
docker run -it --privileged=true -p 50000:22 --name fsl6.0.3_x11 -v /d/docker/fsl6.0.3_x11:/shared_data fsl6.0.3_x11 bash
然后再从这个步骤:测试容器SSH:mobaXterm远程登录docker容器——连接,开始往下操作,就可以很快搞定图形化界面的远程投影啦。不出意外,30分钟内你就可以在win10上完美的安装一个有图形界面的fsl6.0.3。
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
参考
https://www.linuxprobe.com/putty-xming-oracle.html
https://blog.csdn.net/qq_16093937/article/details/83269106
https://blog.csdn.net/weixin_34355559/article/details/86388903
copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109273787
更多推荐
所有评论(0)