在Docker for Windows中运行GUI程序

Docker运行GUI原理

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

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

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

  • 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"chrome

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

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

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

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吧。app

VcXsrv程序下载安装步骤能够参考Run GUI app in linux docker container on windows hostssh

构建测试容器

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效果以下:

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

其余方式

网上还有几种方式,我只看了文章的理论,感受可行,你们有空能够去亲自尝试一番:

相关文章
相关标签/搜索