docker和产品版本

我正在为一家产品公司工作,我们也做了很多产品的发布。 在目前的testing多个版本的方法中,我们创build单独的虚拟机并在其上安装所有基础架构软件(数据库,应用服务器等)。 稍后我们在各自的VM上部署应用程序WAR。 最近,我遇到了docker工人,这似乎很有帮助。 因此,我开始用网站上列出的例子来探索它。 但是,我无法find一个方法,像docker可以被用来build立适合各种版本的环境?

  1. 每个产品版本都会有数据库模式更改。
  2. 每个应用程序的WAR都会有增强/缺陷等

考虑下面的例子。 每个月,我们公司都会发布一个新版本的软件,因此为了支持/修复每个版本创build虚拟机的缺陷。 考虑到如果应用程序的总体大小是2 GB,而操作系统接近5 GB(除了占用空间,它也将占用系统资源以支持额外开销)。 虚拟机需要恢复任何版本,并testing任何支持问题。 但是考虑到额外的基础设施要求,这似乎是非常昂贵的事情。

docker可以拥有在容器/图像中运行应用程序所需的一切吗?

docker是否可以打包由多个WAR / DB模式组成的应用程序,并在启动时分配适当的端口?

与虚拟机和docker工人相比,是否会有任何空间/内存/速度差异?

你是否认为docker仍然是合适的解决scheme,还是应该继续使用虚拟机? 有人可以分享我如何能达到以上要求与docker?

tl; dr:是的,docker工人可以运行容器内的大部分应用程序。

Docker在每个容器中运行一个进程。 当使用虚拟机或真实服务器时,这个过程通常是启动所有系统服务的init系统。 docker工人通常是你的应用程序。

这种差异会让你的应用更快的启动时间(不是启动整个操作系统)。 权衡是,如果你依赖于系统服务(如cron,sshd …),你将需要自己启动它们。 有一些基本的图像,提供了更像“虚拟机般”的环境…检查phusion的baseimage例如。 要启动多个进程,还可以使用supervisord等进程pipe理器。

outlook未来,推荐的(尽pipe不是必需的)方法是在每个容器中启动一个进程(每个应用程序服务器一个,每个数据库服务器一个,等等),而不使用容器作为虚拟机。

Docker也没有分配端口的问题。 它甚至在Dockerfile上有一个明确的命令: EXPOSE 。 暴露的端口也可以在--publish主机上--publishrun --publish参数,所以你甚至不需要知道分配给容器的IP。

关于使用的空间,你可能会看到重要的节省。 Docker映像是通过堆叠文件系统层来创build的…这意味着常用层只能在服务器上存储一次。 在您的设置中,您可能只有基本操作系统层的一个副本(使用VM,每个VM上都有一个副本)。

在内存上你可能会看到不太显着的节省(主要是由于没有启动所有的操作系​​统服务)。 速度仍然是一个研究的主题……到目前为止,有一点很清楚,为了更快的IO,你将需要使用docker卷,而对于networking繁重的用例,你应该使用主机networking。 查看IBM的研究“ 虚拟机和Linux容器的性能比较 ”。 或者是InfoQ的摘要。

Interesting Posts