在Docker for Windows中运行GUI程序
2021-06-12 03:03
标签:EDA contain 网上 关心 dock 文章 isp smi back Docker目前大多应用在服务器领域,那么在Docker中可以运行GUI程序吗?怀着好奇心google了一番,还真有人写了一篇文章 running-gui-applications-inside-docker-containers,文章从原理剖析到实际操作内容非常详尽。 引用自running-gui-applications-inside-docker-containers 从上图中我们可以清楚的了解到,要在docker中运行GUI程序,关键是让Docker知道 引用自running-gui-applications-inside-docker-containers 上述参数的含义就是将Linux宿主机的 那么问题来了,在Windows或Mac这些没有X11的Host机器上怎么办呢?由于本人一直使用的Docker for Windows(没钱:)),所以Mac环境暂不关心。 照例google到了一篇文章Run GUI app in linux docker container on windows host,内容同样非常详尽,本文大体也是按照这篇文章的指引。 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命令做了一些变更。 相较原文有如下变动: 和原文一致,构建容器。 相较原文有如下变动: 原文的 再来看 winpty 是因为我用的Git for Windows Bash 访问下百度: 重新run效果如下: 注意:必须安装中文字体,仅仅设置语言环境还是会导致乱码的。 网上还有几种方式,我只看了文章的理论,感觉可行,大家有空可以去亲自尝试一番: 在Docker for Windows中运行GUI程序 标签:EDA contain 网上 关心 dock 文章 isp smi back 原文地址:https://www.cnblogs.com/larva-zhh/p/10531824.htmlDocker运行GUI原理
X Server
(大多数Linux桌面环境的基础)。文章的核心就在以下参数:
--env="DISPLAY"
--net=host
$ docker run --net=host --env="DISPLAY"
X Server
共享给Docker容器,还有一种方式就是映射宿主机X Server
的.sock
文件到容器中去。Docker for Windows运行GUI程序
安装VcXsrv
构建测试容器
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
Docker build
$ docker build -t firefox .
Docker run
$ docker run -ti --rm -e DISPLAY=host.docker.internal:0.0 firefox
set-variable -name DISPLAY -value YOUR-IP:0.0
命令DISPLAY
参数为host.docker.internal
而不是宿主机的具体ipset-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。测试效果验证
怎么有乱码,别急,这个是因为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
其他方式
Xvfb + VNC
- https://medium.com/dot-debug/running-chrome-in-a-docker-container-a55e7f4da4a8Xming
- https://blogs.msdn.microsoft.com/jamiedalton/2018/05/17/windows-10-docker-gui/SSH with X11 forwarding
- https://blog.docker.com/2013/07/docker-desktop-your-desktop-over-ssh-running-inside-of-a-docker-container/X11docker
- 一个专门为Docker增加X11图形渲染支持的项目 https://github.com/mviereck/x11docker
下一篇:windows系统快捷键
文章标题:在Docker for Windows中运行GUI程序
文章链接:http://soscw.com/index.php/essay/93791.html