理由
用Vagrant开发很酷-一个项目/组件一个VB
用Vagrant开发很垃圾-缓慢的Chef/Puppet/Ansible,多个巨大的VM,遍地重复的软件。
Docker带来独立的仅有一个VM的VM盒子。
CoreOS内整合了docker, 产品发布时候会做得很完美。
开发者开心!编码和发布太容易了。
像我,你可以(或不可以)喜欢用Vagrant发布。为一个项目存储使用多个VM是不可思议的: 像Ansibe之类的工具意味着你的VM将总是反映产品的环境。
假如你是揽活的人或者有许多项目,然而,可能是你有几十个Vagrant盒子在你的dev文件夹,慢慢吸收上亿磁盘空间。这是vagrant 垃圾的地方。。。提别是有多个小SSD的时候。
进入:Docker. 一个从一个机器上管理容器的开源的工具。为所有我们的来自一个VM的项目,我们将使用容器作为“迷你vagrants".我假设你这里用的是Mac-我不了解windows.
让我们投入docker!
我们要使用CoreOS和Vagrant来安装Docker, 取代Docker推荐的Ubuntu vagrant 文件安装。Screw的建议。
为什么用CoreOS?
CoreOS是一个雄心勃勃的旨在简单、可伸缩服务部署的linux发行版。它是轻量级的,并且自带Docker的预安装。它的目的是让服务Docker-based应用变得容易。这就是为什么选择该OS(系统)的原因-文件体积小、建议的安装方式都值得称赞!所以、我真的想去实测一下它。
Note:CoreOS在alpha中已被创建。这意味着它在SSH回话中,可能发生随机重启的现象,但从长远的角度来看,希望是有帮助的。这个是需要注意下的。
你从CoreOS的Github的仓库中进行安装,CoreOS团队做了一个非常棒的工作。
你只需要按照下面的要求去做:
安装1.3.1版本以上的Vagrant和4.0版本以上的VirtualBox。
你可以通过vagrant --version命令检查你的vagrant版本,如果需要下载新的版本可以从vagrant的官网上去下载。
下载已经提供含有你开发使用根目录文件夹的CoreOS vagrant文件。在Vagrant中会安装CoreOS。
vagrant的文件在这里。
添加端口转发到Vagrant的web服务器:
命令是:config.vm.network :forwarded_port, guest: 80, host: 8080
需要注意的是默认情况下共享文件夹没有启用:
可以通过下面的命令开启你vagrant文件的共享文件夹:
config.vm.network "private_network",
ip: "10.1.2.3" config.vm.synced_folder ".",
"/home/core/share", id: "core",
:nfs => true,
:mount_options => ['nolock,vers=3,udp']
我们已经修改了IP地址,CoreOS提供了专用网络:他们使用的IP地址是在公共地址的范围内(即别人公开的可访问的机器)。整个10.X.X.X的IP地址段都是私有的,这样的话可以避免冲突。
你可能已经清楚了安装步骤:我们已经创建了一个vagrant文件,添加了连接CoreOS分布式的URL,设置了共享文件夹的网络。和其他Vagrant的配置步骤相似,只是没有其他的Chef/Puppet/Ansible。
CoreOS已经预先安装好了docker,所以不需要马上做一些配置和软件的安装。
Docker已经安装了,但是它需要一个“基础图像”来运行。 我们所有的容器都将会在这个OS中运行。 本质上, 是所有项目的OS虚拟机。
我们使用ubuntu:
docker pull ubuntu
这下载了所有我们会用到的ubuntu基础图像(12.04, 12.10)。让我们来确认一下这个步骤创建了一个新的容器(说明如下):
docker run -name="test" -t -i ubuntu /bin/bash
下面我们要做的依次是:
让Docker创建开始并且运行一个新的容器(docker run)
命名新的容器为“test”(name="test").
这让我们操作容器变得更简单,并且当我们列出容器时,我们就知道哪个是哪个了。
创建一个违终端,并让其保持打开(-t -i)
让ubuntu成为新容器的基础图像(ubuntu)
在新容器中运行/bin/bash.
Docker需要一个程序来运行一个容器. 更重要的。这包括两层意思: 容器不能脱离程序而运行, 并且当程序结束时容器也将结束. 我们以后将继续讨论这个问题.
你现在在CoreOS的一个Ubuntu容器中.一个小型的Ubuntu虚拟机就可以用了。
现在我们可以离开Docker了. 我们要设置一个基础的LAMP堆栈, 这是很容易安装的. 根据你自己的需要调整这个堆栈也是很重要的.
我们将通过命令行来操作容器, 而不是通过Docker文件. 这是对docker如何工作的介绍.
我们已经在Ubuntu容器中了。 如果不是, 重新运行上面的命令来启动一个Ubuntu容器.
Ubuntu是一个很小的容器. 其中有很多我们需要的东西都没有装.基本操作如下:
增加 universe/multiverse 到apt源:
echo "$(cat /etc/apt/sources.list) universe multiverse" > /etc/apt/sources.list
这是增加 ' universe multiverse' 到apt-get的源列表. 正如之前所说, 这是一个准Ubuntu系统的安装,并且在默认时是不具备的.
apt-get update
安装 curl, wget, vim, build-essential, git:
apt-get install curl wget vim-tiny
我们基本上完成了环境的搭建.首先,将这些改变提交给新的Docker容器。这样我们就不用每次都这么做了(注: 这也是你使用Dockerfiles文件的原因.)
试想想Docker当做是git. 我们已经对Ubuntu做了一些修改, 必须承认这减少了我们的工作量.
和Git一样, Docker减少了每个容器的差别,而不是整个系统. 这意味着我们至于要保存我们安装的软件以及我们改变的文件. 多厉害!
退出Ubuntu容器:
ctrl-d
这将使容器消失. 我们用the/bin/bash程序开始容器 (> docker run -name="test" -t -i ubuntu /bin/bash), 并且当这个开始程序结束时这个容器也就消失了.
列出所有Docker容器:
docker ps -a
-a选项列出了所有的容器.docker ps列出了运行的容器.
我们在列表中可以看见自己的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bf2ba69c69c ubuntu:12.04 /bin/bash 5 seconds ago Exit 0 test
提交改变给新的容器:
docker commit test custom/base
我们已经使用ID而不是名字写了docker commit 4bf2b custom/base 来只是我们改变的那个容器.
这创建了一个叫做custom/base的新容器,这个新容器保存了所有已经做过的修改.和Ubuntu一样我们可以启动这个容器docker run [...] custom/base.这就好了.
可以通过键入docker images查看可用的容器. 你会看见新的Ubuntu图像,以及新的custom/base图像.
这是基础: 创建一个包含部分修改的新容器(用命令行也行, 但最好使用Docker files文件),并且提交和运行.
我们将安装一个基于我们创建的容器的LAMP协议栈. 这不是必须的,安装 python, ruby, golang可以由你自己来选择.
首先,用下列步骤来创建一个新的容器:
docker run -name="lamp" -t -i custom/base /bin/bash
这个shell已经装载了我们刚才修改的那个容器.再为我们的基础协议栈安装mysql、apache和PHP.
apt-get install apache2 mysql-server php5 libapache2-mod-php5
厉害. 跳过这些服务的配置,因为其中有很简单的向导. 如果失败了就加入头Linode Library.
软件安装和配置完成了, 将这些修改提交给新的容器. 按ctrl-d回到CoreOS, 然后按照如下方法提交容器:
docker commit lamp custom/lamp
我们已经做到了可以开始使用Docker容器这一步. 不过有几个前提条件: 转发端口, 并且是数据库和网络服务可以自动运行.
幸运的, 端口可以通过命令行轻松设置(用dockerfiles文件设置更简单):
docker run -t -i -p 80:80 -p 3306:3306 -v /home/core/vagrant/project:/var/www/project custom/lamp /bin/bash
接下来我们要做:
再次使用伪shell运行容器(-t -i)
将容器端口80和3306设置的和CoreOS相同的端口 (-p 80:80 -p 3306:3306)
从CoreOS 安装一个卷到容器, 同时这个卷也被安装在Vagrant上. 这是装在我们机器上的开发文件(-v /from:/to)
现在, 我们可以通过localhost:8080(由Vagrant转发的端口)在容器中运行的网络服务了. 整理一下环境,现在可以开始开发我们的应用了.
你应该熟悉docker的高级功能,如提交、运行、图像以及通过向导创建新的工作开发环境。
通过docker可以做很多事情. 以下一些你可以参考:
使用docker的supervisord - 需要一个在容器中运行的程序来保持它处于活动状态. Supervisord 是一个可以再前台运行的管理程序. 在supervisord.conf文件中设置你的服务并且通过docker启动supervisord来保持你的容器处于活动状态.
通过Docker资料库分享图像
在你的机构里面分享容器和图像.保持你的开发环境健全,使开发更简单.
docker的数据库管理 - 在Docker中数据存储(storage in general, actually)是较难管理的. 在docker中有一个相关的向导. 更多信息here,here, and here.
使用 dockerfiles文件 -这将使你不必手动创建容器.