使用 Docker/LXC 迅速启动一个桌面系统

使用 Docker/LXC 迅速启动一个桌面系统

Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用 了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法。更多的玩法还有大规模 web 应用、数据库部署、持续部署、集群、测试环境、面向服务的云计算、虚拟桌面 VDI 等等。

Docker 使用 Go 语言编写,用 cgroup 实现资源隔离,容器技术采用 LXC. LXC 已经足够成熟,被多个主流 PaaS 服务商采用(比如 dotCloud),国内的一些互联网公司也在用(比如腾讯)。虽然都是企图解决自动化部署方面的问题,Docker 的解决方式有别于我们常提到的 Puppet/Chef,他们虽然走的是不同的路,但也可以拿来一起用。

上面说了 Docker 有很多玩法,下面介绍的玩法是:在服务器上用 docker 创建桌面系统,然后在客户端上通过 ssh 远程连接桌面,可以看作是平民化的 VDI 解决方案。

安装 Docker/LXC

如果 Linux kernel 是 3.8 以前的内核,或者内核缺少 aufs 模块需要安装额外的扩展模块:

$ sudo apt-get install linux-image-extra-`uname -r`

安装 lxc-docker:

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:dotcloud/lxc-docker
$ sudo apt-get update
$ sudo apt-get install lxc-docker

运行一个简单系统

运行 docker 就会自动下载一个 ubuntu 镜像(第一次运行才需要下载),并在一个 container(容器)里运行一个 ubuntu 系统(类似虚拟机)和 shell:

$ docker run -i -t ubuntu /bin/bash

在 host 上 ps 一下发现 docker 使用 lxc-start 工具和 /var/lib/docker/containers/…/config.lxc 里的参数启动1个 lxc 容器并运行 /bin/bash 程序:

$ ps aux | grep docker
root     28103  0.0  0.0  21164  1116 ?        S    10:52   0:00 lxc-start -n a581df505cb9ea07e93de28d76fc9b4e1ee48b981ce994740efdaa65d0d307a3 -f /var/lib/docker/containers/a581df505cb9ea07e93de28d76fc9b4e1ee48b981ce994740efdaa65d0d307a3/config.lxc -- /sbin/init -g 172.16.42.1 -e HOME=/ -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -e DEBIAN_FRONTEND=noninteractive -- /bin/bash /src/startup.sh

运行一个 Hello world

启动一个 ubuntu 系统然后打印 hello world,囧,一个 ubuntu 系统的存在就是为了打印一个 hello world,世界变了,反了,操作系统和应用程序的地位颠倒了~

$ docker run -i -t ubuntu echo hello world
hello world

运行一个 “桌面” 系统

来看看如何启动一个 “桌面” 系统,按照 docker-desktop 项目给的方法这里的 Dockerfile开始 build 一个简单的 “桌面系统”:

$ docker build -t vpsee/docker-desktop git://github.com/rogaha/docker-desktop.git
Step 1 : FROM ubuntu:12.10
 ---> b750fe79269d
...
Successfully built 7774f89504e5

build 完后就可以用 docker images 命令看到:

$ docker images
REPOSITORY             TAG                 ID                  CREATED             SIZE
ubuntu                 12.04               8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 12.10               b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
ubuntu                 latest              8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 precise             8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 quantal             b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   latest              b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-12.10        b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-quantal      b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-quantl       b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
vpsee/docker-desktop   latest              7774f89504e5        18 minutes ago      12.29 kB (virtual 1.576 GB)

启动这个刚 build 好的 “桌面系统” 吧,注意 a581df505cb9 是这个容器的 ID:

$ docker run -d vpsee/docker-desktop
a581df505cb9

这个系统有自己的内部 IP 地址,外界不能直接访问,所以要想从外界 ssh 登陆的话,需要把它的 ssh 服务端口(22)和 host 上某个端口通过 docker port 命令做个映射,这样访问 host 上的 49153 端口就是访问某个 container 里面的 22 端口了:

$ docker port a581df505cb9 22
49153

查看一下当前运行的容器:

$ docker ps
ID                  IMAGE                         COMMAND                CREATED             STATUS              PORTS
a581df505cb9        vpsee/docker-desktop:latest   /bin/bash /src/start   24 minutes ago      Up 24 minutes       49153->22

然后我们可以在 Mac/Linux 客户端上通过 ssh 访问这个 “桌面” 了:

$ ssh -YC -c blowfish [email protected] -p 49153 ./docker-desktop
[email protected]‘s password:

