摘要:使用Docker容器,将带UI的程序,直接转换为Web应用。很方便,跟大家分享一下。

本文分享自华为云社区《使用Docker容器,将带UI的程序,直接转为Web应用》,作者:tsjsdbd。

我们可以通过Docker容器,将App的UI界面,投射到任意的网络目的端。

即:

其原理是利用X11协议,把界面投射转化为网络协议,到达目的端显示出来。

但是这种方案,有一个硬性要求:就是目的端必须要安装一个“投屏软件(X11 Server)”,比如:VcXsrv 或者 MobaXterm。

那么用户想要看到App的界面,他就得额外安装一个软件,用户体验并不是最佳的。

一、VNC方案

Windows的远程桌面,相信大家都用过吧。 VNC就是Linux版的远程桌面。它可以将屏幕,通过网络共享给客户端。

在服务端,安装vncserver。 在客户端,安装vncviewer。

不过,windows是自带了一个 远程桌面客户端。对VNC的话,用户就得安装一个 vnc-viewer客户端。和X11方案差不多,还是不够方便。

二、noVNC方案

好消息是,VNC-Viewer有一个WEB版的客户端,叫做 noVNC。它直接打开网页,就获得VNC-Viewer能力。详见:https://novnc.com/info.html

于是,我们可以将方案拓展为:

毕竟,浏览器基本上每个客户都会有。这就好比,微信大家都有,所以“单独安装一个App”vs“微信小程序” ,肯定是后者在使用更便捷一样的道理。

所以你可以看到各大云厂商,比如华为云的ECS虚机,也都自带了使用noVNC的方式来展示虚机的界面。可见noVNC的产品化可靠性还是OK的。

三、具体操作

这里我为了方便,准备将各种Server都安装到一个Docker容器里面,如下:

1. 使用 Ubuntu:20.04 的基础镜像

因为最终我们要通过HTML访问这个容器,所以启动的时候,我们得记得开放端口:

  1. docker run -it -p 80:8080 ubuntu:20.04 /bin/bash

在这个容器里面,启动上图中的各种Server。

2. Xvfb虚拟屏幕

首先,安装一个叫做 xvfb 的软件。这是一个“虚拟屏幕”,都在内存中模拟的屏幕。见:https://en.wikipedia.org/wiki/Xvfb

安装:

  1. apt-get install -y xvfb

然后启动“虚拟屏幕”:

  1. Xvfb :0 -screen 0 1920x1080x24 -listen tcp -ac +extension GLX +extension RENDER

其中,1920x1080x24 表示:屏幕大小(分辨率)。 24则是像素深度。

这个屏幕大小,到时候可以根据App的界面效果自己调整。

3. X11vnc服务器

然后,我们安装 x11服务器(因为安装这个有交互,所以之类设置了 无交互模式)

  1. export DEBIAN_FRONTEND=noninteractive
  2. apt-get install -y x11vnc

然后启动 x11服务器:

  1. x11vnc -forever -shared -noipv6 -passwd tsjsdbd

其中标红的password换成你自己喜欢的密码。

4. noVNC服务器

最后,我们通过noVNC服务器,将 VNC翻译为HTML服务,

安装:

  1. apt-get install -y novnc

然后启动:

  1. websockify --web /usr/share/novnc 8080 localhost:5900

5. 启动带UI的App

  1. apt-get install x11-apps
  2. DISPLAY=:0.0 xclock

这里的DISPLAY变量的作用,是表示把App的界面,投射到咱们的这个“虚拟屏幕”上。

详细请看我之前的那篇文章。

6. 从浏览器访问

从浏览器,访问我们的容器。地址(因为我们启动容器用来http默认端口80,所以这里URL不用设置端口了。):

http://容器ip/vnc.html

这里填,第3步咱设置的密码。然后可以看到App的界面啦:

四、Dockerfile

这里为了大家方便,直接提供一个Dockerfile

  1. FROM ubuntu:20.04
  2. ENV DEBIAN_FRONTEND=noninteractive
  3. RUN apt-get install -y novnc x11vnc xvfb
  4. EXPOSE 8080
  5. ENTRYPOINT ["/bin/bash"]

然后写个 start-novnc.sh 脚本:

  1. #!/bin/bash
  2. set -e
  3. #虚拟屏幕
  4. Xvfb :0 -screen 0 1920x1080x24 -listen tcp -ac +extension GLX +extension RENDER > /dev/null 2>&1 &
  5. #vnc服务器
  6. x11vnc -forever -shared -noipv6 -passwd tsjsdbd > /dev/null 2>&1 &
  7. #novnc
  8. websockify --web /usr/share/novnc 8080 localhost:5900 > /dev/null 2>&1 &

