前言


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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