一切搭建完成之后
* 解决:找日志看走到了哪一步; 发现 nginx_error.log 下有如下提示
* 2021/02/06 15:09:17 [error] 397136#397136: *57 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 3.2.2.2, server: -, request: "POST /api/goods/info HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "api.localhost.com"
* 大概就是 nginx 通过 fastcgi 协议发给 php-fpm 的时候,给的是宿主机的代码路径 docker 那边找不到脚本代码
* 解决:找日志看走到了哪一步; 发现 nginx_error.log 下有如下提示
* 2021/02/06 10:18:25 [error] 398648#398648: *45 connect() failed (111: Connection refused) while connecting to upstream, client: 3.2.2.2, server: -, request: "POST /api/goods/info HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
* 这个提示就有点困难了 找 php 的错误日志 发现 timeout
* 突然想起 忘记把 mysql 加白名单,PHP 连接过去被 about
* 解决: 找日志看走到了哪一步;为啥没有抛出错误
* 单步调试大法,最终定位
* pdo 连接没加超时参数
* 解决:继续看日志,前面已经把 异常报错调好 这次直接看到 没有 redis 扩展 吐血
* PHP message: PHP Fatal error: Uncaught Error: Class 'Redis' not found in
* 由于宿主机没有 php 环境, 打算去借个 docker 镜像。 结果 没有借到就借了个思路
* 直接进入 docker pecl 安装 redis
* 有点新鲜,还可以这样
···
1. docker 容器中安装 php 扩展
1.1 进入
docker container exec -it f9d065a71599 /bin/bash
1.2 安装 redis 、swoole 扩展
#安装 pecl
wget http://pear.php.net/go-pear.phar -O go-pear.php
php go-pear.php
##回车默认安装
#使用 pcel 命令安装
/usr/local/bin/pecl install redis
/usr/local/bin/pecl install swoole
2. 重启 php-fpm:
ps aux|grep php-fpm
root 42891 0.0 0.1 182796 1220 ? Ss 4 月 18 0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody 42892 0.0 0.6 183000 6516 ? S 4 月 18 0:07 php-fpm: pool www
nobody 42893 0.0 0.6 183000 6508 ? S 4 月 18 0:17 php-fpm: pool www
重启 php-fpm:
kill -USR2 42891
3.备份当前已经改好的实例为镜像
docker commit -a "php-fpm-add-redis222" -m "php-fpm-add-redis222" f9d065a71599 php-fpm-redis2:php-fpm2
···
* 解决: 根据个人猜想 是因为 docker 内部无法访问外网域名
* docker 启动的时候 加个参数指定使用
* --network=host host 模式可以让容器共享宿主机网络栈,这样的好处是外部主 机与容器直接通信,但是容器的网络缺少隔离性
* --add-host=域名:ip 添加外网域名和 IP 对应信息到容器中的 /etc/hosts
1
THESDZ 2021-02-07 10:01:32 +08:00 1
docker 有端口映射的....你这哪里是 bug 啊,是没看文档
|
2
yeept 2021-02-07 10:34:51 +08:00
我记得默认情况 只要宿主机能访问外部网络,docker 默认通过网桥也可以访问外部网络。
|
3
debuggerx 2021-02-07 10:38:38 +08:00
这确实不叫 BUG……
|
4
JaguarJack 2021-02-07 11:23:56 +08:00
这确实是你没好好看 Docker 文档
|
5
qingfengxulai1 2021-02-07 13:38:33 +08:00
这个字体是什么字体?
|
6
poembre OP 确实没看 docker 文档, 平常用 golang 较多,也没怎么实操过 docker 。关于最后一条,我主要是为了加 --add-host 将代码中的外部 api 域名解析到指定机器去。
|