我在一家产品公司工作,我们确实制作了很多产品。在当前测试多个版本的方法中,我们创建了单独的VM并在其上安装了所有基础架构软件(db,app server等)。稍后我们在相应的VM上部署应用程序WAR。最近,我遇到了码头,它似乎很有帮助。因此,我开始使用网站上列出的示例进行探索。但是,我无法找到一种方法,因为如何将docker应用于构建适合各种版本的环境?
考虑下面的例子。 每个月,我们公司都会发布一个新版本的软件,因此为了支持/修复我们每个版本创建虚拟机的缺陷。考虑到如果应用程序的总体大小为2 gb且OS接近5 gb(除了空间之外,它还将占用系统资源以获得额外开销)。 VM需要恢复任何版本并测试针对它报告的任何支持问题。但是考虑到额外的基础设施要求,这似乎是非常昂贵的事情。
docker能否拥有在容器/图像中运行应用程序所需的一切?
docker能否打包一个由多个WAR / DB模式组成的应用程序,并在启动时分配适当的端口?
假设上述情况,与VM和docker相比是否会有任何空间/内存/速度差异?
您认为docker仍然是合适的解决方案还是我们应该继续使用VM?有人可以分享一下如何用docker实现上述要求吗?
答案 0 :(得分:1)
tl;博士:是的,docker可以在容器内运行大多数应用程序。
Docker在每个容器中运行一个进程。使用虚拟机或真实服务器时,这一个进程通常是启动所有系统服务的init系统。使用docker通常是您的应用程序。
这种差异将使您的应用程序启动时间更快(不启动整个操作系统)。权衡的是,如果您依赖系统服务(例如cron,sshd ......),您需要自己启动它们。有一些基本图像可以提供更多类似VM的"环境...例如检查phusion's baseimage。要启动多个流程,您还可以使用流程管理器,例如supervisord。
展望未来,建议(尽管不是必需的)方法是在每个容器中启动一个进程(每个应用程序服务器一个,每个数据库服务器一个,依此类推),而不是将容器用作VM。
Docker也没有分配端口的问题。它甚至在Dockerfile上有一个显式命令:EXPOSE
。暴露的端口也可以使用--publish
argument of run
在docker主机上发布,因此您甚至不需要知道分配给容器的IP。
关于已用空间,您可能会看到重要的节省。 Docker镜像是通过堆叠文件系统层来创建的......这意味着公共层只在服务器上存储一次。在您的设置中,您可能只有一个基本操作系统层的副本(使用VM,每个VM上都有一个副本)。
在内存中,您可能会看到不太显着的节省(主要是由于未启动所有操作系统服务)。速度仍然是研究的主题......到目前为止,一些明确的事情是,对于更快的IO,您将需要使用docker卷,而对于网络繁重的用例,您应该使用主机网络。查看IBM research" An Updated Performance Comparison of Virtual Machines and Linux Containers"详情。或者像InfoQ's这样的摘要。