Docker 容器中 PHP 使用 Curl 访问本地服务异常

在 Docker 环境中,将应用程序和服务容器化是常见的做法,但是有时会遇到一些网络通信方面的问题。其中一个常见的问题是 PHP 容器无法使用 Curl 访问本地服务,这可能导致开发和调试过程中的困扰。

问题描述

通常情况下,我们会将 PHP 和 Nginx 这样的服务分别运行在独立的容器中。然而,由于 Docker 网络隔离的特性,PHP 容器可能无法直接访问本地服务,例如运行在宿主机上的 Nginx。

nginx 配置
在这里插入图片描述
php 代码片段

public function mason()
{
    // nft.test 本地域名
    $locationUrl = "http://nft.test/index.php?s=/api/article/index";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $locationUrl);
    curl_setopt($ch, CURLOPT_POSTFIELDS, []);
    if (!empty($headers)) {
        $traceId = $_SERVER['traceId'] ?? "";
        if (!empty($traceId)) {
            $headers['traceId'] = $traceId;
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    if ($result === false) {
        echo "curlPost请求错误, error: " . curl_error($ch);
    }
    curl_close($ch);
    var_dump($result);
}

请求结果
在这里插入图片描述

探索解决方案

面对这个问题,我们需要一种有效的解决方案,以确保 PHP 容器能够正常访问本地服务。一种简单且实用的方法是让 PHP 容器直接与 Nginx 容器通信,而不是通过宿主机的本地域名。

解决方案

我们可以通过以下步骤来解决这个问题:

  1. 确定 Nginx 容器的 IP 地址: 首先,我们需要确定 Nginx 容器的 IP 地址。可以使用 Docker 命令来查找 Nginx 容器的 IP。
 >>> docker inspect nginx | grep "IPAddress"
 >>> "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.25.0.4",
  1. 修改 PHP 容器的 hosts 文件: 然后,我们在 PHP 容器中修改 hosts 文件,将本地域名指向 Nginx 容器的 IP 地址。
>>> docker exec -it php容器地址 bash
>>> sh -c 'echo "172.25.0.4 nft.test" >> /etc/hosts'
  1. 重新测试 Curl 请求: 最后,我们重新测试 PHP 容器中的 Curl 请求,确认是否能够成功访问本地服务。

在这里插入图片描述

结论

通过这种简单而有效的方法,我们成功解决了 Docker 容器中 PHP 使用 Curl 访问本地服务异常的问题。这种解决方案不仅简单易行,而且避免了网络隔离带来的通信问题,确保了应用程序的正常运行和开发过程的顺利进行。

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 17:50:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 17:50:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 17:50:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 17:50:04       20 阅读

热门阅读

  1. postman---认证(Certificates)是什么作用?

    2024-05-11 17:50:04       12 阅读
  2. git命令详解+使用样例

    2024-05-11 17:50:04       18 阅读
  3. 代码随想录训练营Day29:动态规划1

    2024-05-11 17:50:04       16 阅读
  4. 高德地图定位点缩放偏移问题

    2024-05-11 17:50:04       14 阅读
  5. 安卓实现连接wesokcet

    2024-05-11 17:50:04       16 阅读
  6. 类和对象的关系

    2024-05-11 17:50:04       14 阅读
  7. Mvcc 如何解决脏读、不可重复读问题

    2024-05-11 17:50:04       11 阅读
  8. 服务器白名单

    2024-05-11 17:50:04       12 阅读
  9. FFmpeg 中 -f 命令参数详解

    2024-05-11 17:50:04       11 阅读
  10. linux的firmware和hal层

    2024-05-11 17:50:04       9 阅读