最后你启动app的时候,记得带上:

  1. DISPLAY==========================================BN
  2. =:0.0 your-ui-app

就可以了。

点击关注,第一时间了解华为云新鲜技术~

Docker容器:将带UI的程序直接转为Web应用,so easy的更多相关文章

  1. docker容器时间不对及java程序时间不对解决

    使用docker容器部署的应用,会出现时间与主机不一致的情况 1. 容器时间与主机差8个小时:主机的与容器的/etc/localtime不一致 解决方法:挂载主机的/etc/localtime,如果没 ...

  2. 在宿主机上执行docker容器内部的shell或程序

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...

  3. Docker容器中安装新的程序

    在容器里面安装一个简单的程序(ping). 之前下载的是ubuntu的镜像,则可以使用ubuntu的apt-get命令来安装ping程序:apt-get install -y ping. $docke ...

  4. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  5. 3、docker 容器管理

    Docker容器相对于OpenStack的云主机实例,虽然他们本质上不同.我们需要基于镜像来创建容器.容器是独立运行的一个或一组应用,以及它们的运行环境.对应的,虚拟机可以理解为模拟运行的一整套操作系 ...

  6. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  7. 5、Docker容器网络

    使用Linux进行IP层网络管理的指     http://linux-ip.net/html/ # yum install iproute http://linux-ip.net/html/tool ...

  8. 一个docker容器中运行多个服务还是弄一堆docker容器运行?

    不建议直接在单个 Docker 容器中运行多个程序. 以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经 ...

  9. 浅析Docker容器的应用场景

    本文来自网易云社区 作者:娄超 过去几年开源界以openstack为代表的云计算持续火了好久,这两年突然又冒出一个叫Docker的容器技术,其发展之迅猛远超预料.网上介绍Docker容器的文章已经很多 ...

随机推荐

  1. 【每日日报】第三十二天---DataOutputStream写文件

    1 今天继续看书 DataOutputStream写文件 1 package File; 2 import java.io.IOException; 3 import java.io.FileOutp ...

  2. 小程序checkbox调整大小(checkbox样式修改)

    .skyCheckbox{ transform: scale(0.7,0.7); -webkit-transform: scale(0.7,0.7); } <label class=" ...

  3. 将本地代码上传到gitLab

    1. 在远程gitLab仓库创建项目, 执行下列命令 git  init git  remote add origin git@10.10.xxx.git (gitLab刚刚创建的工程地址) git  ...

  4. Linux_连接工具_SecureCRT的使用教程

    什么是SecureCRT? SecureCRT是一款支持 SSH2.SSH1.Telnet.Telnet/SSH.Relogin.Serial.TAPI.RAW 等协议的终端仿真程序,最吸引我的是,S ...

  5. LeetCode刷题知识点总结——二叉树

    二叉树 一.二叉树理论基础 1.满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树.通俗话理解:从底层开始到顶部的所有节点都全部填满的二叉树.深 ...

  6. git设置忽略提交文件

    直接在idea进行操作 1.找到想要忽略提交的文件,点击右键,然后如下操作: 2.然后就会发现被忽略的文件名变成了灰色,在项目最下方会生成ignore文件夹 3.文件夹内可以看到我们忽略的文件 4.注 ...

  7. JavaWeb学习day3-Maven&安装

    1.官网下载:https://maven.apache.org/ 2.解压下载好的压缩包 3.配置环境变量 添加如下图变量 在path变量下添加下图 4.安装完成检测 cmd输入:mvn -versi ...

  8. HCIE笔记-第十节-静态路由

    协议 :标识 前方的目的网络 是通过什么协议形成的 优先级:代表形成路由的协议的优先级数值 [厂商规定] 开销值:代表该路由协议形成此路由时的开销 -- 不同的协议计算开销值的方式有区别(越小越优) ...

  9. MATLAB R2019b超详细安装教程(附完整安装文件)

    摘要:本文详细介绍Matlab的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用.本文目录如首页 ...

  10. Antd Modal 可拖拽移动

    一 目标: 实现antd Modal 弹窗或者其他弹窗的点击标题进行拖拽的效果 二 准备及思录: 1.使用antd  Modal 组件,要想改变位置需要改变Modal style 的left 和top ...