在Docker for Windows中运行GUI程序

Docker运行GUI原理

Docker目前大多应用在服务器领域,那么在Docker中可以运行GUI程序吗?怀着好奇心google了一番,还真有人写了一篇文章 running-gui-applications-inside-docker-containers,文章从原理剖析到实际操作内容非常详尽。

引用自running-gui-applications-inside-docker-containers

从上图中我们可以清楚的了解到,要在docker中运行GUI程序,关键是让Docker知道X Server(大多数Linux桌面环境的基础)。文章的核心就在以下参数:

  • share the Host’s DISPLAY environment variable to the Container
  • --env="DISPLAY"
  • run container with host network driver with
  • --net=host

$ docker run --net=host --env="DISPLAY"

引用自running-gui-applications-inside-docker-containers

上述参数的含义就是将Linux宿主机的X Server共享给Docker容器,还有一种方式就是映射宿主机X Server.sock文件到容器中去。

那么问题来了,在Windows或Mac这些没有X11的Host机器上怎么办呢?由于本人一直使用的Docker for Windows(没钱:)),所以Mac环境暂不关心。

Docker for Windows运行GUI程序

照例google到了一篇文章Run GUI app in linux docker container on windows host,内容同样非常详尽,本文大体也是按照这篇文章的指引。

安装VcXsrv

VcXsrv Windows X Server是Windows上的X11程序,另外还可选择Xming,但Xming最后一次更新是在2016年,代码相对较老,所以还是选择VcXsrv吧。

VcXsrv程序下载安装步骤可以参考Run GUI app in linux docker container on windows host

构建测试容器

Run GUI app in linux docker container on windows host一样也是选择启动一个firefox来做实验,不同的是我对Dockerfile和docker run命令做了一些变更。

Create Dockerfile

FROM ubuntu:18.04
# 修改源地址
RUN mv /etc/apt/sources.list /etc/apt/sources_backup.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security multiverse " >> /etc/apt/sources.list && echo "deb http://archive.canonical.com/ubuntu bionic partner " >> /etc/apt/sources.list && # 安装firefox
apt-get update && apt-get install -y firefox
CMD /usr/bin/firefox

相较原文有如下变动:

  1. ubuntu的版本也升级到了18.04
  2. apt源替换成了中科大的镜像地址方便快速构建

Docker build

$ docker build -t firefox .

和原文一致,构建容器。

Docker run

$ docker run -ti --rm -e DISPLAY=host.docker.internal:0.0 firefox

相较原文有如下变动:

  1. 删除了set-variable -name DISPLAY -value YOUR-IP:0.0命令
  2. 设置容器的DISPLAY参数为host.docker.internal而不是宿主机的具体ip

原文的set-variable作用是将宿主机的ip作为临时环境变量,在docker run的时候直接引用该环境变量赋值给容器的DISPLAY,可有可无,并且set-variable只能在PowerShell环境生效,因此直接删除。

再来看-e DISPLAY=host.docker.internal:0.0,从18.03版本开始,Docker推荐容器使用host.docker.internal来访问宿主机上的服务,容器的DNS会自动解析到宿主机的内部IP上,参考Docker for Windows的官方文档:I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST

测试效果验证

winpty 是因为我用的Git for Windows Bash

访问下百度:

怎么有乱码,别急,这个是因为Docker build时未指定ubuntu的locales,ubuntu的镜像默认不支持中文导致的,参考官方文档:ubuntu locales 修改我们的Dockerfile:

FROM ubuntu:18.04
# 修改源地址
RUN mv /etc/apt/sources.list /etc/apt/sources_backup.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security universe " >> /etc/apt/sources.list && echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security multiverse " >> /etc/apt/sources.list && echo "deb http://archive.canonical.com/ubuntu bionic partner " >> /etc/apt/sources.list && # 更新并安装国际化语言包以及中文字体
apt-get update && apt-get install -y locales && locale-gen zh_CN && locale-gen zh_CN.utf8 && apt-get install -y ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
# 设置系统语言环境为中文UTF-8
ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
# 安装firefox
RUN apt-get install -y firefox
CMD /usr/bin/firefox

重新run效果如下:

注意:必须安装中文字体,仅仅设置语言环境还是会导致乱码的。

其他方式

