Docker 学习笔记(四):Bug 日志与其他零散知识

一、Docker-Compose 容器组开机重启失败

Docker-Compose 的 depends_on 参数在 docker 中没有对应。

重启电脑后,容器的重启过程只由 docker 控制,而 docker 不会依据 depends_on 的顺序启动容器,这导致容器组可能重启失败。

目前的解决办法是使用 systemd 或者 supervisor,在开机时运行 docker-compose up 命令。

二、Docker 空间清理

在使用固定的构建节点构建 Docker 镜像时,正常情况下会在构建完成后自动清理掉生成的镜像,但是如果构建流程出现问题,就有可能导致镜像没有被清理。

最方便的方法是在构建完成后,使用命令 docker system prune --all --force 清理掉所有没有被使用的镜像、容器、网络、数据卷,不能在构建完成后直接使用前面的命令清理完全清理,因为这可能会清理掉别的构建任务的中间镜像!!!导致 push 的时候找不到包,或者构建下一步时,发现中间容器被删除了。。

更好的方法是使用定时任务(crontab 或者 jenkins triggler)在每天晚上没有 docker 构建任务运行时,再跑 docker system prune --all --force

Docker 容器日志占满存储空间

部署了 ELK 系统抓 MySQL 数据,结果过了一天,50G 空间就满了,而 ES 本身的数据才 200M 不到。

使用 du -h <目录> --max_depth 1 逐级排查,发现罪魁祸首是 /var/lib/docker/containers 文件夹。这里面的 <container-id>/<container-id>-json.log (container id 是对应的容器 id)把磁盘用光了。

Google /var/lib/docker/containers 占用空间 了解到,这些 log 文件就是对应容器的日志,docker logs <container_id> 日志一大堆。

解决方法

首先 echo "" > xxx-json.log 临时清理掉这些日志。永久解决办法如下:

方法一:使用 docker-compose.yml(只针对特定 service)

version: '2'

services:

  elasticsearch:
    ...
    logging:  # 限制容器服务的日志大小,否则 docker logs 会占满磁盘空间
      options:
        max-size: "10m"
        max-file: "1"
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    ports:
      - "9200:9200"
      - "9300:9300"

方法二:全局修改

修改 /etc/docker/daemon.json,添加如下内容:

{
    ...... // 省略若干配置
  "log-driver":"json-file",
  "log-opts": {"max-size":"10m", "max-file":"3"}
}

三、查看 DOcker 容器的连接数

docker inspect -f '{{.State.Pid}}' <containerid>  # 查找到容器的 pid
sudo nsenter -t <pid> -n netstat | grep ESTABLISHED  # 通过 pid 检索所有连接
posted @ 2019-10-19 13:21  於清樂  阅读(443)  评论(0编辑  收藏  举报