本文首发自“Docker公司”公众号(ID:docker-cn)
编译丨小东
每周一、三、五 与您不见不散!
背 景
我花费了很多的时间和精力来打造我的“家庭版实验室”,可能有点过多,但是我真的非常喜欢它。我一直想拥有一些面向公众的网站和端点,那样我就可以与大家一起玩、一起分享。同时,我也希望这个“家庭版实验室”能够自动更新,因为我不想花费大量时间手动部署应用程序。更重要的是,我不想在闲暇时花费很多金钱与时间在更新应用程序上。所以我制作了这个教程,帮助大家打造一个属于自己的、自动化的“家庭版实验室”。
下列4项就是我对“家庭版实验室”的要求:
- 代码更改时自动更新;
- 配置更改时自动更新;
- 易于扩展和规模化;
- 便宜;
我从一台总共拥有2 GB 内存的 Pine64 服务器开始起步,用它运行了4到5个容器。在编写这篇教程的时候,这个堆栈已经有3台服务器了,并且托管了超过30个容器。没错,我要炫耀一下。
如果对我的“家庭版实验室”感兴趣,您可以在 demo.viktoradam.net 中看到它。同时,您也可以继续关注我们的公众号,我会为大家持续更新这个系列教程。
物理服务器
目前的设置有2台 Pine64 卡片机和一台来自同一制造商的 Rock64 卡片机,它们都是64位ARM服务器。总的来说,我现在拥有12个CPU核心,7 GB内存来帮助我运行所有服务。它们都是功能强大的卡片计算机,每台卡片机只有15-45美元(根据内存的大小)。(PS:国内售价200-300元/台)
Rock64 卡片机
Pine64 卡片机
您可以在卡片机上运行不同版本的Linux。我选择使用Ubuntu的衍生品—— Armbian 。 因为Armbian 只对少数几个在arm64 / aarch64架构上的系统提供官方支持,而Ubuntu就是其中之一,对于Docker来说这一点尤为重要。使用 Armbian 意味着安装和升级 Docker 都会变得非常简单:
$ curl -fsSL get.docker.com | sudo sh
对于我目前所使用的应用程序来说,这些卡片机的性能似乎很好。当内存开始变得不够用时,我可以再订购一台卡片机并将其添加到集群中。上次我花费了大约30分钟(包括下载基础镜像并将其写入SD卡的时间)就将它设置好了。
集 群
我希望我的服务能够使用所有可用的服务器,我并不在意是否要最大限度地使用它们,只要应用程序以合理的方式分布在服务器之间就可以了。我还希望避免为服务器端点捆绑 IP 地址来保持动态和便携性。对于这个用例,Docker 和 Swarm 堆栈提供了莫大的帮助。
将所有应用程序打包成 Docker 镜像,并且以容器的方式运行它们,使应用程序更具便携性。我甚至为多个处理器架构( amd64 、 arm 和 arm64 )来构建它们,所以在未来如果我想的话,就可以在 Raspberry Pi (树莓派)或 x86 NUC 上运行它们。Docker 为我们提供了一套统一部署应用程序的方式(不管应用程序使用的是什么编程语言,或需要什么依赖关系)。
Docker Swarm 负责集群逻辑。一个节点是领导者,加入的新节点就像:
$ docker swarm join --token SWMTKN-1-abcd-efgh 192.168.1.1:2377
所有应用程序都作为在 YAML 文件中描述的 Swarm 服务来运行。这使得我可以定义它们的运行时属性、定义作为环境变量的配置和定义其它元数据标签。添加一个新的应用程序就像在这个文件中定义它的名字、镜像和设置一样简单,然后再次部署堆栈就可以了。实际部署是自动化的,相关服务(如反向代理和监控)会自动重新配置。
这一切都意味着,无论何时更新堆栈或其中的应用程序,所有东西都会在“git push”之后自动处理。这真的是太酷了!
(PS:在这个系列教程的后续部分,会有Docker及其相关自动化的更多内容,敬请关注!)