Docker是 dotCloud 的一个开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法。更多的玩法还有大规模 web 应用、数据库部署、持续部署、集群、测试环境、面向服务的云计算、虚拟桌面 VDI 等等。
Docker 使用 Go 语言编写,用 cgroup 实现资源隔离,容器技术采用 LXC. LXC 已经足够成熟,被多个主流 PaaS 服务商采用(比如 dotCloud),国内的一些互联网公司也在用(比如腾讯)。虽然都是企图解决自动化部署方面的问题,Docker 的解决方式有别于我们常提到的 Puppet/Chef,他们虽然走的是不同的路,但也可以拿来一起用。
上面说了 Docker 有很多玩法,下面介绍的玩法是:在服务器上用 docker 创建桌面系统,然后在客户端上通过 ssh 远程连接桌面,可以看作是平民化的 VDI 解决方案。
如果 Linux kernel 是 3.8 以前的内核,或者内核缺少 aufs 模块需要安装额外的扩展模块:
1
|
$
sudo
apt
-
get
install
linux
-
image
-
extra
-
`
uname
-
r
`
|
安装 lxc-docker:
1
2
3
4
|
$
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:
1
|
$
docker
run
-
i
-
t
ubuntu
/
bin
/
bash
|
在 host 上 ps 一下发现 docker 使用 lxc-start 工具和 /var/lib/docker/containers/…/config.lxc 里的参数启动1个 lxc 容器并运行 /bin/bash 程序:
1
2
|
$
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,世界变了,反了,操作系统和应用程序的地位颠倒了~
1
2
|
$
docker
run
-
i
-
t
ubuntu
echo
hello
world
hello
world
|
来看看如何启动一个 “桌面” 系统,按照 docker-desktop 项目给的方法和这里的 Dockerfile开始 build 一个简单的 “桌面系统”:
1
2
3
4
5
|
$
docker
build
-
t
vpsee
/
docker
-
desktop
git
:
//github.com/rogaha/docker-desktop.git
Step
1
:
FROM
ubuntu
:
12.10
--
-
&
gt
;
b750fe79269d
.
.
.
Successfully
built
7774f89504e5
|
build 完后就可以用 docker images 命令看到:
1
2
3
4
5
6
7
8
9
10
11
12
|
$
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:
1
2
|
$
docker
run
-
d
vpsee
/
docker
-
desktop
a581df505cb9
|
这个系统有自己的内部 IP 地址,外界不能直接访问,所以要想从外界 ssh 登陆的话,需要把它的 ssh 服务端口(22)和 host 上某个端口通过 docker port 命令做个映射,这样访问 host 上的 49153 端口就是访问某个 container 里面的 22 端口了:
1
2
|
$
docker
port
a581df505cb9
22
49153
|
查看一下当前运行的容器:
1
2
3
|
$
docker
ps
ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
a581df505cb9
vpsee
/
docker
-
desktop
:
latest
/
bin
/
bash
/
src
/
start
24
minutes
ago
Up
24
minutes
49153
-
&
gt
;
22
|
然后我们可以在 Mac/Linux 客户端上通过 ssh 访问这个 “桌面” 了:
1
2
|
$
ssh
-
YC
-
c
blowfish
docker
@
192.168.2.45
-
p
49153
.
/
docker
-
desktop
docker
@
192.168.2.45'
s
password
:
|
注意上面的 password 是随机生成的(每次创建新系统密码都会变),那密码是什么呢?通过 docker logs 可以找到:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$
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 上可以直接访问。登陆后界面如下: