一切搭建完成之后
* 解决:找日志看走到了哪一步; 发现 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 ![]() 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 akagishigeru 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 域名解析到指定机器去。 |