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

时间:2018-09-27 15:50:30

标签: php mysql docker nginx mariadb

我正试图从使用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的容器中……我迷路了关于如何制作

4 个答案:

答案 0 :(得分:8)

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/文件夹,您需要一个site.conf文件来进行nginx设置。

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

docker-compose.yml文件中装载的卷将为您将那些装载到容器中。卷装载通过映射host folder pathcontainer folder path来工作,当其中一项发生变化时,它在另一项中发生更新,就好像复制/粘贴一样。请记住,您可能需要更新文件权限。

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

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

当您需要手动重新启动nginx(或其他服务)时,您将停止并启动容器。您可以使用以下命令来做到这一点:

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

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

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

答案 1 :(得分:8)

您可以使用我的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 conf,则应重建图像

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

上访问它了

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

在部署到生产环境时,别忘了保留文件权限

答案 2 :(得分:3)

Docker-compose很好,但不是最容易使用的。您应该真正研究Lando,因为它可以使开发环境绝对成立。基本上,这是Docker上的可用性层,并且肯定很光滑。

在进一步介绍之前,我确实需要提到Lando不适用于Windows 10 Home,因为Windows版本的Docker使用Hyper-V,而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.

答案 3 :(得分:0)

这里有一些答案建议两个非常准确的内容:

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

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

假设您要通过个人资料设置WordPress服务器,则可以使用诸如Roots Trellis之类的选项来支持PHP Composer,或者EasyEngine v4也已经集成了Docker。

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

您提到过分依赖过多的第三方应用程序,因此这些应用程序会删除那些应用程序。