【问题标题】:Setting up PHP-FPM, Nginx, Mariadb on CentOs using docker使用 docker 在 CentO 上设置 PHP-FPM、Nginx、Mariadb
【发布时间】:2019-03-03 14:13:31
【问题描述】:

我正在尝试从使用 VirtualBox 作为我的开发环境转移到 docker。

使用 VirtualBox,我主要安装 PHP-FPM、Nginx 和 Mariadb,但在 Docker 中,尽管尝试了几天,我仍无法复制相同的堆栈。

在所有 LEMP/LAMP 堆栈 docker 指南中,只有这一个 chentex/docker-nginx-centos 适合我:

这是来自Dockerfile的代码

FROM centos:centos7
LABEL maintainer="Vicente Zepeda <chente.z.m@gmail.com>"

ENV nginxversion="1.12.2-1" \
    os="centos" \
    osversion="7" \
    elversion="7_4"

RUN yum install -y wget openssl sed &&\
    yum -y autoremove &&\
    yum clean all &&\
    wget http://nginx.org/packages/$os/$osversion/x86_64/RPMS/nginx-$nginxversion.el$elversion.ngx.x86_64.rpm &&\
    rpm -iv nginx-$nginxversion.el$elversion.ngx.x86_64.rpm &&\
    sed -i '1i\
    daemon off;\
    ' /etc/nginx/nginx.conf

CMD ["nginx"]

这是开箱即用的,我可以在http://localhost上看到一个默认页面

唯一的问题是,它不包含 PHP-FPM 和 Mariadb。

我试图更改文件并添加 PHP-FPM 和 Mariadb,但我在 reddit 上发现每个容器都应该在服务中,例如一个用于 nginx 的容器,另一个用于 php ......我迷路了关于如何做到这一点

【问题讨论】:

标签: php mysql docker nginx mariadb


【解决方案1】:

这里有几个答案暗示了两件非常准确的事情:

  1. 每个服务都应该有自己的 Docker 容器(如您所见)
  2. 流行的方法包括自定义 docker-compose 文件,或使用 Vagrant、Laravel、Lando、LaraDock 等配置工具将另一层添加到您的堆栈中......

但更重要的是,如果您在尝试为这样一个简单的 LEMP 堆栈服务器的每个服务设置多个 Docker 容器时遇到如此多的困难和挫败感(无论您采用何种方法,这都很复杂),也许可以考虑放弃整个容器方法。

假设您正在设置 WordPress 服务器,那么有支持 PHP Composer 的 Roots Trellis 等选项,或者 EasyEngine v4 也已经集成了 Docker。

一个更轻松的选择是我团队的 SlickStack,它有零个容器,只需要 Bash 命令的基本知识即可部署 LEMP 堆栈服务器。

您提到要警惕依赖过多的第三方应用程序,因此这些应用程序将删除这些应用程序。

