【疑难杂症2024-005】docker-compose中设置容器的ip为固定ip后,服务无法启动
本文由Markdown语法编辑器编辑完成。
1.背景:
我们的产品是通过docker image的方式发布,并且编排在docker-compose.yml中发布。在同一个docker-compose.yml中的服务,相互之间,可以通过对方的服务名和端口,来直接访问,而无需知道对方服务的ip地址,这样对于接口的url的拼接和识别,带来了很大的好处。
然而,当我们的产品,近期在某一家医院上线后,却发现了之前未曾遇到的问题,就是同一个docker-compose.yml中的服务,使用服务名进行访问时,无法访问,导致很多依赖接口的功能无法正常使用。
具体的微服务架构大致如下:
fluent服务,会持续地从/var/lib/docker/containers目录下,读取里面的所有容器的docker日志。每一个容器,会有一个hashid. 这个日志文件的名称,就是以这个服务的hash id命名的。fluent采集到各个容器的json格式的日志后,经过一定的筛选,将符合要求的日志,通过cycle提供的接口,通知给cycle服务;
cycle服务, 将日志转化成dict的形式,存到mongo db数据库中。每一条记录,都会包含患者和检查的一些信息。
当前端需要查看某个患者或某个检查的处理记录时,cycle服务从mongo-db中读取出记录,并按照时间顺序,将它们组成一颗树,展示给运维人员。
异常情况发生:
这套服务,在公司的测试环境,和其他医院,都可以正常的工作。但是,在这家医院,前端根据患者ID查询时,却无法正常展示。通过查看fluent服务和cycle服务的日志。
cycle服务,没有出现异常的日志;而fluent服务,则一直在刷warn和error的日志。我对照公司的测试环境,fluent服务,运行时是没有出现这样的warn和error日志的。异常的日志如下图所示:
它提示无法连接到cycle服务。因此,即使它搜集到了日志信息,但无法将日志信息,通知给cycle服务。大概的报错日志和原因如下:
其中比较关键的错误信息如下:
[error] no upstream connection available to xxxx:1000x
[warn] [engine] failed to flush chunk xxx, retry in 7 seconds...
[warn] [net] getaddrinfo(host='xxxx', err=12):Timeout while contacting DNS servers
......
通过查询引起该问题的可能原因,大致的回答如下:
from kimi chat:这段错误信息是来自一个网络服务或应用程序的日志,通常出现在尝试连接到某个服务或主机时遇到问题。具体来说,"getaddrinfo(host='xxxx', err=12):Timeout while contacting DNS servers" 表示在尝试解析主机名 'xxxx' 时,DNS 查询超时了。这通常意味着应用程序无法在预定的时间内从DNS服务器获取到所需的IP地址信息。- `getaddrinfo` 是一个网络函数,用于根据主机名获取其IP地址。
- `host='xxxx'` 表示正在尝试解析的主机名。
- `err=12` 是错误代码,通常与超时有关。
- "Timeout while contacting DNS servers" 明确指出了问题:在尝试联系DNS服务器时发生了超时。这种情况可能是由于网络连接问题、DNS服务器不可用或响应过慢等原因造成的。解决这类问题通常需要检查网络连接,确认DNS服务器的可用性,或者尝试更换DNS服务器。
分析后,大概原因是,容器间通过服务名访问时,docker在底层会做一个DNS的解析,也就是将服务的名称,解析出服务的真实ip. 因为在docker-compose.yml中,每一个服务,都一定会被分配一个ip.
网络请求,最终其实还是通过ip:port/interface_url来完成的。
那么在确认了其他没有问题的情况下,归结的原因大概是DNS解析过慢,造成无法及时解析出IP,导致连接超时了。
既然是因为DNS解析的速度,那么我们就希望能够绕过这个DNS的解析环节。那要跳过DNS解析,只有事先知道对方服务的ip和端口才可以。
因此,解决问题的思路和方案大致如下:
1> 为cycle服务,在docker-compose中,指定一个固定ip地址;
2> fluent服务,请求cycle服务时,按照cycle那里固定的ip,进行访问,不再通过服务名访问了。
2.问题解决:
找到解决方案后,接下来便是在docker-compose.yml里面,给相应的docker容器,赋予特定的ip了。
也就是,给cycle服务,一个特定的服务ip, 比如8.8.6.140;
而fluent服务,在请求cycle的接口时,直接通过ip:port的方式请求,这样就绕过了DNS解析这步。
2.1 在docker-compose.yml中为服务设置固定ip
通过在devv.ai上面咨询,如何给docker-compose.yml中的服务,设置固定ip, 得到了回复。
结合以上的回答,我将服务的ip设置好后,重新启动服务。结果服务一直处于无法启动的状态。
要不容器的状态是Create, 要不就是Restarting …, 总之就是无法正常的工作。
连续试了好几次都无法成功。
2.2 设置固定ip后,服务启动失败
正当愁眉不展时,咨询了研发部经理。他也感觉到很奇怪,因为修改容器的ip, 并不是什么大不了的事,设置固定ip导致容器无法启动,匪夷所思。
但是, 在启动时,docker是有一个提示的,它提示Alreay in use.
后来,我看经理把ip地址的最后一位设置得大了一些,比如之前我设置得是140。他先是修改成180, 结果还是提示Already in use.
然后又设置成222, 这次再启动,就不提示,可以正常启动了。
3. 复盘:
复盘一下,原来是由于我们的docker-compose.yml中的服务非常多。在docker-compose up -d的时候,docker会给里面的每个服务分配一个ip地址。而我提前设置好的ip地址,被docker自动提前分配给了其他服务。因此,当docker再启动我指定ip的服务时,发现这个ip, 已经被占用了,导致这个服务一直无法正常启动。
其实,我觉得docker可以有一个机制:就是先检测一下,当前的docker-compose.yml中,有没有已经被提前设置过ip的服务。如果有设置了ip地址的,那么这个ip地址,就要预留给这个服务,而不要再分配给其他的未分配ip地址的服务。
这样,可以有效地避免这个问题的发生。
希望以后高版本的docker, 可以优化这个机制。
相关文章:

