IFTTT是“if this then that”的缩写,事实上是让你的网络行为能够引发连锁反应、让你使用更为方便,其宗旨是“Put the internet to work for you”(让互联网为你服务)。Docker在IFTTT中也在开发实践,以下是Nicholas Silva的一些介绍。
IFTTT目前正处于从基础架构向容器集装体系结构转移的过程中。我们有一大批微服务和容器将会按照这个架构进行管理。移动我们的生产环境架构之前,我们决定首先从本地开发环境开始实践。这样我们就可以在冒险上生产环境之前发现应用程序的的一些问题。
另外,本地开发环境已经偏离了我们现存的生产环境。我们使用Chef(一个系统集成框架,为整个架构提供配置管理功能)和Vagrant(一款用来构建虚拟开发环境的工具)提供管理本地虚拟机。它虽然一直在工作,但是我们知道它工作不了太久。我们需要采取行动,而不是浪费时间把测试环境同步到一个即将弃用的生产环境中。于是我们决定直接完全跃过现存系统,直接开发我们想要的。
下面介绍的是我们如何让工程师在我们的开发环境运行使用Docker的过程。
目前IFTTT的工程师都使用苹果电脑开发,所以这里的系统都是Mac OS,由于不考虑跨平台所以不会太复杂。
我们在Dash项目中开源了所有收集的代码。这些代码相当难以理解,如果你盲目的运行必定会浪费很多时间。运行之前我们先来看下它都是做什么的。
我们使用Homebrew和Ansible运行curlbash自动化操作整个过程:
bash <(curl -fsSL https://raw.githubusercontent.com/IFTTT/dash/master/bin/bootstrap)
引导脚本安装Homebrew和Ansible成功后下载Dash的代码库,使用Ansible安装并配置VirtualBox、Docker、Docker Machine、Docker Compose以及开发环境的DNS,然后编译Docker Machine VM。
Ansible通常被用来管理远程服务器,但也可以用来配置本地机器。通过参数目录中的IP host参数127.0.0.1,你可以使用Ansible palybook执行一个本地任务。
IP地址之后必须有一个逗号,因为它使参数显示为列表,而不是一个文件的名称。
Ansible playbook只是一个YAML文件,它列举了一些正在运行的任务和状态。我不会深入讲这个文件,但是如果你有兴趣可以看整个文件。
通过Ansible,我们安装了提供Homebrew不包含二进制文件Caskroom,以及大量的packages和配置文件。
包括:
VirtualBox
Docker
Docker Machine
Docker Compose
DNS .dev resolution to the VM
NFS exports
Shell Environment
这里比较有意思的是DNS解决方案。在/etc/resolver/dev创建文件:
所有的.dev请求被路由到Docker Machine中。运行一个简单的dnsmasq容器,路由所有的.dev请求回到VM,另一个nginx代理容器路由请求到合适的容器内(待续)。不要去修改/etc/hosts文件!来自虚拟机和你本机系统的Host类似ifttt.dev的域名时,请求可以被路由到合适的服务器。
在dev命令中,我已经把几个复杂的命令通过别名的方式整合为一个简单文件命令。例如创建一个dev machine我们使用:
docker-machine create \--driver virtualbox
docker-machine scp \
/usr/local/dev-env/docker/bootsync.sh \
dev:/tmp/bootsync.sh
docker-machine ssh dev \
"sudo mv /tmp/bootsync.sh /var/lib/boot2docker/bootsync.sh" docker-machine restart dev
这条命令意思显而易见。使用NFS和dev DNS,我们要拷贝下面这个脚本到VM中,然后重启VM。
这个脚本并不是很复杂:
sudo umount /Users
sudo /usr/local/etc/init.d/nfs-client start
sleep 1
sudo mount.nfs 192.168.99.1:/Users /Users -v -o \
rw,async,noatime,rsize=32768,wsize=32768,proto=udp,udp,nfsvers=3
grep '\-\-dns' /var/lib/boot2docker/profile || {
echo 'EXTRA_ARGS="$EXTRA_ARGS --dns 192.168.99.100 \
--dns 8.8.8.8 --dns 8.8.4.4"' | sudo tee -a \
/var/lib/boot2docker/profile
}
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" \
| sudo tee /etc/resolv.conf