中国领先的IT技术网站
|
|

让 Docker 无处不在

作者:Timo Derstappen 译者:Mark Shao 我答应过会继续写一些关于 docker 的文章。作为 CØ 中唯一一枚有本地 Linux 内核的幸运儿,我当仁不让地写点东西来分享自己如何在本地台式机上管理所有项目。 为什么是 docker 而不是纯 LXC 几年前当我还在 Adcloud 的时候,开始使用 LXC 来建立所有的 微型服务 。鉴于我在台式机上使用 Archlinux,效果还不错。但是我们的生产环境是 Ubuntu 的操作系统,并且会用 chef 脚本来创建容器,而我仍然把这些容器当做机器来维护。

作者:Mark Shao 编译来源:dockboard.org|2014-04-23 13:08

开发者大赛路演 | 12月16日,技术创新,北京不见不散


我已许诺会持续的写些关于docker的文章。由于我是唯一一个在 CØ 中具有本地linux内核的幸运者, 因此我将写一些关于怎样在本地桌面上管理所有项目的文章。

为什么是docker,而不是纯LXC?

几年前,当我还在 Adcloud 时,就开始使用 LXC 来构建所有的微型服务。 鉴于我在台式机上使用 Archlinux系统并且效果还不错,但是我们的生产环境是 Ubuntu系统,并且可能会用 chef 脚本来创建容器,而我仍然把这些容器当做机器来维护。它们有自己的 DNS 域名、 IP 地址、 SSH 服务,和所有磁盘文件绑定。因此每当我开始一个新项目时,首先得通过 SSH 登录到容器然后再开始工作。事实上我一点也不喜欢 Chef ,所以在离开 Adcloud 后我就放弃了 Chef 并开始使用 Babushka 。虽然后者能让我以最简单的方式来部署一个单机环境,但是创建新容器十分缓慢,当所有容器启动之后占据了 SSD 上的大量磁盘空间,而且我还需要手动去配置多项服务。

所以当我第一次启动 Docker 容器的时候,它的速度之快真是让人惊讶,更棒的是分层的文件系统可以减少磁盘的使用。

容器不等于机器

自从有了 Docker 容器以后,你就不需要考虑机器的概念了。它们只是在不同的内核命名空间中的进程,你希望它们可以保持精简和干净。它们也需要能够运行在不同的环境中,所以我放弃了在容器中使用 SSH 。那我又是如何来创建我的项目呢?首先我创建了一系列容器,在上面安装了我项目中需要安装但不应该安装在本地的工具。
在盒子里使用Go

我们先来看一下 github 上的 Dockerfile。

使用下面的别名在容器中启动 go,随后把容器移除:

  1. alias go="docker run --rm -t -i teemow/go" 

你甚至可以使用不同的标签来运行不同版本的 go( go:1.1、go:1.2 等)。不过要让它它真正工作,还需要更多操作。你可以把你当前的目录绑定挂载到容器中,来做类似go get这样的事情。

  1. alias go="docker run --rm -t -i -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go" 

如果你有一个私有 git 库的话,你甚至可以把你当前的 ssh 代理挂载到容器中:

  1. alias go="AGENT=\$(ls -1 --sort t /tmp/ssh-*/agent.* | head -1) && docker run --rm -t -i -v \$AGENT:\$AGENT -e SSH_AUTH_SOCK=\$AGENT -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go" 

类似 GOPATH 这样的环境变量也可以传入到容器中。

你可以完全用你自己的工具来完成这些事情,这样你的主机会很干净。别忘了给你的不同版本的镜像打上标签,否则你很难跳回到之前的项目中。也许你可以给类似 rbenv ( dockerenv )的项目做记号。我已经创建了一系列包含工具的镜像 ,比如 npm 、 grunt 、 coffee-script 、 aws-cli 和 tugboat 等等。

专家提醒: 不要过度使用别名,建议尽可能使用小脚本,比如 /usr/local/bin/ 。

Docker 乐高积木

如果你想要在不只一个容器上运行或者测试你的项目,那么就使用上面提到的别名来构建你的项目。你不能在同一个容器中运行你的Web服务,postgres和redis。每项服务应该有自己的容器,现在你需要做的就是把所有的“砖块”组合起来。

Docker有一个特性称之为“链接”,它可以帮助你做正在做的事情。一个被链接的容器通过环境变量导入本身。所以其他的容器能发现Ip地址和链接容器的接口。Heroku 使用了一种类似的方式来添加插件的信息。

但是你能使用fig使这一切更容易。只需要添加fig.yml文件到你的项目中并运行fig up去开启整个环境。本地目录会被绑定到一个容器上,如果文件被修改,文件监视器可自动重启你的服务。Mac/Vagrant用户对这个比较熟悉。我已在piratesinn angellist list添加了fig.yml文件。

事实上,甚至连 fig 自身也是运行在本机上的一个容器中。但是你需要把docker socket 服务绑定到 fig的容器中,这样它才可以启动其他容器。

未完待续。

译文来源:http://www.dockboard.org/dockerize-all-the-things/

【编辑推荐】

  1. Docker如何将错综复杂的Linux代码转成开发者的魔法
  2. 你会用吗?Linux五大数据可视化工具
  3. 深度专访Linux Deepin郭攀 :图标的故事
  4. 送给Linux爱好者精彩有趣的高清Linux壁纸
  5. 极力推荐:一个Docker的maven插件

【责任编辑:林师授 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读—服务器与数据存储

《网管员必读—服务器与数据存储》全面、系统地介绍了在中、高级网络管理和网络工程实施中两个重要方面的主流技术和应用:硬件服务器和数据...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