2013年07月18日 | 標籤: cloud, container, docker, lxc | 做者:vpsee linux
Docker 是 dotCloud 最近幾個月剛宣佈的開源引擎,旨在提供一種應用程序的自動化部署解決方案,簡單的說就是,在 Linux 系統上迅速建立一個容器(相似虛擬機)並在容器上部署和運行應用程序,並經過配置文件能夠輕鬆實現應用程序的自動化安裝、部署和升級,很是方便。由於使用 了容器,因此能夠很方便的把生產環境和開發環境分開,互不影響,這是 docker 最廣泛的一個玩法。更多的玩法還有大規模 web 應用、數據庫部署、持續部署、集羣、測試環境、面向服務的雲計算、虛擬桌面 VDI 等等。git
Docker 使用 Go 語言編寫,用 cgroup 實現資源隔離,容器技術採用 LXC. LXC 已經足夠成熟,被多個主流 PaaS 服務商採用(好比 dotCloud),國內的一些互聯網公司也在用(好比騰訊)。雖然都是企圖解決自動化部署方面的問題,Docker 的解決方式有別於咱們常提到的 Puppet/Chef,他們雖然走的是不一樣的路,但也能夠拿來一塊兒用。github
上面說了 Docker 有不少玩法,下面介紹的玩法是:在服務器上用 docker 建立桌面系統,而後在客戶端上經過 ssh 遠程鏈接桌面,能夠看做是平民化的 VDI 解決方案。web
若是 Linux kernel 是 3.8 之前的內核,或者內核缺乏 aufs 模塊須要安裝額外的擴展模塊:spring
$ sudo apt-get install linux-image-extra-`uname -r`
安裝 lxc-docker: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: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
啓動一個 ubuntu 系統而後打印 hello world,囧,一個 ubuntu 系統的存在就是爲了打印一個 hello world,世界變了,反了,操做系統和應用程序的地位顛倒了~ubuntu
$ docker run -i -t ubuntu echo hello world hello world
來看看如何啓動一個 「桌面」 系統,按照 docker-desktop 項目給的方法和這裏的 Dockerfile開始 build 一個簡單的 「桌面系統」:centos
$ 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 上能夠直接訪問。登錄後界面以下: