当前位置: 首页 > news >正文

【疑难杂症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&#xf…...

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构,它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是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(四)

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

2024.9最新:CUDA安装,pytorch库安装

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

Vue3.0组合式API:setup()函数

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

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)

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

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 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…...

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器&#xff08;Google Chrome&#xff09;在macOS上拥有一系列强大而隐蔽的特性&#xff0c;这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率&#xff0c;这些被低估的功能等待着被发掘。我们将逐步探索这些功能&#xff0c;帮助您最大化利用谷歌浏览…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

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&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...