php - 是否可以在同一个 Dockerfile 中包含 PHP + MongoDb + Nginx?

标签 php mongodb docker nginx dockerfile

我需要将 3 个服务仅运行到一个 docker 容器中。我在一个 docker-compose 中完成了这个“系统”,但由于一些限制,我只需要将它放入一个 dockerfile 中。我想要运行的应用程序是 PHP(使用 Symfony)+ MongoDb。

现在,我正在执行这个命令:

sudo docker run -p 9091:80 -p 27017:27017 myapp

当我浏览到 localhost:9091 时,我得到的最大错误是 502 错误。

谢谢

Dockerfile:

FROM php:7.3-fpm-stretch
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update
RUN apt install -y \
    nginx \
    mongodb
COPY nginx.conf /etc/nginx/nginx.conf
RUN pecl install mongodb
RUN docker-php-ext-enable mongodb

RUN service nginx start
RUN service mongodb start

EXPOSE 9091
EXPOSE 27017

COPY entrypoint.sh /
WORKDIR /usr/www
ENTRYPOINT ["/entrypoint.sh"]

COPY . /usr/www

入口点.sh

#!/bin/bash

set -e -u

service nginx start
service mongodb start

tail -f /dev/null

nginx.conf

events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        server_name localhost;
        root /usr/www/public;

        location / {
            try_files $uri /index.php$is_args$args;
        }

        location ~ ^/index\.php(/|$) {
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param DOCUMENT_ROOT $realpath_root;
        }

        error_log /dev/stderr debug;
        access_log /dev/stdout;
    }
}

最佳答案

是的,这是可能的,但在 docker 环境中这不是推荐的方法。

Limiting each container to one process is a good rule of thumb.

解耦应用

每个容器应该只有一个关注点。将应用程序解耦到多个容器中可以更轻松地水平扩展和重用容器。例如,Web 应用程序堆栈可能由三个独立的容器组成,每个容器都有自己独特的镜像,以解耦的方式管理 Web 应用程序、数据库和内存缓存。

所以最好使用docker-compose并启动三个容器并使用docker网络进行通信。

这或多或少可能是这样

enter image description here

或使用 docker-compose

enter image description here

就评论中提到的当前问题而言,您尚未启动 PHP,最好检查容器的日志。

关于php - 是否可以在同一个 Dockerfile 中包含 PHP + MongoDb + Nginx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901021/

相关文章:

mongodb - 即使 no_cursor_timeout=True ,游标 ID 在服务器上也无效

php - Netbeans 切换只读

php - 如何限制登录尝试 - PHP & MySQL & CodeIgniter

javascript - 如何在这里实现最大的网络安全

mongodb - Mongoose find 返回空数组

python - Flask 服务器上出现 "Connection was reset"错误

docker - 为什么将/var/hyperledger/production安装到主机卷上会导致错误?

docker - 使用 docker-compose 在 docker 中保护 Redis

javascript - php/jQuery 获取所选值的主键

PHP 7.4 警告 : Creating default object from empty value