文件里的图片都是后截图的,所以只能看看命令效果了,没法复现当时的场景。

本人对docker不是很熟,大佬得看且看,勿喷!

背景

        开发的产品用的知识库是Milvus,运维用Docker部署。运行了一段时间,今天开发环境反应知识库查询有问题。看了日志发现是因为Milvus数据库挂了,然后定位是因为磁盘被写满了。去看了一下docker的容器目录发现milvus容器的日志文件几十个G,肯定是这个引起的了。进一步发现是因为这个容器没有log相关的配置,后续配置了log修复了该问题。

问题定位

查看容器状态

  • 先使用docker ps -a 列出所有的容器

        发现milvus-standalone容器的STATUS不是healthy

  • 使用docker stop [容器ID]停止该容器
  • 使用docker start [容器ID]启动该容器
  • 继续使用docker ps -a 列出容器信息
  • 结果发现还是启动失败
  • 使用docker inspect [容器ID]查看容器的State状态(其实这步没必要,但是还是想看看详细情况)

查看容器日志

  • 去这个容器的日志目录看看日志
  • 使用 docker inspect [容器ID] | grep "LogPath"。其实就是inspect命令进行了关键字过滤,大部分信息用这个命令都可以看到。

  • 准备把log文件下载下来的,结果一看大小,好家伙几十个G,然后就知道问题大概是这个原因了。

问题修复

临时修复

  • 用df -h发现对应的磁盘果然就满了
  • log日志太大,懒得看了,就用echo -n > [文件]命令把日志清空了
  • 然后重启容器发现好了

准备彻底修复

        到这已经可以用了,但是不行啊,去看了一下log文件的写入内容,发现大部分都是log,而且写入速度过快,一会就几十个MB。看了一下都是和etcd的通讯信息。但是此时也疑惑呀,docker的容器可以把日志分文件和限制总大小的,为啥这个没生效。用inspect命令一下,好家伙果然这个容器的log配置是空的啊,所以没限制。而且这个docker部署的时候也没有默认的日志限制,所以还是加上吧。

给容器增加log输出限制

Docker的LogcConfi配置主要配置两个参数max-file最大的log文件数量,max-size单个log文件的最大空间

  • 使用docker stop [容器ID]停止该容器
  • 使用docker update --log-driver json-file --log-opt max-size=100m --log-opt max-file=3 [容器ID]给容器更新一下log配置
  • 使用docker start [容器ID]启动该容器

        到这里就可以了,但是我当时用的重建容器来修复这个问题,所以引发了一系列的问题,不过也学到了很多关于docker的使用知识。

重建docker容器(查看数据挂载,重配置milvus网络)

        造孽,当时脑子一抽,就选了删除容器再搞,导致多搞了很多东西,还好是开发环境。不过也学到了很多。

查看原始容器的数据目录

  • 由于是数据库,所以要看一下milvus的数据目录在不在容器里,别把数据给删了,那就完蛋了
  • 使用docker inspect [容器ID] | grep -A 20 "Mounts"可以看到数据挂载在主机的目录位置,如果有内容证明数据目录已经挂载在主机目录了,所以可以大胆删容器了。如果没有的话数据目录应该在容器里,没挂载出来,一定要挂载出来!!!或者备份数据

重建容器

  • 使用docker stop milvus-standalone && docker rm milvus-standalone删除并重建容器
  • 使用下面的命令重建容器(使用的时候记得把值替换成自己服务器上的,我这个是默认的一般可用,除了数据挂载目录要特殊看一下)
docker run -d \
  --name milvus-standalone \
  --restart=unless-stopped \
  -v /opt/milvus/volumes/milvus:/var/lib/milvus \
  -p 9091:9091 \
  -p 19530:19530 \
  -e ETCD_ENDPOINTS=etcd:2379 \
  -e MINIO_ADDRESS=minio:9000 \
  -e PATH=/milvus/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
  -e LD_LIBRARY_PATH=/milvus/lib::/usr/lib \
  -e LD_PRELOAD=/milvus/lib/:/milvus/lib/libjemalloc.so \
  -e MALLOC_CONF=background_thread:true \
  --log-driver json-file \
  --log-opt max-size=100m \
  --log-opt max-file=5 \
  --log-opt tag="milvus" \
  milvusdb/milvus:v2.5.2 \
  milvus run standalone
  • -v /opt/milvus/volumes/milvus:/var/lib/milvus是重新挂载数据目录,保证容器创建完数据还在
  • -p 9091:9091 -p 19530:19530 是映射容器内的端口号到主机对应端口上
  • -e ETCD_ENDPOINTS=etcd:2379 -e MINIO_ADDRESS=minio:9000是配置网络地址环境变量,在milvus内部使用ETCD_ENDPOINTS访问etcd服务,MINIO_ADDRESS服务minio服务
  • --log就是新增加log配置信息,放置日志再次把磁盘写爆
  • 然后启动容器发现还是不行

配置milvus-standalone到milvus网络

  • 启动发现还是报错,就去看日志,发现是因为milvus访问不了etcd和minio。所以肯定是网络配置问题
  • 使用docker network ls查看docker的网络列表

  • 发现有个milvus的网络
  • 然后使用docker network inspect [网络ID]查看网络详情的Containers属性,发现没有milvus-standalone的容器
  • 使用docker network connect [网络ID] [容器ID]把容器加入到网络里面去
  • 使用docker restart [容器ID]重新启动该容器

更多推荐