分享

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

xioaxu790 发表于 2014-10-15 14:18:06 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 12110
问题导读
1、 Docker 可以有哪些用途?
2、如何运行一个简单系统?
3、如何从主机上访问远端桌面?







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 模块需要安装额外的扩展模块:
  1. $ sudo apt-get install linux-image-extra-`uname -r`
复制代码


安装 lxc-docker:
  1. $ sudo apt-get install software-properties-common
  2. $ sudo add-apt-repository ppa:dotcloud/lxc-docker
  3. $ sudo apt-get update
  4. $ sudo apt-get install lxc-docker
复制代码



运行一个简单系统
运行 docker 就会自动下载一个 ubuntu 镜像(第一次运行才需要下载),并在一个 container(容器)里运行一个 ubuntu 系统(类似虚拟机)和 shell:
  1. $ docker run -i -t ubuntu /bin/bash
复制代码



在 host 上 ps 一下发现 docker 使用 lxc-start 工具和 /var/lib/docker/containers/…/config.lxc 里的参数启动1个 lxc 容器并运行 /bin/bash 程序:
  1. $ ps aux | grep docker
  2. 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,世界变了,反了,操作系统和应用程序的地位颠倒了~
  1. $ docker run -i -t ubuntu echo hello world
  2. hello world
复制代码



运行一个 “桌面” 系统
来看看如何启动一个 “桌面” 系统,按照docker-desktop 项目给的方法这里的 Dockerfile开始 build 一个简单的 “桌面系统”:
  1. $ docker build -t vpsee/docker-desktop git://github.com/rogaha/docker-desktop.git
  2. Step 1 : FROM ubuntu:12.10
  3. ---> b750fe79269d
  4. ...
  5. Successfully built 7774f89504e5
复制代码



build 完后就可以用 docker images 命令看到:
  1. $ docker images
  2. REPOSITORY             TAG                 ID                  CREATED             SIZE
  3. ubuntu                 12.04               8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
  4. ubuntu                 12.10               b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  5. ubuntu                 latest              8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
  6. ubuntu                 precise             8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
  7. ubuntu                 quantal             b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  8. base                   latest              b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  9. base                   ubuntu-12.10        b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  10. base                   ubuntu-quantal      b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  11. base                   ubuntu-quantl       b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
  12. vpsee/docker-desktop   latest              7774f89504e5        18 minutes ago      12.29 kB (virtual 1.576 GB)
复制代码



启动这个刚 build 好的 “桌面系统” 吧,注意 a581df505cb9 是这个容器的 ID:
  1. $ docker run -d vpsee/docker-desktop
  2. a581df505cb9
复制代码



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



查看一下当前运行的容器:
  1. $ docker ps
  2. ID                  IMAGE                         COMMAND                CREATED             STATUS              PORTS
  3. a581df505cb9        vpsee/docker-desktop:latest   /bin/bash /src/start   24 minutes ago      Up 24 minutes       49153->22
复制代码


然后我们可以在 Mac/Linux 客户端上通过 ssh 访问这个 “桌面” 了:
  1. $ ssh -YC -c blowfish docker@192.168.2.45 -p 49153 ./docker-desktop
  2. docker@192.168.2.45's password:
复制代码



注意上面的 password 是随机生成的(每次创建新系统密码都会变),那密码是什么呢?通过 docker logs 可以找到:
  1. $ docker logs a581df505cb9
  2. User: docker Password: ieFi2iu1Phie
  3. Adding user `docker' to group `sudo' ...
  4. Adding user docker to group sudo
  5. Done.
  6. .bashrc
  7. .config/
  8. .config/rox.sourceforge.net/
  9. .config/rox.sourceforge.net/ROX-Filer/
  10. .config/rox.sourceforge.net/ROX-Filer/pb_Default
  11. .config/rox.sourceforge.net/ROX-Filer/globicons
  12. .config/rox.sourceforge.net/ROX-Filer/panels
  13. .config/rox.sourceforge.net/ROX-Filer/menus2
  14. .config/rox.sourceforge.net/ROX-Filer/Options
  15. spring-desktop-wallpaper-1920x1200-0911085.jpg
  16. docker-desktop
复制代码


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

1.png

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条