java 带有/数据库的网络应用程序应该有多少个 docker 容器?

how many docker containers should a java web app w/ database have?

我正在尝试 "dockerize" 我的 java 网络应用程序,最后 运行 EC2 上的 docker 图像。

我的应用程序是一个 WAR 文件并连接到数据库。还有一个 python 脚本,应用程序通过 REST 调用该脚本。 python 端使用 tornado 网络服务器

问题一:

我应该有以下 Docker 个容器吗?

  1. 应用程序服务器容器(Tomcat 7)
  2. HTTP 服务器的容器(httpd 的 nginx)
  3. postgres 数据库的容器
  4. python 脚本的容器(这将包含 tornado 网络服务器和我的 python 脚本)。

问题二:

构建 docker 文件的最佳方法是什么?对于需要将哪些命令放入每个容器的 docker 文件,我将不得不反复试验。我是否应该有一个 ubuntu 虚拟机,在上面进行反复试验,一旦我确定了我需要的命令,然后将它们放入该容器的 docker 文件中?

您可以使用 Docker Machine 在 Mac 或 Windows 上创建 Docker 开发环境。这非常适合反复试验。 Ubuntu VM 不需要。

Docker容器只做一件事。因此,您的应用程序将由多个容器组成,每个容器一个。您还清楚地确定了应用程序的不同容器。工作流程可能如下所示:

  1. 为 Tomcat 容器、nginx、postgres、tornado 创建一个 Docker 文件
  2. 将应用程序部署到 Tomcat 中的 Docker 文件或通过映射卷
  3. 为每个容器创建镜像
  4. 可选择将这些图像推送到 Docker 集线器
  5. 如果您计划在多台主机上部署这些容器,请创建覆盖网络
  6. 使用Docker Compose 一起启动这些容器。它将使用之前创建的网络。或者,您也可以使用 --x-networking for Docker Compose 来创建网络。

该列表看起来是正确的。

将堆栈拆分到单独容器的优点是您可以(在许多情况下)使用 off-the-shelf 官方图像,并且只需要提供正确的配置即可使它们协同工作。此外,您还可以单独升级组件(容器)。

请注意,禁止将多个服务合并到一个容器中,但在Docker中,分离关注点是总体最佳做法,并且有一个 单个容器只负责单个task/service.

要让所有容器以正确的配置启动,docker-compose 是 不错的选择;它使您能够创建一个文件 (docker-compose.ymlhttps://docs.docker.com/compose/compose-file/) 描述您的项目;为每个容器构建哪些图像,容器如何与 each-other 相关,并将配置传递给它们。

有了 docker-compose,你就可以通过 运行 启动所有容器 docker-compose up -d