网站首页 > 技术文章 正文
现在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。一个创业的码农。
欢迎关注,别的不说,交个朋友。
猜你喜欢
- 2024-10-23 微软发布6月Win11累积更新KB5039212/KB5039213
- 2024-10-23 快速体验之《gor+diffy实现线上流量复制到测试环境》
- 2024-10-23 Colbie Caillat: Try(colbiecaillattry歌词)
- 2024-10-23 基于阿里云 ASK 的 Istio 微服务应用部署初探
- 2024-10-23 浅谈ElasticSearch 集群部署(elastic集群配置)
- 2024-10-23 Python项目中跟踪系统导入Zipkin(基于python的目标跟踪算法)
- 2024-10-23 JVM参数及调优(jvm调优常用参数)
- 2024-10-23 Elasticsearch的路由routing的应用技巧
- 2024-10-23 如何将Elasticsearch的快照备份至OSS
- 2024-10-23 利用工具curl来查看http请求和https请求
- 11-27echarts图形报表的入门案例
- 11-27Echarts仿电梯运行图
- 11-27微信小程序开发之wepy 引入echarts统计图方法 亲测可用
- 11-27yarn安装echarts教程
- 11-27微信小程序使用 ECharts
- 11-274、echarts 如何画图?(必会)
- 11-27JavaScript 前端数据可视化——ECharts.js
- 11-27vue+echarts使用
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)