Docker快速搭建PHP+Nginx+Mysql环境及踩坑

2023-12-01 0 906
目录
  • 准备
    • 创建目录
  • 配置PHP
    • 拉取php-fpm镜像
    • 启动php-fpm
  • 配置Nginx
    • 拉取Nginx镜像
    • 配置nginx.conf
    • 启动Nginx
  • 配置MySQL
    • 拉取MySQL镜像
    • 启动MySQL
  • 常见问题
    • 1、thinkphp报错 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
    • 2、thinkphp 报错 STORAGE_WRITE_ERROR:./Application/Runtime/Cache/Home/4e64ea6a2012f26b832b14cbc2152b28.php
    • 3、thinkphp验证码图片显示不出来

准备

创建目录

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

Docker快速搭建PHP+Nginx+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=<DIR>If configure fails try –with-jpeg-dir=<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

Docker快速搭建PHP+Nginx+Mysql环境及踩坑

phpinfo中显示gd库

Docker快速搭建PHP+Nginx+Mysql环境及踩坑

注意如果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环境及踩坑 的文章就介绍到这了,更多相关Docker搭建PHP Nginx Mysq内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Linux服务器 Docker快速搭建PHP+Nginx+Mysql环境及踩坑 https://www.u-9.cn/server/linux/1821.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务