在Docker上组织多层应用程序的最佳实践

我想对使用Docker来组织我的项目的最佳实践有一些build议。

比方说,我有两个主要的应用程序,商店和产品pipe理应用程序组成的项目X. 他们是完全不同的应用程序,但是同一个项目的一部分。 他们有自己的服务,源代码,存储库和基础设施。

存储[mysql,mongodb,elasticsearch,nginx,php,app源码] PMA [mysql,nginx,php,app源码]

由于他们是两个不同的仓库,并有自己的docker组成文件,我怎么能只用一个命令运行的一切?

我是否应该创build一个docker repo来扩展docker-compose,并且一次只运行一次?

  • 尽可能地隔离事物,所以如果你需要一个mysql和一个mongodb将它们分开,并尽可能小的容器,只需要他们需要的图书馆和二进制文件(又称microcontainers )。 为了达到这个目的,你也可以使用alpine linuxbuild立你的图像。
  • 对于数据库容器,使用卷将数据存储在主机而不是容器中,运行得更快。 您还可以将configuration文件存储在一个卷中,以便每次要更改configuration时都不必访问容器。
  • 使用Dockefiles而不是手动build立你的图像,这使得图像可以在任何主机中复制,并且可以将它们存储在git中。

我会用docker compose来一次构build和运行所有的容器,但是如果你的架构太复杂,你需要更强大的function来看看Kubernetes 。

首先,我不build议集装箱数据库。 没有太多的好用例,因为很多复制只是通过less数主机上的IO和磁盘利用率来咀嚼。 您还会失去很多数据库/数据存储的典型专业化和维护/pipe理。

创buildDockerfiles的git存储库。 这使得更新系统在未来更容易。 我的结构通常是

/Dockerfiles /Project Dockerfile (required files) docker-compose.yml 

也有一个私人的registry,但从上面的dockerfilesbuild立这些图像。 使pipe理版本变得非常容易,并且便于启动和自动部署。

  1. 创build群集(1台或更多台主机)
  2. 创build两个覆盖networking(如果你喜欢,可以命名为store和pma)
  3. 创build一个共享NFS存储点,以挂载到/ docker上的主机。 装载点需要在读取,写入和执行泊坞窗组。 这将用于elasticsearch集群上的永久存储
  4. 在商店networking上为php-fpm(运行源代码),NGINX代理它以及弹性search创build服务。 他们可以通过名称在覆盖networking上互相引用
  5. 在pmanetworking上为php-fpm,nginx(代理)创build服务

你也可以创build一个Apache / PHP的图像。 这就是我们为beadockstar / laravel所做的。

请注意PHP系统上的存储空间。 如果您需要上传某些不会被抽象到某种types的CDN的内容,则需要确保将上传的目录保存到/ docker主机目录(或跨其他统一主机目录所有的群主机)