利用AUFS和Docker搭建多个私有开发环境

 

利用AUFS和Docker搭建多个私有开发环境

文章的开头先提个问题: 我们平常的工作中,一般都是怎样让每个人都拿到独立开发环境的呢?

八仙过海

比如最常见的做法:每人都有自己的电脑,爱怎么弄怎么弄,同步代码就用Git之类的。 但是这样初始化的过程很慢,要装各种软件各种配置。

于是也有的是建一个中心服务器,大家用Putty这类软件SSH上去,每个人都有自己的账号。 但是这样环境不独立,而且权限控制很麻烦(毕竟每个人都想sudo)

后来就直接分发虚拟机镜像了,每个人拿到一个10G的镜像文件, 直接Load一下,环境就起来了。 但是这样每次修改环境就要更新近10G…

反正就是八仙过海,各有神通了。 利用AUFSDocker也可以做到给每个人独立开发环境。

AUFS

根据Google:

AuFS stands for Another Union File System. AuFS started as an implementation of UnionFS Union File System. An union filesystem takes an existing filesystem and transparently overlays it on a newer filesystem. It allows files and directories of separate filesystem to co-exist under a single roof.May 8, 2013

假设我们有一个目录如下:

$ tree
.
└── public
    ├── database
    │   ├── dbfile1
    │   └── dbfile2
    └── src
        ├── helloworld.lisp
        └── sudoku.lisp

我们希望以public目录为基础,给每个人创建一个private环境 于是我们跑几条命令:

$ mkdir change private
$ mount -t aufs -o dirs=./change:./public none ./private
$ tree
.
├── change
├── private
│   ├── database
│   │   ├── dbfile1
│   │   └── dbfile2
│   └── src
│       ├── helloworld.lisp
│       └── sudoku.lisp
└── public
    ├── database
    │   ├── dbfile1
    │   └── dbfile2
    └── src
        ├── helloworld.lisp
        └── sudoku.lisp

mount命令中,-t指定了type是aufs,-o是option 把change命令以读写权限,public目录以只读权限mount到了private里面

假设我们在private命令中新增,修改了一个文件:

$ cd private/
$ touch newfile
$ echo "Changes" > src/sudoku.lisp
$ cd ..
$ tree
.
├── change
│   ├── newfile
│   └── src
│       └── sudoku.lisp
├── private
│   ├── database
│   │   ├── dbfile1
│   │   └── dbfile2
│   ├── newfile
│   └── src
│       ├── helloworld.lisp
│       └── sudoku.lisp
└── public
    ├── database
    │   ├── dbfile1
    │   └── dbfile2
    └── src
        ├── helloworld.lisp
        └── sudoku.lisp

可以看到我们在private环境中所做的所有改动都在change中发生了!

这就相当于图层(Layer)的叠加,我们往只读的public层上叠加了一层可写的change层。 不过对于删除文件的情况要进行额外的检测

与Docker的叠加

有了上例中的mount,那和Docker就很好叠加了 利用Docker的Volume

docker run -ti -v /tmp/docker/private:/work ubuntu /bin/bash

这样就可以把private目录作为volume映射到docker container里面的/work目录了。 剩下的就是Get good use of docker images了~