【疑难杂症2024-005】docker-compose中设置容器的ip为固定ip后,服务无法启动
本文由Markdown语法编辑器编辑完成。 1.背景: 我们的产品是通过docker image的方式发布,并且编排在docker-compose.yml中发布。在同一个docker-compose.yml中的服务,相互之间,可以通过对方的服务名和端口,来直接访问…...

uView使用心得
说实话我不爱用这个库,感觉很鸡肋,坑很多,可能没用习惯 picker选择器 绑定默认值是通过设置index,并且这个index需要通过api设置进去,设置defalutindex绑定值无效(只有初始化可以,后面动态改变…...

RabbitMQ(高阶使用)死信队列
文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 一、什么是死信队列? 二、死信队列使用场景 三、死信队列如何使用 四、打车超时处理 1.打车超时实现 以下是本篇文章正文内容 一、什么是死信队列? 先从概念解释上搞…...
怎么安装docker-compose
使用下列命令下载docker-compose(可选择其他版本) wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 --no-check-certificate然后把该文件移动到/usr/local/bin/并重命名 mv docker-compose-linux-x86_…...

【机器学习】--- 自监督学习
1. 引言 机器学习近年来的发展迅猛,许多领域都在不断产生新的突破。在监督学习和无监督学习之外,自监督学习(Self-Supervised Learning, SSL)作为一种新兴的学习范式,逐渐成为机器学习研究的热门话题之一。自监督学习…...

【Linux修行路】网络套接字编程——UDP
目录 ⛳️推荐 前言 六、Udp Server 端代码 6.1 socket——创建套接字 6.2 bind——将套接字与一个 IP 和端口号进行绑定 6.3 recvfrom——从服务器的套接字里读取数据 6.4 sendto——向指定套接字中发送数据 6.5 绑定 ip 和端口号时的注意事项 6.5.1 云服务器禁止直接…...

哈希表数据结构学习
哈希表数据结构学习 哈希表基本概念哈希方法单值哈希与多值哈希哈希冲突1. 开放寻址法(Open Addressing)2. 链地址法(Chaining)3. 再哈希法(Rehashing)4. 建立公共溢出区(Overflow Area…...

数据结构——“二叉搜索树”
二叉搜索树是一个很重要的数据结构,它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n),最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便,这里采用模版的方式: 一、节点 temp…...
Java零基础-Java对象详解
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...
从Prompt到创造:解锁AI的无限潜能
文章目录 🍊AI内容创作核心:提示词Prompt1 什么是提示词工程?1.1 提示词的原理是什么?1.2 提示词工程师:百万年薪的职业?1.3 谁都能成为提示词工程师吗? 2 提示词书写的基本技巧3 常见的提示词框架3.1 CO-…...

sqlgun靶场攻略
打开界面 1.输入框测试回显点 -1union select 1,2,3#出现回显点 2.查看数据库名 -1union select 1,2,database()# 3.查看表名 -1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasqlgunnews# 4.查看admin表中列名 -1union se…...

《网络协议 - HTTP传输协议及状态码解析》
文章目录 一、HTTP协议结构图二、HTTP状态码解读1xx: 信息响应类2xx: 成功响应类3xx: 重定向类4xx: 客户端错误类5xx: 服务器错误类 一、HTTP协议结构图 二、HTTP状态码解读 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传…...

9.11 QT ( Day 4)
一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…...

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(四)
简介 随着生成式人工智能的兴起,传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求,今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight,利用生成式AI的能力来加速业务决策,从而提高业务生产力。…...

2024.9最新:CUDA安装,pytorch库安装
目录 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 2.安装CUDA 3.检查环境变量是否配置,安装是否成功 二、pytorch库安装 1.pytorch库下载 2.选择合适的版本 3.查看版本 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 在命令提示符里输入nvidia-…...

Vue3.0组合式API:setup()函数
1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能,它是一组附加的、基于函数的 API,可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此,使用组合式 API 可以将组件代码编写为多个函…...

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)
简介 随着生成式人工智能的兴起,传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求,今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight,利用生成式AI的能力来加速业务决策,从而提高业务生产力。…...

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示
目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…...

Qt QSerialPort数据发送和接收DataComm
文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能,包括串口通信参数配置和数据读写,使用 Qt Serial Port 模块就可以…...

macOS上谷歌浏览器的十大隐藏功能
谷歌浏览器(Google Chrome)在macOS上拥有一系列强大而隐蔽的特性,这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率,这些被低估的功能等待着被发掘。我们将逐步探索这些功能,帮助您最大化利用谷歌浏览…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...