前言


  对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中查看端口情况:

  • 配置ubuntu:更新源

  用如下镜像源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
  • 装文本编辑器vim备用

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/bashservice 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

Docker容器中GUI软件的远程图形界面交互:mobaXterm+SSH,以脑影像处理软件FSL为例;FSL6.0.3完整安装与可视化;docker容器图形化;远程登录docker容器;相关推荐

  1. linux非图形化界面,在Linux图形界面中显示中文,非图形界面中,显示英文

    在Linux图形界面中显示中文,非图形界面中,显示英文 设置语言,应当改环境变量LANG 1. 在非Xwindow下显示英文.非Xwindow下不能显示中文汉字,如果设置成中文,则中文部分显示乱码,第 ...

  2. 计算机图形学第四次上机——鼠标回调图形界面交互实现

    计算机图形学第四次上机实验 课程实验报告 目录 计算机图形学第四次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 3.1绘制曲线 3.2绘制曲面 3.3颜色 3.4鼠标回调 四.实验 ...

  3. 06 java GUI 网络编程:图形界面聊天室

    仿照第4篇笔记的形式,笔者决定将GUI和网络编程部分用综合练习的方式来总结.练习项目是有图形界面的聊天室,用到了GUI中的javax.swing包和网络编程中的TCP/socket编程.GUI部分的难 ...

  4. java gui 层次结构_javaGUI教学图形界面的层次结构.ppt

    第六章GUI Graphics User Interface图形用户界面 浅谈图形界面开发 最常见的图形界面:windows操作系统 学习GUI的方法与内容 一.图形对象的布局(显示的内容如何摆放) ...

  5. WSL2中使用VcXsrv实现xfce4图形界面

    xfce4是一个轻量级的类Unix的桌面系统,提供桌面环境: VcXsrv/Xming提供图形界面,使在windows子系统wsl里的操作能够图形化显示:  注:安装了VcXsrv,就不用在安装Xmi ...

  6. Docker 方式安装部署 rocketMQ 、部署 图形化界面控制台、rocketMQ 控制台

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 直接上官网,找到工程,clone 到本地,地址:https://github.com/apac ...

  7. Docker快速安装Sybase数据库DBeaver数据库图形化管理开发工具

    Docker快速安装Sybase数据库 Sybase 15.7 Based on ifnazar/sybase_15_7 Needs about 30 seconds after start for ...

  8. ssh开启图形界面_Ubuntu下ssh连接显示图形界面

    在windows下用ssh连接服务器的话putty是一个小巧而且实用的工具,如果想要图形界面,可以使用X工具配合putty.或者直接使用xmanager enterprise,非常方便. 如果在ubu ...

  9. 怎么在手机上不用root运行Linux,【termux系列】安卓手机不需要root运行Linux终端,并开启图形化远程...

    前言 众所周知,安卓是基于Linux二次开发的手机系统,也是支持Linux指令的,使用一些软件就可以完美运行Linux指令,Linux终端是分的有root版与非root版的,本次就使用非root的终端 ...

最新文章

  1. Blender制作3D模型导出到UE5完整学习教程
  2. angularjs1-1
  3. 【转载】django在eclipse环境下建web网站
  4. 【django】基础条件查询
  5. storm后台启动命令(避免新开窗口)
  6. virt-manager 使用 shh 远程访问配置方法
  7. MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H
  8. python获取本机ip地址_python3 获取本机ip地址
  9. ASCII码表的应用
  10. Android 的singleTask和singleInstance的一点思考
  11. Linux基础知识练习题
  12. IPv6组播技术原理
  13. 通过docker创建Nginx容器并运行Vue项目(可用https进行访问)
  14. 影响下载速度的因素--总结
  15. 赫夫曼编码树(图解+完整代码)
  16. 韩顺平零基础循序渐进学Java——自学笔记
  17. STM32cubeide代码自动补全教程
  18. 「蓝光」「720/1080p」「HR-HDTV」等视频制式都是什么意思?清晰度对比如何?
  19. SQL语句的书写顺序和解析顺序
  20. 如何用origin作图

热门文章

  1. 2022软件测试高频面试题汇总(附带答案)「 建议收藏 」
  2. vue-solt插槽
  3. Kcauldron服务端linux版,我的世界1.7.10[KCauldron]服务端精简基础整合包
  4. FA-DDP叶酸磁性纳米颗粒载顺铂/E100-DDP 姜黄素修饰顺铂
  5. C# 常用ORM框架
  6. STM32CubeMX——环境配置以及实例编译烧写
  7. XMind 2020 for mac (XMind思维导图)
  8. 小米8se android q,小米8 SE
  9. 入门canvas - 通过刮奖效果来学习
  10. 北京大学曹建老师tensorflow慕课中在运行GRU模型时,history = model.fit()中遇到的问题:object has no attribute ‘dtype‘