Docker如何快速搭建PHP+Nginx+Mysql环境

发布时间 - 2023-05-14 00:00:00    点击率:

准备

创建目录

mkdir -p /Users/mwqnice/Documents/Program/phpProgram &&
mkdir -p /Users/mwqnice/Documents/Program/docker/php/php7.1.33/conf &&
mkdir -p /Users/mwqnice/Documents/Program/docker/php/php7.1.33/logs &&
mkdir -p /Users/mwqnice/Documents/Program/docker/nginx/conf.d &&
mkdir -p /Users/mwqnice/Documents/Program/docker/mysql/conf &&
mkdir -p /Users/mwqnice/Documents/Program/docker/mysql/logs &&
mkdir -p /Users/mwqnice/Documents/Program/docker/mysql/data &&
cd /Users/mwqnice/Documents/Program/docker/nginx/conf.d && sudo touch default.conf

配置PHP

拉取php-fpm镜像

docker pull php:7.1.33-fpm #版本7.1.33

启动php-fpm

docker run --name  mwq-php \
-v /Users/mwqnice/Documents/Program/phpProgram:/var/www/html \
-v /Users/mwqnice/Documents/Program/docker/php/php7.1.33/conf:/usr/local/etc/php \
-v /Users/mwqnice/Documents/Program/docker/php/php7.1.33/logs:/phplogs \
-d --link mwq-php php:7.1.33-fpm

--name mwq-php是容器的名字

/Users/mwqnice/Documents/Program/phpProgram是本地项目目录,/var/www/html是容器内项目存储目录

配置Nginx

拉取Nginx镜像

docker pull nginx:latest //拉取最新版本

配置nginx.conf

server {
    listen  80;
    server_name localhost;
    set $root /var/www/html/localhost;
    
    #access_log  /tmp/nginx/logs/localhost.net.access.log main;
    #error_log  /tmp/nginx/logs/localhost.net.error.log notice;

    location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        root $root;
    }

    location / {
        root $root;
        index  index.php index.html index.htm;
        if ( -f $request_filename) {
            break;
        }
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php/$1 last;
            break;
        }
    }

    location ~ .php(.*)$ {
        root $root;
        set $script $uri;
        set $path_info "";
        if ($uri ~ "^(.+.php)(/.+)") {
            set $script $1;
            set $path_info $2;
        }
        fastcgi_pass mwq-php:9000;
        #fastcgi_index index.php;
        fastcgi_index    index.php?IF_REWRITE=1;
        fastcgi_param    PATH_INFO    $path_info;
        fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param    SCRIPT_NAME    $script;
        include          fastcgi_params;

    }

    location ~ /.ht {
        deny  all;
    }
    location ~ /.svn {
        deny  all;
    }
    location ~ /.git/ {
        deny  all;
    }
    location ~ /Logs/ {
        deny  all;
    }
    location ~ /Logs/.* {
    }
    location ~ /Logs/.* {
        deny  all;
    }
    location ~ .*.(sql|tar.gz|zip|gz|tar|rariso|rpm|apk|bak)$ {
        deny  all;
    }
  
}

启动Nginx

docker run --name mwq-nginx -p 80:80 -d \
-v /Users/mwqnice/Documents/Program/phpProgram:/var/www/html:ro \
-v /Users/mwqnice/Documents/Program/docker/nginx/conf.d:/etc/nginx/conf.d:ro \
--link mwq-php:php \
nginx

配置MySQL

拉取MySQL镜像

docker pull mysql:5.7.36 #版本5.7.36

启动MySQL

docker run -p 3306:3306 --name mwq-mysql \
-v /Users/mwqnice/Documents/Program/docker/mysql/conf:/etc/mysql/conf.d \
-v /Users/mwqnice/Documents/Program/docker/mysql/logs:/logs \
-v /Users/mwqnice/Documents/Program/docker/mysql/data:/mysql_data \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.36
  • -p 3306:3306: 将容器的3306端口映射到主机的3306端口

  • -v /Users/mwqnice/Documents/Program/docker/mysql/conf:/etc/mysql 将主机/Users/mwqnice/Documents/Program/docker/mysql/conf目录挂载到容器的/etc/mysql

  • -e MYSQL_ROOT_PASSWORD=123456: 初始化root用户的密码

  • -d: 后台运行容器,并返回容器ID

