Docker - 将代码提供给nginx和php-fpm

时间:2017-08-10 13:13:32

标签: php docker nginx docker-compose dockerfile

如何在单独的NGINX和PHP-FPM容器之间提供容器化PHP应用程序的代码,该应用程序的图像基于busybox并且仅包含代码?我使用第3版的docker compose。

包含代码的图像的Dockerfile将是:

FROM busybox

#the app's code
RUN mkdir /app

VOLUME /app

#copy the app's code from the context into the image
COPY code /app

docker-compose.yml文件将是:

version: "3"
services:
  #the application's code
  #the volume is currently mounted from the host machine, but the code will be copied over into the image statically for production
  app:
   image: app
   volumes:
    - ../../code/cms/storage:/storage
   networks:
    - backend

  #webserver
  web:
   image: web
   depends_on:
    - app
    - php
   networks:
    - frontend
    - backend
   ports:
    - '8080:80'
    - '8081:443'

  #php
  php:
   image: php:7-fpm
   depends_on:
    - app
   networks:
    - backend

networks:
 cms-frontend:
   driver: "bridge"
 cms-backend:
   driver: "bridge"

我想到的解决方案,既不合适:

1)在PHP和NGINX容器中使用应用程序容器中的卷,但是comp3不允许它(volumes_from指令)。不能使用它。

2)将代码放入指定的卷并将其连接到容器。这样,我无法容纳代码。不能用。 (我还必须在群中的每个节点上手动创建此卷?)

3)将代码直接复制到基于NGINX和PHP-FPM的图像中两次。不好的想法,我必须让他们保持一致。

坚持这一点。还有其他选择吗?我可能误解了一些东西,只从Docker开始。

2 个答案:

答案 0 :(得分:0)

我看到它的方式,你有两个选择:

(1)使用Docker-compose :(这是非常简单的开发环境)

您必须从nginx和php-fpm图像构建两个单独的容器。然后只需在php-fpm上的nginx上的web文件夹中提供app文件夹。

# The Application
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www
    expose:
      - 9000
  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dev.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    links:
       - app:app
    ports:
      - 80:80
      - 443:443

(2)使用单个Dockerfile构建其中的所有内容。

  • 从一些linux或php图像开始
  • 安装nginx
  • 构建自定义图像
  • 使用supervisord服务多服务docker容器

答案 1 :(得分:0)

我也一直在寻找解决类似问题的方法,当最好将两个服务都在一个容器中运行以进行生产时,Nginx + PHP-FPM似乎是例外之一。在开发中,您可以将项目文件夹绑定到nginx和php容器。根据Bret Fisher的php默认指南:php-docker-good-defaults

  

到目前为止,我建议使用Nginx + PHP-FPM组合的唯一方案是多服务容器。这是一个非常独特的问题,并不总是很适合“一个容器,一个服务”的模型。您可以使用两个单独的容器,一个使用nginx,一个使用php:fpm,但是我已经在生产中尝试过了,还有很多缺点。每个容器中都必须有一个PHP代码副本,它们必须通过TCP进行通信,这比单个容器中使用的Linux套接字要慢得多,并且由于通常它们之间是一对一的关系,因此单独的服务控制颇具争议。

您可以在docker页面上了解有关设置多个服务容器的更多信息(也在上面的链接中列出):Docker Running Multiple Services in a Container