使用 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的主要内容,如果未能解决你的问题,请参考以下文章
如何设置PhpStorm以便Docker Compose Interpreter可以使用PHP可执行文件?