使用 docker 在 CentO 上设置 PHP-FPM、Nginx、Mariadb

Posted

技术标签:

【中文标题】使用 docker 在 CentO 上设置 PHP-FPM、Nginx、Mariadb【英文标题】:Setting up PHP-FPM, Nginx, Mariadb on CentOs using docker 【发布时间】: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 ......我迷路了关于如何做到这一点

【问题讨论】:

Stack Overflow 用于编程问题,而不是关于使用或配置 Linux 及其应用程序的问题。 Server Fault 或 Unix & Linux 将是解决此类问题的更好地方。 【参考方案1】:

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

    每个服务都应该有自己的 Docker 容器(如您所见) 流行的方法包括自定义 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 查看该容器正在写入的日志。

以上是关于使用 docker 在 CentO 上设置 PHP-FPM、Nginx、Mariadb的主要内容,如果未能解决你的问题,请参考以下文章

Docker 常用命令

使用docker 部署python 项目

如何设置PhpStorm以便Docker Compose Interpreter可以使用PHP可执行文件?

Docker PHP-APACHE 容器全局设置 ServerName 指令

docker使用笔记

[Docker] 学习记录