laradock問題:curl: (7) Failed to connect to port 80

現在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容器內部

<code>docker-compose exec php-fpm bash/<code>

ping b.com結果

laradock問題:curl: (7) Failed to connect to port 80

直接ping b.com,其ip盡然是127.0.0.1。這很明顯是不正確的。


laradock問題:curl: (7) Failed to connect to port 80

php-fpm容器中80端口並沒有被程序啟用。所以返回連接被拒絕。

現在可以確定,curl請求的b.com,ip綁定有誤,那我們只需要綁定域名到nginx容器ip即可。

我先說下解決辦法。然後分析下原理。

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

laradock問題:curl: (7) Failed to connect to port 80

修改networks的配置為紅框中的格式。

停止nginx,重新構建並重啟

<code>docker-compose stop nginx
docker-compose build --no-cache nginx
docker-compose up -d nginx/<code>

現在再去執行curl請求。服務已經通了。問題解決。

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

laradock問題:curl: (7) Failed to connect to port 80

下面我們來分析下幾個問題點。

1,為什麼一開始php-fpm中訪問會是127.0.0.1?

我們簡單回顧下docker的網絡原理。

首先查看一下docker目前網絡配置。

<code>docker network ls/<code>


laradock問題:curl: (7) Failed to connect to port 80

紅框中為laradock定義網絡

它們可以理解為:網卡,實現容器間的網絡通信。laradock,定義了frontend和backend,實現了兩個網絡的隔離。

laradock問題:curl: (7) Failed to connect to port 80

docker-compose.yml配置

我們查看下laradock_backend,laradock_frontend的詳細信息

<code>docker network inspect laradock_frontend
docker network inspect laradock_backend/<code>

查看結果

<code>[
{
"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"
}
}
]
/<code>
<code>[
{
"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"
}
}
]
/<code>

定義完成網卡後,我們的容器就需要和網卡關聯。實現網絡互通。

laradock問題:curl: (7) Failed to connect to port 80

容器配置中指定網卡實現網絡關聯。

laradock問題:curl: (7) Failed to connect to port 80

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

所以php-fpm和nginx是在同一個網絡的,訪問對應域名是可以找到的,但是其ip為127.0.0.1。

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

官方解釋:aliases是定義容器主機名稱的別名,其他在同一網絡的容器,可以使用服務名或者別名來連接對應容器的服務。

也就是,我們將域名定義為當前容器的主機別名。然後通過訪問域名就可以訪問對應的容器了。




還有一種修改方式是:在php-fpm中配置域名綁定。但是這個有個問題是,其他需要的容器也需要配置。不如別名配置一處即可。

laradock問題:curl: (7) Failed to connect to port 80


以上是這個問題,我查找解決的流程。整個原理很簡單。但是docker的細節還是比較多的。還是需要細緻的研究。




感謝你的閱讀,如有問題,也歡迎指正。

一個golanger/phper。一個創業的碼農。


分享到:


相關文章: