如何在Docker容器中运行GUI程序

如何在Docker容器中运行GUI程序

各位,今天我们将学习如何在Docker之中运行GUI程序。我们可以轻易地在Docker容器中运行大多数GUI程序且不出错。Docker是一个开源项目,提供了一个打包、分发和运行任意程序的轻量级容器的开放平台。它没有语言支持、框架或者打包系统的限制,并可以运行在任何地方、任何时候,从小型的家用电脑到高端的服务器都可以运行。这让人们可以打包不同的包用于部署和扩展网络应用,数据库和后端服务而不必依赖于特定的栈或者提供商。

下面是我们该如何在Docker容器中运行GUI程序的简单步骤。本教程中,我们会用Firefox作为例子。

1. 安装 Docker

在开始前,我们首先得确保在Linux主机中已经安装了Docker。这里,我运行的是CentOS 7 主机,我们将运行yum管理器和下面的命令来安装Docker。

 
  1. # yum install docker

 
  1. # systemctl restart docker.service

2. 创建 Dockerfile

现在,Docker守护进程已经在运行中了,我们现在准备创建自己的Firefox Docker容器。我们要创建一个Dockerfile,在其中我们要输入需要的配置来创建一个可以工作的Firefox容器。为了运行 Docker 镜像我们需要使用最新版本的CentOS。要创建 Docker 镜像,我们需要用文本编辑器创建一个名为Dockerfile的文件。

 
  1. # nano Dockerfile

接着,在Dockerfile中添加下面的行并保存。

 
  1. #!/bin/bash
  2. FROM centos:7
  3. RUN yum install -y firefox
  4. # 用你自己的 uid /gid 替换下面的0
  5. RUN export uid=0 gid=0
  6. RUN mkdir -p /home/developer
  7. RUN echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd
  8. RUN echo "developer:x:${uid}:" >> /etc/group
  9. RUN echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
  10. RUN chmod 0440 /etc/sudoers
  11. RUN chown ${uid}:${gid} -R /home/developer
  12. USER developer
  13. ENV HOME /home/developer
  14. CMD /usr/bin/firefox

注意:在第四行的配置中,用你自己的用户和组id来替换0。 我们可以用下面的命令在shell或者终端中得到uid和gid。

 
  1. # id $USER

3. 构造Docker容器

下面我们就要根据上面的Dockerfile构建一个容器。它会安装firefox浏览器和它需要的包。它接着会设置用户权限并让它可以工作。这里镜像名是firefox,你可以根据你的需要命名。

 
  1. # docker build --rm -t firefox .

4. 运行Docker容器

现在,如果一切顺利,我们现在可以在运行在CentOS 7镜像中的Docker容器里面运行我们的GUI程序也就是Firefox浏览器了。

 
  1. # docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix firefox

总结

在Docker容器中运行GUI程序是一次很棒的体验,它对你的主机文件系统没有任何的伤害。它完全依赖你的Docker容器。本教程中,我尝试了CentOS 7 Docker中的Firefox。我们可以用这个技术尝试更多的GUI程序。如果你有任何问题、建议、反馈请在下面的评论栏中写下来,这样我们可以提升或更新我们的内容。谢谢!

原文发布时间:2015-04-20

本文来自云栖合作伙伴“linux中国”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】Get与Post的区别?(面试官最想听到的答案)

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

大数据之Kafka集群安装及简单使用

目录1、Kafka集群部署2、Kafka常用操作命令 目录 1、Kafka集群部署 1.1、下载安装包 http://kafka.apache.org/downloads.html 在linux中使用wget命令下载安装包 wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz 1.2、解压安装包 tar -z…

Python爬虫入门之Urllib库的基本使用

那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧。 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的&#xf…

【python】hashlib.shasha256练习注册 --笔记

用户注册和登录import csv import hashlib#注册将用户信息填写到csv文件中 def register():username input(用户名:)password input(密码:)user []user.append(username)user.append(hashlib.sha256(password.encode(utf-8)).hexdigest())with open(t2/users.csv, a, newlin…

《3ds Max疯狂设计学院》——1.6节3ds Max 2016新增的主要功能

本节书摘来自异步社区《3ds Max疯狂设计学院》一书中的第1章,第1.6节3ds Max 2016新增的主要功能,作者 曹茂鹏,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 3ds Max 2016新增的主要功能1.Max Creation Graph3ds Max…

大数据之Kafka内部原理详细介绍

