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程序涉及到的 网络、音视频 等其他方面,请参考 这篇博客

  • 相关阅读:
    (转)基于C#的socket编程的TCP异步实现
    socket
    (转)抽象类、抽象属性、抽象方法
    (转)c# 互斥锁
    (转)C#连接OleDBConnection数据库的操作
    c# DLL封装并调用
    网络cmd命令
    (转)UCOSII在任务切换与出入中断时堆栈指针的使用
    app和bootloader跳转 MSP与PSP
    (转)stm32启动文件详解
  • 原文地址:https://www.cnblogs.com/zhcpku/p/14219879.html
Copyright © 2011-2022 走看看