Docker - 分别扩展 nginx 和 php-fpm

Jim*_*izz 11 php nginx php-fpm docker

我一直在玩 docker 和 docker-compose 并有一个问题。

目前我的 docker-compose.yml 看起来像这样:

app:
    image: myname/php-app
    volumes:
        - /var/www
    environment:
        <SYMFONY_ENVIRONMENT>: dev

web:
    image: myname/nginx
    ports:
        - 80
    links:
        - app
    volumes_from:
        - app
Run Code Online (Sandbox Code Playgroud)

应用程序包含端口 9000 上的 php-fpm 和我的应用程序代码。Web 是带有一些配置的 nginx。

这如何发挥我所期望的功能,但是为了将 nginx 连接到 php-fpm 我有这一行:

fastcgi_pass    app:9000;
Run Code Online (Sandbox Code Playgroud)

我怎样才能有效地扩展它?例如,如果我想要运行一个 nginx 容器但运行三个应用程序容器,那么我肯定会有三个 php-fpm 实例都试图侦听端口 9000。

如何在不同的端口上拥有每个 php-fpm 实例,但仍然知道它们在任何给定时间在我的 nginx 配置中的位置?

我采取了错误的方法吗?

谢谢!

小智 5

一种解决方案是将额外的 php-fpm 实例添加到您的 docker-compose 文件中,然后使用其他答案中提到的 nginx 上游来平衡它们之间的负载。这是在这个示例 docker-compose repo 中完成的:https : //github.com/iamyojimbo/docker-nginx-php-fpm/blob/master/nginx/nginx.conf#L137

upstream php {
    #If there's no directive here, then use round_robin.
    #least_conn;
    server dockernginxphpfpm_php1_1:9000;
    server dockernginxphpfpm_php2_1:9000;
    server dockernginxphpfpm_php3_1:9000;
}
Run Code Online (Sandbox Code Playgroud)

这并不是很理想,因为当您想放大或缩小时,它需要更改 nginx 配置和 docker-compose.yml。

请注意,9000 端口是容器内部的,而不是您的实际主机,因此在端口 9000 上有多个 php-fpm 容器并不重要。

Docker 在今年秋天收购了 Tutum。他们有一个解决方案,将 HAProxy 容器与他们的 api 相结合,以自动调整负载平衡器配置以适应正在运行的容器进行负载平衡。这是一个很好的解决方案。然后 nginx 指向分配给负载均衡器的主机名。或许 Docker 会在 Tutum 收购之后进一步将这种类型的解决方案集成到他们的工具中。这里有一篇关于它的文章:https : //web.archive.org/web/20160628133445/https : //support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service

Tutum 目前是一项付费服务​​。Rancher 是一个开源项目,提供类似的负载平衡功能。他们还有一个“rancher-compose.yml”,它可以在 docker-compose.yml 中定义服务设置的负载平衡和扩展。 http://rancher.com/the-magical-moment-when-container-load-balancing-meets-service-discovery/ http://docs.rancher.com/rancher/concepts/#load-balancer

2017 年 3 月 6 日更新:我使用了一个名为interlock的项目,它与 Docker 一起工作来自动更新 nginx 配置并重新启动它。另请参阅@iwaseatenbyagrue 的回答,其中有其他方法。