网上还有几种方式,我只看了文章的理论,感觉可行,大家有空可以去亲自尝试一番:

原文地址:https://www.cnblogs.com/larva-zhh/p/10531824.html

时间: 2024-12-17 22:52:41

在Docker for Windows中运行GUI程序的相关文章

在Windows版本Docker上运行GUI程序

看到很多人在Docker问题区讨论:如何在OS X和Windows的Docker上运行GUI程序, 随手记录几个参考资料: https://github.com/docker/docker/issues/8710 http://sourceforge.net/projects/xming/ https://www.gitbook.com/book/yeasy/docker_practice/details

在 Docker 容器中运行应用程序

案例说明 运行 3 个容器,实现对网站的监控. 三个容器的说明: 容器 web: 创建自 nginx 映像,使用 80 端口,运行于后台,实现 web 服务. 容器 mailer: 该容器中运行一个 mailer 程序,运行于后台,当接收到事件后会向管理员发送邮件. 容器 agent: 该容器运行一个 watcher 程序,以交互模式运行,用于不断地监测 web 服务的运行情况,一旦出现故障会立即向 mailer 容器发送消息. 创建容器 创建并运行 web 容器 $ docker run --

轻易解决VMware 虚拟机中被提示“请不要在虚拟机中运行此程序“

决 VMware 虚拟机 中被提示 "请不要在虚拟机中运行此程序"或者"Themida Sorry, this application cannot run under a Virtual Machine"方法 自己发现问题,解决问题后,觉得应该分享给大家.用记事本打开 VMX 文件 类似 Windows XP Professional.vmx ,在文本末尾加入一行 monitor_control.restrict_backdoor = TRUE 保存文件 现在启动

如何实现在Windows上运行Linux程序,附示例代码

如何实现在Windows上运行Linux程序,附示例代码 微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理,而今天的这篇文章将会讲解如何自己实现一个简单的原生Linux程序运行器, 这个运行器在用户层实现, 原理和Bash On Windows不完全一样,比较接近Linux上的Wine. 示例程序完整的代码在github上, 地址是 https://github.com/30324

【爬坑】在 IDEA 中运行 Hadoop 程序 报 winutils.exe 不存在错误解决方案

0. 问题说明 环境为 Windows 10 在 IDEA 中运行 Hadoop 程序报   winutils.exe 不存在  错误 1. 解决方案 [1.1 解压] 解压 hadoop-2.7.3.zip 文件到自定义目录 [1.2 配置 Hadoop 环境变量] 新建HADOOP_HOME,变量值为D:\program\hadoop-2.7.3 添加PATH,添加%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin [1.3 重启 IDEA] [ 1.4 测试配置 ]

解决由于一个软件限制策略的阻止,windows无法运行此程序cmd.reg

解决由于一个软件限制策略的阻止,windows无法运行此程序cmd.reg Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\0\Paths\{28932aa4-77d2-452f-9436-d8c62a84208e}][-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\

C编译器MinGW安装、下载及在notepad++中运行C程序

一.C编译器MinGW的下载及安装步骤 打开MinGW官网:http://www.mingw.org/ 图一 图二 图三 图四 图五 图六 系统中配置环境变量: 图七 验证是否安装成功: CMD中运行C程序 二.notepad++中运行C程序 打开notepad++,点击运行,输入: cmd /k cd /d "$(CURRENT_DIRECTORY)" & g++ "$(FILE_NAME)" -o "$(NAME_PART)" &am

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

0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的"可视化" Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多. 但有时候我们会有在docker容器里运行一些图形界面的软件,或者要调用摄像头,输出图像等等一些需求,这个时候需要解决这个Docker "可视化"的问题. (这里的"可视化"不是很容易搜到的可视化管理的方法) 2.解决方案1-启动容器时添加配置选项 林帆:Docker

Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用

本篇文章操作系统信息 Windows:Window 10 Visual Studio:2017 15.8.0 创建项目并添加Dockerfile 在VS2017及以上版本上创建一个控制台项目,这里的名称叫[ConsoleAppDockerWindows2]. 创建DockerFile文件 1)右键项目 --> 选中[添加] --> 选中[容器业务流程协调程序支持] 2)选择[Docker Compose] 3)目标OS:选择[Windows] 创建后的解析 创建完成后,可以看到项目中多了Doc