可以在同一个 Dockerfile 中有 PHP + MongoDb + Nginx 吗?

我需要让 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;

    }

}


慕姐4208626
浏览 204回答 2
2回答

繁星点点滴滴

是的,这是可能的,但这不是 docker 上下文中推荐的方法。将每个容器限制为一个进程是一个很好的经验法则。解耦应用程序每个容器应该只有一个关注点。将应用程序解耦到多个容器中,可以更轻松地水平扩展和重用容器。例如,一个 Web 应用程序堆栈可能由三个独立的容器组成,每个容器都有自己独特的图像,以分离的方式管理 Web 应用程序、数据库和内存缓存。所以最好使用docker-compose并启动三个容器并使用 docker 网络进行通信。这将或多或少或使用 docker-compose至于评论中提到的当前问题,您没有启动 PHP,最好检查容器的日志。

烙印99

您的 dockerfile 的问题是您没有启动 php-fpm。您应该使用 supervisord 来管理单个容器中的多个服务,该文档非常清楚地解释了这个用例。您还可以参考此示例以获取 nginx、php-fpm 和 mysql 的完整 supervisord conf。作为一种观点,在一个容器中运行多个服务是不可取的。
打开App,查看更多内容
随时随地看视频慕课网APP