• Docker容器运行GUI程序的配置方法


    0.环境说明

    Ubuntu 16.04 
    docker 1.35

    1.Docker的“可视化”

    Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多。 
    但有时候我们会有在docker容器里运行一些图形界面的软件,或者要调用摄像头,输出图像等等一些需求,这个时候需要解决这个Docker “可视化”的问题。 
    (这里的“可视化”不是很容易搜到的可视化管理的方法)

    2.解决方案1—启动容器时添加配置选项

    林帆:Docker运行GUI软件的方法

    这篇文章里介绍了Docker公司的程序员杰西·弗莱泽尔(Jessie Frazelle)展示的使用了图形界面的镜像的例子,Jessie也开源了她展示的docker 运行libreoffice软件的代码和使用方法。

    2.1 原理简介

    原文中讲的比较详细,原理并不复杂,我按照自己理解很浅显地讲一下。 
    原理上可以把docker镜像看做一台没配显示器的电脑,程序可以运行,但是没地方显示。 
    而linux目前的主流图像界面服务X11又支持 客户端/服务端(Client/Server)的工作模式 
    只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给docker,docker 就可以通过端口找到显示输出的地方,和linux系统共用显示

    2.2 具体操作(显示到本地显示器)

    1)首先,在主系统里运行

    $ sudo apt-get install x11-xserver-utils
    
    $ xhost +

    这两句的作用是开放权限,允许所有用户,当然包括docker,访问X11 的显示接口

    2)在启动docker容器时,添加选项如下:

     -v /tmp/.X11-unix:/tmp/.X11-unix            #共享本地unix端口
    
     -e DISPLAY=unix$DISPLAY                     #修改环境变量DISPLAY
    
     -e GDK_SCALE                                #我觉得这两个是与显示效果相关的环境变量,没有细究
    
     -e GDK_DPI_SCALE 

    最终的启动命令就会长类似这样

    $ docker run -d 
    
      -v /etc/localtime:/etc/localtime:ro 
    
      -v /tmp/.X11-unix:/tmp/.X11-unix 
    
      -e DISPLAY=unix$DISPLAY 
    
      -e GDK_SCALE 
    
      -e GDK_DPI_SCALE 
    
      --name libreoffice 
    
      jess/libreoffice

    这样启动后的容器,运行有图形界面的程序就可以自由显示,和在本地显示一样了。

    这样操作已经十分方便了。需要注意的是,每次重新开机,需要在本机操作一次

    xhost +

    打开权限。应该有永久更改这个的办法,不过我觉得不算麻烦。 
    原文中还有在远程显示的配置方法,我没有试,就不多说了。

    3.解决方案2—已经启动的容器修改系统参数

    参考文章 
    有的时候,我们在已经启动的容器里做了一些事情,有了显示图像的需要,但从头新启动一个容器有点麻烦。 
    这时候可以用上面博客里讲的方法实现图形界面显示,也还算方便。 
    思路上也是把主机和docker看做服务器和客户端的关系,通过IP地址来映射显示。

    3.1 具体操作

    1)使用 ifconfig 查看主机和docker的IP地址 
    例如:主机的IP为 xxx 
    docker 的IP为YYY 
    2)docker 中

    export DISPLAY= XXX       #把环境变量映射到主机IP

    3.)主机中

    sudo gedit /etc/lightdm/lightdm.conf      #增加一行    xserver-allow-tcp=true
    
    sudo systemctl restart lightdm               
    
    xhost  +                #注意加号前应有空格

    这样配置就完成了,这是第一次配置的操作. 
    以后每次重新开机时,还是要在主机里运行一下 xhost +,在docker里运行一下export DISPLAY= XXX 。 
    其实还是挺麻烦的。 
    最关键的是,这种方式用的是IP地址,在系统没联网时,网卡就没有分配的IP地址了,这种方法就行不通了。

    4.怎样测试能否显示图像界面

    第二篇参考文章中用了一个显示时钟的小程序xclock 
    不过我在Ubuntu16.04的环境里搜不到这个了,能安装的叫xarclock,功能一样 
    在docker中运行

    sudo apt-get install xarclock       #安装这个小程序
    xarclock                            #运行,如果配置成功,会显示出一个小钟表动画
  • 相关阅读:
    168. Excel Sheet Column Title
    171. Excel Sheet Column Number
    264. Ugly Number II java solutions
    152. Maximum Product Subarray java solutions
    309. Best Time to Buy and Sell Stock with Cooldown java solutions
    120. Triangle java solutions
    300. Longest Increasing Subsequence java solutions
    63. Unique Paths II java solutions
    221. Maximal Square java solutions
    279. Perfect Squares java solutions
  • 原文地址:https://www.cnblogs.com/lijinze-tsinghua/p/8686264.html
Copyright © 2020-2023  润新知