常见问题

1、thinkphp报错 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

缺少pdo_mysql扩展,连接数据库失败

找到php.ini,docker中在/usr/local/etc/php中,复制一份php.ini,增加extension=pdo_mysql.so,重启php-fpm,如果还是不行,访问phpinfo页面,查看是否有pdo_mysql

如果没有,说明没有pdo_mysql扩展,需要编译

编译方法如下:

到docker的php容器中,在php文件夹下:

docker-php-ext-install pdo pdo_mysql

如果报 /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent

解决方案:直接在/usr/local/etc/php目录下面新建 conf.d目录和对应的docker-php-ext-pdo_msql.ini文件

其中docker-php-ext-pdo_msql.ini的内容为:

extension=pdo_mysql.so

2、thinkphp 报错 STORAGE_WRITE_ERROR:./Application/Runtime/Cache/Home/4e64ea6a2012f26b832b14cbc2152b28.php

是因为服务器缓存文件夹的操作权限不够,即Runtime没有权限,把缓存文件全部删除,再给Runtime777权限就行了

sudo chmod 777 Runtime 或者直接对代码库最外层设置777权限

3、thinkphp验证码图片显示不出来

缺少gd扩展,安装:

docker-php-ext-install gd

可能以下报错:

If configure fails try --with-webp-dir=If configure fails try --with-jpeg-dir=configure: error: png.h not found.

安装:

apt-get install libpng-dev libjpeg-dev

再次执行:

// 增加freetype配置
docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include --with-jpeg-dir=/usr/include

// 安装
docker-php-ext-install gd

php.ini增加php_gd2.so

phpinfo中显示gd库

注意如果phpinfo的gd库中没有freetype的支持,验证码依然显示不出来, 会报错:

Call to undefined function Think\imagettftext()

如果gd库中没有freeType,则按照以下步骤进行:

docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include

重新编译:

docker-php-ext-install gd

如果报错: configure: error: freetype-config not found. 运行:

apt-get -y install libfreetype6-dev

然后再继续运行上面的命令。gd库中有了freetype,则验证码显示正常了


# docker  # php  # nginx  # mysql  # html  # thinkphp  # if  # try  # Directory  # Error  # GD库  # class  # var  # undefined  # function  # 数据库  # 报错  # 镜像  # 验证码  # 库中  # 是因为  # 不出来  # 如果没有  # 然后再  # 重启  # 最新版本 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  网页设计与网站制作内容,怎样注册网站?  js实现获取鼠标当前的位置  Laravel如何处理文件下载请求?(Response示例)  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  网站建设保证美观性,需要考虑的几点问题!  Swift开发中switch语句值绑定模式  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  高端网站建设与定制开发一站式解决方案 中企动力  Bootstrap整体框架之JavaScript插件架构  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何为API生成Swagger或OpenAPI文档  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何快速搭建高效服务器建站系统?  如何快速生成ASP一键建站模板并优化安全性?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何快速生成高效建站系统源代码?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何使用模型观察者?(Observer代码示例)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Android滚轮选择时间控件使用详解  如何用5美元大硬盘VPS安全高效搭建个人网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何使用查询构建器?(Query Builder高级用法)  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何在云服务器上快速搭建个人网站?  如何在橙子建站上传落地页?操作指南详解  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  JavaScript如何实现继承_有哪些常用方法  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何快速生成可下载的建站源码工具?  Python面向对象测试方法_mock解析【教程】  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何为不同团队 ID 动态生成多个独立按钮  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  ,在苏州找工作,上哪个网站比较好?