我一直在直接在vps上运行单个nginx / php-fpm安装中的大部分应用程序。 我已经决定尝试docker,现在已经玩了一个星期了。 我已经读了所有可能的东西,并相信我理解它的概念。
但是我不能把自己的头围绕nginx,php和db这么多的实例。
我解决的一件事是我想有1分贝,所以这很容易:
mariadb: image: mariadb:latest container_name: mariadb ports: - "127.0.0.1:3306:3306" restart: always environment: MYSQL_ROOT_PASSWORD: xxxxx volumes: - /srv/mysql:/var/lib/mysql
我还发现nginx-proxy和nginx-certs一起工作就像魅力:
nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" - "443:443" restart: always volumes: - /srv/certs:/etc/nginx/certs:ro - /var/run/docker.sock:/tmp/docker.sock:ro - ./vhost.d:/etc/nginx/vhost.d - /usr/share/nginx/html nginx-certs: image: jrcs/letsencrypt-nginx-proxy-companion container_name: nginx-certs volumes: - /srv/certs:/etc/nginx/certs:rw - /var/run/docker.sock:/var/run/docker.sock:ro volumes_from: - nginx-proxy
这是所有的花花公子。 但是,我如何处理实际的应用程序容器?
我想保持内存使用率最低,所以build议:
有任何想法吗?
你应该只需要每个主机一个nginx容器,并使用它在你的PHP容器之间进行负载平衡。 如果你在nginx容器上正确设置了重启策略,它应该一直运行,并且nginx可以处理大量的负载,所以只有一个应该没问题。
当你有多个nginx时,它也变得更难管理,因为一次只有一个容器可以绑定到端口80和443,在这种情况下你需要在两个nginx容器前面加载一个负载平衡。 如果你想要冗余,你可以使用相同的设置来添加另一台主机,即主机之间的负载平衡。
1分贝的容器与卷的数据是好的。
至少有一个PHP容器,理想情况下不止一个,但取决于你的负载。 如果您计划在运行时更改容器中的数据(php文件)(不推荐),请确保使用卷,并在所有php容器之间共享。
在php容器之间有nginx负载平衡,并确保php容器的重启策略正确设置。
如果你需要更新php容器的映像,那么如果你有多个映像,那就更容易了,那么你可以在没有停机的情况下进行滚动升级。
完成滚动升级,无需停机。
这种设置适用于一个站点,或许多。 唯一的区别是nginx会根据主机名来处理正确的php容器的代理。
所以你总是会有1个nginx,但是PHP的容器会根据你所托管的站点的数量而增长。
我从来没有使用过PHP-fpm,但这里的文档会帮助你,我想: https : //hub.docker.com/r/bitnami/php-fpm/他们解释如何设置一个单独的容器中的nginx从服务器内容“裸”php-fpm容器,你只需要重复每个php-fpm容器的步骤,但保持相同的nginx容器。 解决方案2似乎是要走的路,nginx-proxy既可以是代理服务器,也可以是前端(将conf保存在一个地方),所以nginx-proxy + nginx-certs + N php-fpm 。
在一个侧面说明,你应该使用阿尔卑斯山的形象,他们是可笑的小,只有你所需要的,像这样: https : //hub.docker.com/r/yavin/alpine-php-fpm/
编辑
我做了一些测试。 您可以为每个虚拟主机定义nginx-proxy的自定义配置。 PHP容器收到请求,但后来我得到了一个502错误。 自定义conf位于/etc/nginx/vhost.d文件夹中,并命名为myphp.local (myphp.local是您的PHP容器的虚拟主机),它只包含一个位置指令:
location ~ \.php$ { fastcgi_pass myphp.local:9000; fastcgi_index index.php; }
自动生成的nginx-proxy的default.conf如下所示:
upstream myphp.local { server 172.17.0.2:9000; } server { server_name myphp.local; listen 80; include /etc/nginx/vhost.d/myphp.local; location / { proxy_pass http://myphp.local; } }
对于我来说,PHP容器应该收到端口9000的请求。但我不熟悉PHP,所以我不知道这个问题可能是什么。 我的index.php是一个简单的<?php echo "hello world!" ?>
<?php echo "hello world!" ?>
。