Docker生产准备好php-fpm和nginx配置

Bud*_*dry 12 php nginx docker dockerfile docker-compose

我在Docker中结合使用php-fpm,nginx和app代码有一个很小的理论问题.

我试图坚持模型当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
Run Code Online (Sandbox Code Playgroud)

注意:在app.conf中是root /var/www/app; 来自Symfony的示例模式

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

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

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

我尝试搜索,但我不知道如何解决这个问题.很多文章都展示了如何使用docker-compose文件和使用--volume挂载代码,但我没有找到任何示例如何在生产中使用它(没有卷).

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

你有这方面的经验或任何想法如何解决它?

谢谢你的回复!

mhl*_*lsf 5

我通过使用 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
Run Code Online (Sandbox Code Playgroud)

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


Vol*_*lCh 4

此时我使用类似:

Dockerfile:

FROM php:fpm
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install
EXPOSE 9000
VOLUME /var/www/app/web
Run Code Online (Sandbox Code Playgroud)

Dockerfile.nginx

FROM nginx
COPY default /etc/nginx/default
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

app:
  build:
    context: .
web:
  build:
    context: .
    dockerfile: Dockerfile.nginx
  volumes_from: app  
Run Code Online (Sandbox Code Playgroud)

但几天后,在 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
Run Code Online (Sandbox Code Playgroud)

  • 以这种方式使用多阶段构建并不能解决问题。如果运行此 dockerfile,则只会创建一个映像(具有最新 FROM 指令的映像)。 (4认同)