zoukankan      html  css  js  c++  java
  • Docker运行GUI程序

    Docker一般用于后端程序使用,默认是不需要GUI的。但是有时候我们希望,前端程序也能用上Docker这种简单的打包方式,方便管理。这里记录下Docker运行GUI程序的方法:

    首先,我们Docker镜像需要本身提供GUI,比如默认的centOS和Ubuntu都是不带GUI的,需要手动安装X11。
    X11协议是C/S架构,显示过程是这样的:

    [应用程序]->[X11客户端]->[X11服务端]->[显示屏幕]
    

    然后,我们需要打开X11的访问限制,默认只允许本地用户程序显示。这里我们可以运行本地docker显示:

    $ sudo apt-get install x11-xserver-utils
    $ xhost +local:docker
    non-network local connections being added to access control list
    

    或者允许所有显示选项(不建议):

    $ sudo apt-get install x11-xserver-utils
    $ xhost +
    access control disabled, clients can connect from any host
    

    最后,我们通过Docker的文件映射共享套接字,就可以转发X11协议了,参数如下:

    $ docker run -it --rm 
        -v /tmp/.X11-unix:/tmp/.X11-unix 
        -e DISPLAY=unix$DISPLAY 
        ...
    

    文件存储

    我们使用GUI程序的时候往往避免不了对文件进行操作,这里我们可以使用文件夹映射的方式,讲主机文件夹挂载到容器中。需要解决的问题是,docker本身以root登录时,创建的文件也是root属性,不是主机上当前用户所有。
    我们通过创建在容器中创建一个普通用户,并将主机用户的uid和gid传入,从而使得容器创建的文件保持和主机用户相同的所有者。
    Dockerfile编写如下:

    RUN useradd user 
    	&& mkdir /home/user 
    	&& chown user:user /home/user 
    	&& addgroup user staff
    
    WORKDIR /home/user
    

    容器启动命令如下:

    $ docker run -it --rm 
        -v /tmp/.X11-unix:/tmp/.X11-unix 
        -e DISPLAY=unix$DISPLAY 
        -e uid=$(id -u) 
        -e gid=$(id -g) 
        -v $HOME:/home/user 
        ...
    

    这里我们直接把容器和主机的HOME目录映射了起来。

    GUI程序涉及到的 网络、音视频 等其他方面,请参考 这篇博客

  • 相关阅读:
    获取和设置iframe中的元素
    css隔行换色样式修改
    在本地打开网页
    HTML-embed标签详解
    GlusterFS缺点分析[转]
    设计新Xlator扩展GlusterFS[转]
    C语言:全局变量在多个c文件中公用的方法 [转]
    const char*, char const*, char*const的区别
    C 语言字符数组的定义与初始化
    滑动窗口机制[转]
  • 原文地址:https://www.cnblogs.com/zhcpku/p/14219879.html
Copyright © 2011-2022 走看看