【讨论】:

    【解决方案2】:

    你可以使用我的 docker-compose 文件(mariadb、php-fpm、nginx)

    https://github.com/matchish/skeleton
    

    快跑

    docker-compose up -d
    

    你会在http://localhost看到“Hello world” 您可以在 .env 文件中编辑环境变量

    另外,我推荐https://laradock.io/

    您可以在任何服务中运行终端

    docker-compose exec db bash
    docker-compose exec php-fpm bash
    docker-compose exec nginx bash 
    

    另外,您可以添加数据库初始化文件。阅读此文件中的手册https://github.com/matchish/skeleton/blob/master/mariadb/docker-entrypoint-initdb.d/createdb.sql.example

    要重新启动服务,请停止容器,然后重新启动它

    docker-compose stop nginx 
    docker-compose up -d nginx
    

    如果你需要编辑 nginx 配置文件,你应该重建镜像

    docker-compose build nginx 
    docker-compose up -d
    

    如果您需要 phpmyadmin,您可以将其添加到撰写文件中

    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      environment:
        PMA_HOST: db
        PMA_PORT: 3306
      ports:
        - '8181:80'
    

    现在您可以通过http://localhost:8181访问它

    在生产中使用 compose 最简单的方法是将项目目录复制到生产服务器并运行 docker-compose up -d。您可以排除logs 目录。最好有多个撰写文件 (https://docs.docker.com/compose/production/)

    部署到生产环境时不要忘记保留文件权限

    【讨论】:

      【解决方案3】:

      Docker-compose 很好,但不是最容易使用的。你真的应该研究一下Lando,因为它使开发环境成为一个绝对容易设置的问题。它基本上是 Docker 之上的一个可用性层,而且它确实很灵巧。

      在进一步讨论之前,我确实需要提一下,Lando 并不真正适用于 Windows 10 Home,因为 Windows 版本的 Docker 使用 Hyper-V,它仅随 Win10 Pro 提供。不过,Mac 和 Linux 运行良好。

      Lando 有“食谱”,它们是减少您必须编写的配置数量的起点。如果您正在开发 Drupal 或 WordPress 网站,则有相应的秘诀。或者,如果您是从头开始编写,还有 LAMP 和 LEMP 配方。

      安装 Lando 后,您要做的就是为您的应用创建一个配置文件并启动它。有一个lando init 命令可以通过询问您几个问题来生成配置,但我更喜欢手动编写.lando.yml 配置文件,因为它并不难。

      所以如果你想要一个 LEMP 设置,你的配置应该是这样的:

      name: put-your-site-name-here
      recipe: lemp
      config:
        php: '7.1'        # optional; defaults to the latest version
        webroot: web      # optional; defaults to the same directory as this file
        database: mariadb # technically optional but you did say you wanted this
        xdebug: true      # optional
        conf:             # optional; specify your own configs for nginx and/or php as follows
          server: my-config-path/nginx.conf
          php: my-config-path/php.ini
      

      就是这样!将其转储到 .lando.yml 文件中,运行 lando start,您很快就会拥有一个正在运行的应用程序。

      目前最新的 Beta 版是最稳定的版本,但无需担心。我每天在工作中使用它。 Download it from GitHub.

      【讨论】:

      • 感谢您的回答,我希望这个可以解决我的问题,lando 看起来很棒,但它是第 3 方应用程序,您不知道它会存在多久,并且使用另一个库,您可以简单地投入更多时间来学习 docker,除此之外,我还使用 Windows 10,所以这个解决方案不适合我。
      • 第 3 方应用程序如果可以帮助您实现目标,那就没什么好怕的了。此外,如果您已经在 Windows 10 上使用 Docker,它可能会起作用。这仅取决于 Docker 的安装方式。使用纯 Docker 不仅仅是学习它所花费的时间——它还涉及使用它所花费的时间。这就是兰多加快速度的地方。
      【解决方案4】:

      Docker 容器被设计为在其中运行单个服务,而不是一个完整的虚拟系统(您可能会看到虚拟机和虚拟机)。

      这意味着理想情况下,您希望每个容器都有一个容器:

      • Nginx
      • PHP
      • Mariadb

      此外,Centos docker 映像被设计为其他人继承或执行操作系统特定任务(例如 cURL 调用或 shell)的基础,而这并不是您真正需要的。

      我会建议您使用 docker-compose,它可以让您轻松设置中间容器,并将它们作为一个项目进行管理。

      我会推荐一个docker-compose.yml 文件设置:

      version: '3'
      services:
        web:
          image: nginx:latest
          ports:
            - "80:80"
          volumes:
            - ./src:/(nginx config root folder)
            - ./config/site.conf:/etc/nginx/conf.d/site.conf
          links:
            - php
            - mariadb
      
        php:
            image: php:7-fpm
        mariadb:
            image: mariadb
            restart: always
            environment:
              MYSQL_ROOT_PASSWORD: example
      

      然后,您的项目文件夹中有一个 /config/ 文件夹,您需要一个用于 nginx 设置的 site.conf 文件。

      您的项目文件夹中还需要一个/src/ 文件夹,其中包含您项目的所有php/web 代码。

      docker-compose.yml 文件中的卷安装将为您将它们加载到容器中。卷挂载通过映射host folder path:container folder path 来工作,当其中一个发生更改时,它会在另一个中更新,几乎就像复制/粘贴一样。请记住,您可能需要更新文件权限。

      对于 Mariadb,您可以添加另一个 volume 以将容器中的数据文件映射到您的主机文件夹。此外,您可以打开 mysql 端口,以便使用 mysql workbench 之类的工具来查询数据库,方法是为端口 3306 添加 ports 部分,如 web 部分所示。 mysql_root_password 的值将设置 root 用户密码。

      您可以从项目目录中使用命令docker-compose up 启动它。

      当您需要手动重启 nginx(或其他服务)时,您将停止并启动容器。您可以使用以下命令执行此操作:

      • docker-compose up - 启动容器
      • docker-compose down - 停止容器

      如果您希望将正在运行的容器发送到后台(这样它就不会占用终端窗口),您可以使用:docker-compose up -d

      如果您有任何问题或不清楚的地方,请告诉我,我很乐意更新我的答案!

      【讨论】:

      • 感谢您的回答。实际上,我会为此付出 200 美元的赏金,因为我已经有 2 周无法处理我的项目来进行完美的设置了。我听说过 docker compose,但不知道它是我的解决方案。你能扩大你的答案吗?比如如何共享文件夹 b/n docker 和 windows,以及如何访问 bash 以便我可以重新启动/停止 php、nginx mariadb 或进行数据库转储?或构建图像?我不知道 docker compose 是如何做到的,但是一旦我的设置在本地工作,我需要将我的项目也上传到产品上。如果你愿意,你可以等待赏金来扩展你的答案
      • 我并不关心赏金时间,我关心的是提供有用的、有帮助的答案。我将更新我的答案以扩展 volumes 如何来回共享文件,我将详细说明用于启动/停止的 docker compose 命令以及一些有用的数据库技巧/提示!
      • 谢谢兄弟,我迫不及待想试试
      • 嘿,我之前发布了一个错误,但我找到了解决方法。反正有访问日志吗?像 nginx、php 或 mariadb 错误/访问日志?如果不退出 docker,我就无法进入虚拟机,如果您能添加一种方法来在生产服务器上复制我的设置,我将不胜感激。我只是上传 docker-compose 文件并运行相同的命令,还是需要创建图像并将图像上传到我的 VPS?
      • 本文档是最佳实践(以及部署到生产环境)的参考:docs.docker.com/develop/dev-best-practices 如果您运行容器并将其发送到后台docker-compose up -d,您可以在容器中得到一个 shell,只要因为它正在运行:docker exec -it (container_name) /bin/bash,您也可以使用命令:docker logs 查看该容器正在写入的日志。
      猜你喜欢
      • 2020-03-28
      • 1970-01-01
      • 2021-04-02
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多