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

准备

创建目录

?
1
2
3
4
5
6
7
8
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镜像

?
1
docker pull php:7.1.33-fpm #版本7.1.33

启动php-fpm

?
1
2
3
4
5
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镜像

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

配置nginx.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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

?
1
2
3
4
5
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镜像

?
1
docker pull mysql:5.7.36 #版本5.7.36

启动MySQL

?
1
2
3
4
5
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文件夹下:

?
1
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的内容为:

?
1
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扩展,安装:

?
1
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.

安装:

?
1
apt-get install libpng-dev libjpeg-dev

再次执行:

?
1
2
3
4
5
// 增加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环境及踩坑-1猿站网-插图

phpinfo中显示gd库

%Docker快速搭建PHP+Nginx+Mysql环境及踩坑-2猿站网-插图

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

Call to undefined function Think\imagettftext()

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

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

重新编译:

?
1
docker-php-ext-install gd

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

?
1
apt-get -y install libfreetype6-dev

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

到此这篇关于Docker快速搭建PHP+Nginx+Mysql环境及踩坑 的文章就介绍到这了,更多相关Docker搭建PHP Nginx Mysq内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7128644507817476127

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

使用docker-compose部署mysql的完整步骤

2023-3-3 17:35:47

建站知识

小知识:什么是ITX机箱 ITX主机机箱是什么意思

2023-3-3 17:40:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索