Docker production ready php-fpm 和 nginx configuration

2022-08-30 17:53:42

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

当docker图像只做一件事时,我试图坚持使用模型 - >我有单独的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 中是来自 Symfony 的示例架构root /var/www/app;

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

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

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

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

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

你对此有任何经验或知道如何解决它吗?

感谢您的回复!


答案 1

我通过使用 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,该卷将在两个容器之间共享数据。


答案 2

此时我使用smth,如:

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 smth中完成,例如:

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

推荐