注意上面的 password 是随机生成的(每次创建新系统密码都会变),那密码是什么呢?通过 docker logs 可以找到:

$ docker logs a581df505cb9
User: docker Password: ieFi2iu1Phie
Adding user `docker‘ to group `sudo‘ ...
Adding user docker to group sudo
Done.
.bashrc
.config/
.config/rox.sourceforge.net/
.config/rox.sourceforge.net/ROX-Filer/
.config/rox.sourceforge.net/ROX-Filer/pb_Default
.config/rox.sourceforge.net/ROX-Filer/globicons
.config/rox.sourceforge.net/ROX-Filer/panels
.config/rox.sourceforge.net/ROX-Filer/menus2
.config/rox.sourceforge.net/ROX-Filer/Options
spring-desktop-wallpaper-1920x1200-0911085.jpg
docker-desktop

从 Mac 上访问远端桌面的话需要有 X 环境(下载 XQuartz 安装即可);从 Linux 上可以直接访问。登陆后界面如下:

时间: 2024-08-29 01:46:21

使用 Docker/LXC 迅速启动一个桌面系统的相关文章

Ubuntu中使用Docker/LXC迅速启动一个桌面系统

2013年07月18日 | 标签: cloud, container, docker, lxc | 作者:vpsee Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常方便.因为使用 了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法.更

一个桌面系统的微信公众号开发

原桌面系统: ui用python开发,并用python实现的rpc,服务端python调用了forthan编写的核心计算模块. 部署到微信公众账号之后: 在原有系统的基础上增加了一个web服务器.将原有python的ui部分修改为命令行脚本,并运行在web服务器上,实现原有程序对核心计算模块服务器的访问,原ui部分的实现用网页替代,再由微信公众平台呈现. 涉及的一些技术: java中调用python脚本: 为每个用户添加标识: 用javascript通过sohu接口获取用户ip<script s

第四篇:Docker安装并启动一个http容器

知识背景 官方文档:https://docs.docker.com/engine/installation/ docker分为社区版(CE)和企业版(EE),他们最大的区别就是:社区版是开源免费的,企业版是收费的.对于想要学习docker容器.或者小型开发团队来说,首选Docker社区版. 1.卸载掉老版本的Docker容器 yum remove docker docker-common docker-selinux docker-engine 2.有三种Docker CE安装方法 a.使用do

基于 ssh + Xpra 构建 Docker 桌面系统

by Falcon of TinyLab.org 2015/05/01 Docker 桌面系统 初识 Docker,发现大部分文章都只是介绍非 GUI 的应用.想到蛮多场景需要图形化界面,所以搜罗了一下 Docker 镜像: $ sudo docker search desktop NAME DESCRIPTION STARS OFFICIAL AUTOMATED dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVN

基于 VNCServer + noVNC 构建 Docker 桌面系统

by Falcon of TinyLab.org 2015/05/02 简介 基于 ssh + Xpra 构建 Docker 桌面系统 刚介绍了如何通过 Ssh + Xpra 构建 C/S 架构的 Docker 桌面系统. 本文介绍另外一种 B/S 架构的 Docker 桌面系统,即基于 VNCServer + noVNC 构建一个可以通过浏览器直接访问的 Docker 桌面系统. noVNC VNCServer 是一个为了满足分布式用户共享服务器资源,而在服务器开启的一项服务,对应的客户端软件

docker 启动一个centos镜像

转自http://blog.csdn.net/mexel310/article/details/51705777 #运行命令 [plain] view plain copy docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停留在后台运行的Centos了.如果少了/bin/bash的话,Docker会生成一个Container但是马上就停止了,不会一致运行即使有了-d参数. 然后我们可以进入我们这个Centos [plain] view pla

linux如何给应用程序创建一个桌面启动图标

本文主要讲述的是linux中如何给应用程序创建一个快速启动图标,话不多说,我们来看实际的操作步骤: 本文的实例是给celipse创建一个启动图标 1.我们需要通过下列命令,来创建一个启动的脚本: gedit     /usr/share/applications/eclipse.desktop 2.将下列内容复制到文件中 [Desktop Entry] Encoding=UTF-8 Name=Eclipse Comment=Eclipse IDE Exec=/usr/local/android/

CentOS 64(位)docker安装与启动

一.docker简介 Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器,是轻量级的"容器引擎+映像仓库",在LXC(linux轻量级容器)的基础上构建,可以运行任何应用程序. Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境.Docker 利用了 LXC, cgroups 和 Linux 自己的内核.和传统的虚拟机不同的是,一个 Docker 容器

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信