如何在单独的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开始。
答案 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构建其中的所有内容。
答案 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