Docker 生产就绪 php-fpm 和 nginx 配置

Posted

技术标签:

【中文标题】Docker 生产就绪 php-fpm 和 nginx 配置【英文标题】:Docker production ready php-fpm and nginx configuration 【发布时间】:2017-09-23 02:58:52 【问题描述】:

我在 Docker 中结合 php-fpm、nginx 和应用程序代码有一个小理论问题。

当 docker image 只做一件事时,我试图坚持模型 -> 我有单独的 php-fpm 和 nginx 容器。

php:
    image: php:5-fpm-alpine
    expose:
        - 9000:9000
    volumes:
        - ./:/var/www/app

nginx:
    image: nginx:alpine
    ports:
        - 3000:80
    links:
        - php
    volumes:
        - ./nginx/app.conf:/etc/nginx/conf.d/app.conf
        - ./:/var/www/app

注意: 在 app.conf 中是 root /var/www/app; Example schema from Symfony

这在开发中很棒,但我不知道如何将其转换为生产就绪状态。在生产环境中挂载 app 目录是非常糟糕的做法(如果我没记错的话)。在最好的情况下,我将应用程序源代码复制到容器中并使用此预构建代码(Dockerfile 中的COPY . /var/www/app),但在这种情况下是不可能的,或者我不知道怎么做。

我需要在两个容器(nginx 容器和 php-fpm 容器)之间共享应用程序源代码,因为它的展位需要它。

当然,我可以制作自己的 nginx 和 php-fpm 容器并将COPY . /var/www/app 添加到它们中,但我认为这是错误的方式,因为我重复了代码和整个构建过程(安装依赖项,构建源代码等) ...) 必须在两个 (nginx/php-fpm) 容器中。

我尝试搜索,但不知道如何解决此问题。很多文章都展示了如何使用 docker-compose 文件执行此操作并使用 --volume 挂载代码,但我没有找到任何示例如何在生产环境中使用它(没有卷)。

对我来说只有一个可以接受的解决方案(在这个时候)是用 nginx 和 php-fpm 一起制作一个容器,但我不确定什么时候是一个好方法(我试图找到 最佳实践)。

您对此有任何经验或有任何解决方法的想法吗?

感谢您的回复!

【问题讨论】:

同样的问题 :( 我也需要帮助 【参考方案1】:

这时候我用smth like:

Dockerfile:

FROM php:fpm
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install
EXPOSE 9000
VOLUME /var/www/app/web

Dockerfile.nginx

FROM nginx
COPY default /etc/nginx/default

docker-compose.yml

app:
  build:
    context: .
web:
  build:
    context: .
    dockerfile: Dockerfile.nginx
  volumes_from: app  

但是在 17.05 版本的几天内,我们可以在一个 Dockerfile 中做这样的事情:

FROM php:cli AS builder
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install && bin/console assets:dump

FROM php:fpm AS app
COPY --from=builder /var/www/app/src /var/www/app/vendor /var/www/app/
COPY --from=builder /var/www/app/web/app.php /var/www/app/vendo /var/www/app/web/

FROM nginx AS web
COPY default /etc/nginx/default
COPY --from=builder /var/www/app/web /var/www/app/web

【讨论】:

以这种方式使用多阶段构建并不能解决问题。如果你运行这个 dockerfile,只会创建一个镜像(带有最新 FROM 指令的那个)。 @JimPanse 在 docker.compose 的build 部分中有docker build --target 选项和target 没错!我昨天发现了这个选项......有了这个选项,构建图像真是太棒了!【参考方案2】:

我通过使用 docker-compose 文件创建共享卷来解决问题:

version: '3'

volumes:
 share_place:

services:
 php:
  image: php:5-fpm-alpine
  ports:
   - 9000:9000
  volumes:
   - share_place:/var/www/app
 nginx:
  image: nginx:alpine
  ports:
   - 3000:80
  volumes:
   - share_place:/var/www/app

这将创建一个卷 share_place,它将在两个容器之间共享数据。

【讨论】:

以上是关于Docker 生产就绪 php-fpm 和 nginx 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何 在Docker窗口中部署PHP开发环境

docker 部署nginx、php-fpm错误记录

Day919.生产就绪 -SpringBoot与K8s云原生微服务实践

PHP-FPM docker 容器根据引擎(docker-compose 和 swarm)有不同的行为

使用 nginx、PHP-FPM 和 docker 处理 PHP 文件时出现 403 错误

“生产就绪”对于Kubernetes集群意味什么?