Docker的适用性

现在我有一堆只有裸机安装的操作系统和软件的服务器。 主要组件是nginx,php-fpm,ffmpeg和一些其他的video编码工具。 每个小时通过cron服务器抓取video转换任务,做他们和准备video到一个文件夹。 Nginx然后stream式传输这些video。

问题是我很厌烦同步configuration文件,更新软件,disitrubing软件,从源头编译等。

所以我想首先我需要单独的video文件和所有的软件。 video文件将仍然保存在服务器上。 对于一个软件容器,我可以使用OpenVZ。 所以,如果我需要更新软件,我只是更新我的OpenVZ模板,并复制此图像+ vzctl销毁+ vzctl在每个服务器上创build。 但是我没有看到将video文件安装到OpenVZ容器的好方法。 我减lessNFS,iSCSI在我的情况是不好的,因为应该有更好的方法。

这就是为什么我认为Docker是一个很好的解决scheme。 据我所知,它允许使用cli调用来挂载外部资源。 所以我只是用nginx + fpm +video工具构build一个docker容器,在我的服务器之间分配它,并将文件附加到本地存储。

请写下你的意见。 是使用docker的好方法,还是我的解决scheme是别的?

如果没有更多的信息,很难回答。 但是这里有一些关于Docker世界的想法。

首先,我会尝试将Docker映像和容器作为应用程序而不是VM来考虑。 分别pipe理来自Docker容器的主机基础设施。 在主机上运行Puppet或Chef来pipe理你的Docker容器和依赖关系可能是完全适用的。 一旦你到了一个完全容器化的世界,你可以通过运行像CoreOS这样的平台来真正简化你的主机。 但是如果你刚刚进入Docker,我可能不会从CoreOS开始。

分开你的应用程序和video文件(你已经提到过)。 构build在主机上保留video文件的“仅数据”容器。 我喜欢使用tianon/true Docker镜像。 使用可以保留的卷运行映像:

 docker run -d --name videodata -v /videodata tianon/true 

这听起来像你会为你的nginx,PHP-FPM和ffmpeg容器至less有一个其他图像。 尽pipe如此,我可能会尝试将这些组件分离成单独的图像。 你可能有一个运行你的代码的PHP-FPM容器,并公开一个nginx的端口或套接字来用于反向代理。 这个容器也会使用--volumes-from来挂载持久化/videodata文件夹。

 docker run -d --name application --volumes-from videodata myorg/myappimage 

那么你可能有一个nginx的图像,它利用Docker链接DNS来打击PHP-FPM:

 docker run -d --name web -p 80:80 --link application:phpfpm myorg/mynginximage 

在nginxconfiguration中,您可以直接点击DNS名称phpfpm来parsing应用程序容器的IP地址。

这个下一个扩展将更多地进入服务发现。 您可以用像https://github.com/jwilder/nginx-proxy这样的设备来replacenginx映像,以便在应用程序容器来来去去时自动添加和删除应用程序容器。

一旦你开始进入多主机Docker世界,工具和概念,如服务目录( https://github.com/progrium/docker-consul ),大使( https://github.com/progrium/ambassadord ),dynamic目录( https://github.com/progrium/registrator )中的服务注册和负载均衡( https://github.com/hashicorp/consul-haproxy )将会更有趣。

所以,要回答你的问题,我认为你有有效的Docker用例。 但我不认为混合OpenVZ和Docker是一个好主意。 你可能想要一个或另一个。

我想你正在寻找像木偶,厨师,Ansible或CFEngineconfigurationpipe理工具。

使用这些工具,您可以configuration模板,然后将其应用于多个服务器。

基本上,当您在configurationpipe理系统中完成configuration系统时,您将在所有服务器上运行单个命令,然后应用configuration。