使用 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 docker@192.168.2.45 -p 49153 ./docker-desktop
docker@192.168.2.45'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 上可以直接访问。登陆后界面如下:

使用 Docker/LXC 迅速启动一个桌面系统的更多相关文章
- Ubuntu与ROS的Docker桌面系统与ROS在线练习课程(在线Linux虚拟机)
ROS在线练习课程正在逐步完善中,目前以ROS官网中文资料制作,可参考: https://www.shiyanlou.com/courses/854 邀请码 U23ERF8H 安装Ubuntu+RO ...
- Docker启动一个Centos镜像
docker镜像的获取与使用 docker中使用centos7镜像 接着上文,我们下载完成一个Centos镜像之后,开始启动 #运行命令 docker run -d -i -t <imageID ...
- Docker启动一个Centos镜像,在docker中安装ifconfig和ssh
执行docker search centos 现在最流行的Linux嘛.查了下,排名第一的(STARS最多1882)官方版,就是你了 果断拿下, docker pull centos,看网速了静等拿下 ...
- 控制Docker Compose的启动顺序的一个思路
起源 守护进程daemon 从守护进程的角度看Docker Compose Docker的解决方案 思路 代码 结果 起源 Docker Compose提供了一个depends_on参数. https ...
- Windows2003系统如何设置能让两个人共用一个桌面同时远程控制?
在windows 2003上,可以两人同时同一桌面控制一台服务器,交流非常方便. 解决方案: 两人都用终端远程登陆到服务器上,其中一人在“开始”--“管理工具”--“终端服务管理器”,选中对方的用户名 ...
- 在服务器中无法自宿主启动一个webapi项目,引出查看系统端口是否被占用
在windows server下启动一个webapi的.net core项目报错 如下图: 让我以为服务器还需要别的配置.后来发现原来是线程被占用了. 在windows下查看某线程是否被占用的命令如下 ...
- Linux 64位 CentOS下安装 Docker 容器,启动、停止
一.Docker简介 Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器,是轻量级的“容器引擎+映像仓库”,在LXC(linux轻量级容器)的基础上构建,可以运行任何应 ...
- docker安装与启动
安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc/sysconf ...
- 感悟:搞了整整一天,拯救一个Ubuntu系统
最开始,我在windows平台上,准备打开计算机组成原理的实验工程,突然来了一个想法:每次要用windows的时候,都要切换系统(win8以上的系统必须在关闭快速开机的状态下才能正常在Linux平台下 ...
随机推荐
- sshd配置文件详解
[root@test ~]# cat /etc/ssh/sshd_config # $OpenBSD: sshd_config,v // :: reyk Exp $ # This is the ssh ...
- js 设置缓存
长期存储 localStorage.getItem("key"); //获取键的值 localStorage.setItem("key" ...
- hibernate 多表关联外键问题无法截断表的解决办法
目前只有一个办法 就是手动清除其他表的外键关联,然后在做一个小swing单独去操作这个表,而不运行主控方相关的代码 当web运行后,外键会再次设置好
- 如何使用JMeter 进行压力测试
文件转载至:https://jingyan.baidu.com/album/a681b0de5b85db3b184346b9.html?picindex=2 1.打开JMeter, 更改语言为中文,官 ...
- String和StringBuffer的区别;字符串的一些基本方法
String 和 StringBuffer区别 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 需要注意的是,String的 ...
- Eureka Instance实例信息配置
Eureka包含四个部分的配置 instance:当前Eureka Instance实例信息配置 client:Eureka Client客户端特性配置 server:Eureka Server注册中 ...
- C# 无边框窗体移动和改变大小的实现
自己给软件做的皮肤,将窗体设为无边框后,想要其具有正常窗体的移动和改变大小功能,以下代 码可以实现.... //需添加using System.Runtime.InteropServices; [Dl ...
- 利用Python覆盖图像的某一部分,即改变图形一块区域(Region)的RGBA值
原图如下: 改变过后的图如下: 查阅API写法如下: from PIL import Image from PIL import ImageDraw pilim = Image.open('1.jpg ...
- tensorflow 利用python generate_cifar10_tfrecords.py --data-dir=${PWD}/cifar-10-data报错
报的错误如下:UnicodeDecodeError: 'ascii' codec can't decode byte 0x9e in position 0: ordinal not in range( ...
- Leetcode429.N-ary Tree Level Order TraversalN叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...