目录前言:1、Kafka整体结构2、Consumer与topic关系3、Kafka消息的分发4、Consumer的负载均衡5、kafka文件存储机制总结: 目录 前言: 本篇文章所介绍的内容还是以了解为主,主要目的还是为了对Kafka有一个更深入的理解。主要介绍…

【python】urllib和urllib3,requests 简要概括---笔记

urllib和urllib3,requestsurl:协议://存放资源的地址(域名)/具体的资源https://bj.lianjia.com/zufang/dghfjhsjdf648.htmlurllib.request 用来发出请求urllib.parseurllib.request.urlopen(str) --->response对象request urllib.reques…

JS与APP原生控件交互

“热更新”、“热部署”相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显得重要,不可能每次发布一个活动,都要发布一个现版本&a…

《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销

本节书摘来异步社区《脱颖而出——成功网店经营之道》一书中的第2章,第2.6节,作者: 何小健 责编: 赵轩, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 连横:返利模式的应用及分销 脱颖而出——成功网店…

【python】os模块 递归删除文件夹所有文件 --笔记

os.environ 获取系统的环境变量 os.name nt -- windows \r\n | posix --- Linux \nos.path: import osprint(os.environ) print(os.environ[OS])print(os.path.abspath(t1/file01.py)) # 获取绝对路径 print(os.path.isabs(t1/file01.py)) # 判断所给的路径是否是一个绝对…

大数据之Spark集群安装及简单使用

目录1、Spark集群安装1.1. 安装 2、启动Spark Shell2.1、启动spark shell2.2、在spark shell中编写WordCount程序 目录 1、Spark集群安装 1.1. 安装 1.1.1. 机器部署 准备两台以上Linux服务器,安装好JDK1.7 1.1.2. 下载Spark安装包 下载地址:ht…

《C和C++代码精粹》——1.7 类型安全I/O

本节书摘来自异步社区出版社《C和C代码精粹》一书中的第1章第1.7节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 类型安全I/O C和C代码精粹当然每个C程序员都曾经使用过printf的错误格式描述符号。…

大数据之Spark简介及RDD说明

目录前言:1、Spark概述1.1、什么是Spark(官网:http://spark.apache.org)1.2、为什么要学Spark1.3、Spark特点 2、RDD概述2.1、什么是RDD2.2、RDD的属性2.3、创建RDD的两种方式2.4、RDD编程API2.5、RDD的依赖关系2.6、RDD的缓存2.7…

Python3中urlopen()详解

一. 简介 urllib.request.urlopen()函数用于实现对目标url的访问。 函数原型如下:urllib.request.urlopen(url, dataNone, [timeout, ]*, cafileNone, capathNone, cadefaultFalse, contextNone)  url: 需要打开的网址 data:Post提交的数据 timeo…

python面向对象实现简易银行管理员页面系统

银行管理员页面系统设计:card 类: cardId password moneyuser 类: username phone id cards[]银行的工作人员: 账号 密码 登录 展现管理系统所有功能Bank类:开户取钱存钱转账销户查账解锁... import pickle import random# 银行卡 import time#card 类…

单子模式

package test; class aceing { /** param args */ private static aceing ace; public aceing() { super(); System.out.println("aceing类中的无参构造器调用了"); } public static aceing getAceing() { if(ace null) { ace new aceing(); } return ace; }} pack…

《塑造互联网思维的企业》一一第4章 全球商务向社会化媒体的转变

第4章 全球商务向社会化媒体的转变 塑造互联网思维的企业社会化媒体在发达国家的广泛采用已是我们所熟知的,它在社会和全球文化产生的大范围变革中至关重要。为了完全了解其中的原因,有必要探究一下那些推动社会化商务的复杂且相互关联的因素的共同影响…

大数据之SparkSQL简介及DataFrame的使用

目录前言:1、Spark SQL1.1、Spark SQL概述1.2、DataFrames1.3、DataFrame常用操作 总结: 目录 前言: 本文主要介绍下SparkSQL以及SparkSQL的简单使用。这里只是做了一个非常简单的介绍,后续工作中如果有用到相关的知识&#xff…

python的各种推导式(列表推导式、字典推导式、集合推导式)

python的各种推导式(列表推导式、字典推导式、集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Pyt…

原生js实现jquery库中选择器的功能(jquery库封装一)

今天是2017.1.1,新的一天,新的一年,新的一年里继续夯实基础知识,在工作中多些项目,多思考,多总结,前端是不断更新,在更新的过程中也是发现乐趣和挑战自我的过程,希望年轻…