优秀的编程知识分享平台

网站首页 > 技术文章 正文

laradock问题:curl: (7) Failed to connect to port 80

nanyue 2024-10-23 12:08:37 技术文章 2 ℃

现在docker的应用已经越来越多,k8s是当下最热门的技术之一。

本地开发使用docker也成为主流。

我本地使用的是laradock作为开发工具。它提供了完善的php开发环境。

github地址:https://github.com/laradock/laradock,需要的同学自行查看。

今天主要讲一个在开发中遇到的问题。

laradock nginx容器中配置了多个server。在a.com通过curl访问b.com的一个接口时,报错。

curl: (7) Failed to connect to b.com port 80: Connection refused

假设服务器IP是172.9.0.44,且没有进程监听端口是80时:

若有TCP连接请求包到达172.9.0.44,则172.9.0.44的内核将回复RST包给客户端。

此时,在客户端一侧看来就是connect连接失败,被服务端拒绝连接。

也就是我们的请求的80端口是不存在的。

下面开始我的排错之旅:

首先要明确一件事情:

php-fpm和nginx位于两个容器中,它们通过开放端口。实现php-fpm和nginx之间通信。

所以php-fpm如果访问b.com。是跨容器访问。下面我们验证下,在php-fpm中发出的curl请求是否符合我们的预期。

1,进入到php-fpm容器内部

docker-compose exec php-fpm bash

ping b.com结果

直接ping b.com,其ip尽然是127.0.0.1。这很明显是不正确的。


php-fpm容器中80端口并没有被程序启用。所以返回连接被拒绝。

现在可以确定,curl请求的b.com,ip绑定有误,那我们只需要绑定域名到nginx容器ip即可。

我先说下解决办法。然后分析下原理。

找到docker-compose.yml下的nginx配置

修改networks的配置为红框中的格式。

停止nginx,重新构建并重启

docker-compose stop nginx
docker-compose build --no-cache nginx
docker-compose up -d nginx

现在再去执行curl请求。服务已经通了。问题解决。

再次在php-fpm中,ping a.com

下面我们来分析下几个问题点。

1,为什么一开始php-fpm中访问会是127.0.0.1?

我们简单回顾下docker的网络原理。

首先查看一下docker目前网络配置。

docker network ls


它们可以理解为:网卡,实现容器间的网络通信。laradock,定义了frontend和backend,实现了两个网络的隔离。

我们查看下laradock_backend,laradock_frontend的详细信息

docker network inspect laradock_frontend
docker network inspect laradock_backend

查看结果

[
    {
        "Name": "laradock_frontend",
        "Id": "5c37d07b66779b455e1fbc556fe51b8ae3e4039b08a9b05b98cdd15a0e6a7245",
        "Created": "2020-04-27T10:22:15.479114733Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "60d0eecce8e0d301771e0a41f655d7c48979212ac4c0b23f93903e29c8b06fcb": {
                "Name": "laradock_nginx_1",
                "EndpointID": "173dc0153204a86a540ecc9656cfba45083f9990197c89cf43c07a478834eeb1",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "c0756add42820acfabc56012a3dc23905493d9e78140ea73dcb2d524d0dc542f": {
                "Name": "laradock_workspace_1",
                "EndpointID": "ba2779d989fed77f7a2b4db7489db682603e2f2337632db00821707e3211e031",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "frontend",
            "com.docker.compose.project": "laradock",
            "com.docker.compose.version": "1.25.4"
        }
    }
]
[
    {
        "Name": "laradock_backend",
        "Id": "ecdd2071acde2627c5d0103212fd6bca56babe7167840a959cc7d1edc611758b",
        "Created": "2020-04-27T10:22:15.519014828Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "60d0eecce8e0d301771e0a41f655d7c48979212ac4c0b23f93903e29c8b06fcb": {
                "Name": "laradock_nginx_1",
                "EndpointID": "ca72cd4bfb8a28d7fee1ada405f8cdb01e78592c54c3f3451ba9858673a53191",
                "MacAddress": "02:42:ac:13:00:07",
                "IPv4Address": "172.19.0.7/16",
                "IPv6Address": ""
            },
            "6229687c2524defd6ca066ede323ae4f490c31dc329db90104e1f0a526cc4672": {
                "Name": "laradock_mysql_1",
                "EndpointID": "8a40f6f113f92def0d5835099ea66ddf2009a9ccc85d1b69f9a3c9258e76a982",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "6714536d3c10df6d27cd51836769174fe16b12d9a92c005e91f92e048012bfc7": {
                "Name": "laradock_php-fpm_1",
                "EndpointID": "988ff565bc5a6dfc919b632646ab2472a29b7bece0b34c139a09869b8e24e63e",
                "MacAddress": "02:42:ac:13:00:06",
                "IPv4Address": "172.19.0.6/16",
                "IPv6Address": ""
            },
            "87d1932f73d814b2361ebcc6ea655132ca2d0062dbc5cc5d5da895be0d15fc5e": {
                "Name": "laradock_docker-in-docker_1",
                "EndpointID": "63d0a515211c785df6e1ef87866de1300fab3ef97dcdb55863d0b0e3cfaa2610",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "8bb067d6e12b27cddb2a7c2f1f328f5b849ef9ec9260f3a18b48d6f8e0b7e0f3": {
                "Name": "laradock_redis_1",
                "EndpointID": "7532fa8f2f4eefb83f7964f66ae8fd799af27932555a1f25b6299768e4d16a39",
                "MacAddress": "02:42:ac:13:00:04",
                "IPv4Address": "172.19.0.4/16",
                "IPv6Address": ""
            },
            "c0756add42820acfabc56012a3dc23905493d9e78140ea73dcb2d524d0dc542f": {
                "Name": "laradock_workspace_1",
                "EndpointID": "b3634cfc49b32e5b9ea22ff5a1897eac833596cb94a64923d00a642f1635b301",
                "MacAddress": "02:42:ac:13:00:05",
                "IPv4Address": "172.19.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "backend",
            "com.docker.compose.project": "laradock",
            "com.docker.compose.version": "1.25.4"
        }
    }
]

定义完成网卡后,我们的容器就需要和网卡关联。实现网络互通。

容器配置中指定网卡实现网络关联。

在容器中,/etc/hosts,添加ip映射。

所以php-fpm和nginx是在同一个网络的,访问对应域名是可以找到的,但是其ip为127.0.0.1。

2,networks aliases配置是什么意思?

官方解释:aliases是定义容器主机名称的别名,其他在同一网络的容器,可以使用服务名或者别名来连接对应容器的服务。

也就是,我们将域名定义为当前容器的主机别名。然后通过访问域名就可以访问对应的容器了。




还有一种修改方式是:在php-fpm中配置域名绑定。但是这个有个问题是,其他需要的容器也需要配置。不如别名配置一处即可。


以上是这个问题,我查找解决的流程。整个原理很简单。但是docker的细节还是比较多的。还是需要细致的研究。




感谢你的阅读,如有问题,也欢迎指正。

一个golanger/phper。一个创业的码农。

欢迎关注,别的不说,交个朋友。

Tags:

最近发表
标签列表