如何在生产中将数据库的 docker 容器放在不同的主机上?

How to put docker container for database on a different host in production?

假设我们有一个简单的 Web 应用程序堆栈,类似于 docker-compse 文档中描述的那种。它的 docker-compose.yml 看起来像这样:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

这非常适合在笔记本电脑上进行开发。但是,在生产中,要求 db 容器位于其自己的主机上会很有用。我能找到使用 docker-swarm 扩展 Web 容器的教程,但没有注意 db 的实例和 web 运行 的一个实例这一事实在同一台机器上。

是否可以使用 docker 要求特定容器在其自己的机器上(或者更好,在特定机器上)?如果是这样,如何?如果不是,docker 在多容器应用程序中处理数据库的方法是什么?

在我看来,数据库位于容器世界的边缘,它们对开发和测试很有用,但生产数据库在本质上通常不是非常短暂或可移植的东西。 Flocker 当然 与可扩展类型的数据库(如 Cassandra)一样有帮助,但数据库可能有非常具体的要求,最好将其视为容器化应用程序背后的服务(RDS, Cloud SQL 等)。

无论如何你都需要一个容器编排工具。

您可以为 Compose + Swarm 应用 manual scheduling constraints 来指定 docker 容器可以 运行 的主机。对于您的数据库,您可能有:

environment:
  - "constraint:storage==ssd"

否则,您可以使用 Ansible, Chef, Puppet

设置更静态的 Docker 环境

使用另一个支持docker的编排工具:Kubernetes, Mesos, Nomad

使用容器服务:Amazon ECS, Docker Cloud/Tutum