Docker目前大多應用在服務器領域,那麼在Docker中能夠運行GUI程序嗎?懷着好奇心google了一番,還真有人寫了一篇文章 running-gui-applications-inside-docker-containers,文章從原理剖析到實際操做內容很是詳盡。linux
從上圖中咱們能夠清楚的瞭解到,要在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
上述參數的含義就是將Linux宿主機的X Server
共享給Docker容器,還有一種方式就是映射宿主機X Server
的.sock
文件到容器中去。ubuntu
那麼問題來了,在Windows或Mac這些沒有X11的Host機器上怎麼辦呢?因爲本人一直使用的Docker for Windows(沒錢:)),因此Mac環境暫不關心。windows
照例google到了一篇文章Run GUI app in linux docker container on windows host,內容一樣很是詳盡,本文大致也是按照這篇文章的指引。服務器
VcXsrv Windows X Server是Windows上的X11程序,另外還可選擇Xming,但Xming最後一次更新是在2016年,代碼相對較老,因此仍是選擇VcXsrv吧。app
VcXsrv程序下載安裝步驟能夠參考Run GUI app in linux docker container on windows host。ssh
和Run GUI app in linux docker container on windows host同樣也是選擇啓動一個firefox來作實驗,不一樣的是我對Dockerfile和docker run命令作了一些變動。
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 -t firefox .
和原文一致,構建容器。
$ 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
而不是宿主機的具體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效果以下:
注意:必須安裝中文字體,僅僅設置語言環境仍是會致使亂碼的。
網上還有幾種方式,我只看了文章的理論,感受可行,你們有空能夠去親自嘗試一番:
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