一、关于到docker的安装文件位置
一般来说docker
的安装后的文件一般都在以下几个目录(安装的没有指定安装目录,使用默认安装路径):
1. /var/lib/docker
:这个目录下存放的是docker运行起来后,生成的images(镜像)
、container(容器)
、Local Volumes(本地卷)
、log(日志)
、plugins(插件)
等信息。
2. /etc/docker
:这个目录下存放的是docker的配置文件,一般会有了两个文件,key.json
和daemon.json
两个文件。注意:这个deamon.json文件默认是不存在的,修改参数时需要自己手动创建。
-
key.json
:docker
启动时由引擎自动生成,它是docker
在连接到其他TLS服务器(如注册表)时使用的web格式的TLS连接
的dockerd密钥
。 -
daemon.json
:它是docker
的配置管理文件,它几乎涵盖了所有docker命令行启动可以配置的参数。例如:咱们增加docker的私服的时候,就需要改这个文件。
其参数详解:deamon官方详解(注意这是英文版本的),daemon.json详解-个人博客注释版本
关于
key.json
的官方描述:官方文档 This is the dockerd key for TLS connections. in web format, that docker uses when connecting to other TLS servers like registries. It’s automatically generated by the docker engine on startup, so there’s no risk if deleted. You should treat it as sensitive since TLS connections using an exposed key are not secure.
=======================
这是TLS连接的dockerd密钥。docker在连接到其他TLS服务器(如注册表)时使用的web格式。它是由docker引擎在启动时自动生成的,因此删除它没有风险。您应该将其视为敏感的,因为使用公开密钥的TLS连接是不安全的。
3. /bin/docker*
:bin目录下关于docker开头的文件,这些都是docker的命令文件。
4. /run/docker
:这个目录下存放的是,正在运行的docker的容器、网路等信息。注意:镜像信息不存这个目录
5. /usr/lib/systemd/system/docker*
:即/usr/lib/systemd/system/
下的关于docker
的文件——docker.service
,docker.socket
,这两个是docker的环境变量配置文件。docker启动的时候,会从这两个文件中读取启动参数。
咱们修改配置文件不生效或者是冲突报错了,多是和这两个文件的配置冲突了。
二、关于docker的清理
注意:这不是docker的删除操作,而是,清理docker运行中产生的日志文件以及无用的文件。
docker在运行中总是产生很多垃圾文件。这些文件不清理会逐渐侵占磁盘空间,到是服务器的磁盘空间无法使用。
1、举个例子:我上次碰到一个rocketmq的问题:
1.1、问题描述:
com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 14 DESC: service not available now, maybe d isk full, CL: 0.92 CQ: 0.92 INDEX: 0.92, maybe your broker machine memory too small.
1.2、问题原因
# 查看磁盘空间
df -h
发现Filessystem
项中关于overlay
项中,关于docker
的卷信息已经占内存的92%了。这就导致了rocketmq
写入topic
的时候,磁盘检测的部分报错。
rocketmq是可以通过修改broker配置文件,来指定磁盘使用阀值。
超过阀值之后,就拒绝发送信息,且会报错,具体的错误提示就是上面代码中的错误信息。
配置信息:diskMaxUsedSpaceRatio=92
1.3、问题解决
1.3.1、清除历史容器(即相同服务已经停用的容器)
在服务迭代中,我们会尽量保留不同版本的服务,这样万一发版或线上出现大的漏洞,容易回退版本。这就导致了,出现了一个服务有很多不同迭代版本的容器。
docker container prune:删除无用的容器。
注意:这个会将所有的stopped状态的容器,都删除掉。
建议还是一个一个的删除,避免最近的版本的都被删除了。
或者是这个命令增加[--filter]参数来筛选出不希望被清理掉的容器。
例如:
#清除掉所有停掉的容器,但24内创建的除外
docker container prune --filter "until=24h"
另外还有,dead状态的,Exited状态的容器
或 删除所有已退出的容器:
docker rm -v $(docker ps -aq -f status=exited)
或 删除所有状态为dead的容器
docker rm -v $(docker ps -aq -f status=dead)
发现:操作完之后,发现空间还是92%。我们的版本控制的挺好的。
1.3.2、清除无用的镜像(即相同服务已经停用的容器)
最最体现版本迭代的就是镜像了。之所以先删除镜像,是因为只要还有容器在使用这个镜像,这个镜像就删除不掉。
docker image prune:删除悬空的镜像。
还是建议一个一个的删除。
或 删除所有悬空镜像,不删除未使用镜像:
docker rmi $(docker images -f "dangling=true" -q)
或 删除所有未使用镜像和悬空镜像
docker rmi $(docker images -q)
发现:操作完之后,发现空间降得不多。
1.3.3 清楚无用的网络以及卷
docker volume prune:删除无用的卷。
docker network prune:删除无用的网络
删除所有未被容器引用的卷:
docker volume rm $(docker volume ls -qf dangling=true)
发现:操作完之后,空间降下来了,但是89%随时会被填满,mq报错,服务无法访问,服务器处于岌岌可危的。当初服务初建的时候,磁盘空间占用率只有76%,离当初还差的远呢。所以必须继续清理空间。
1.3.4 清除日志文件
1、删除自己服务运行时定义的日志文件路径
2、删除docker的日志文件:/var/lib/docker/log
。后来发现这个文件本来就没多大。
1.3.5 清除卷中的大文件
后来查看/var/lib/docker/overlay2
下的卷信息还是挺多。。。那肯定是卷里面的文件太大导致的。
使用如下命令:
find /var/lib/docker/overlay2/ -type f -size +100M -print0 | xargs -0 du -h | sort -nr
发现:这卷里面除了jar包,就是log文件。而且log文件特大,还分日期。。。这肯定是程序运行久了,没有定义日志文件大小,导致日志文件一直堆积,都快把空间沾满了。
经过排查,大多数都是nacos
的日志以及rocketmq
的日志。停止并且删掉nacos
和rocketmq
的容器,新建一个容器,就可以了。毕竟,镜像配置文件都是现成的。
但是注意有的时候,是不能停服务的,这个时候就需要大家手动清除容器中的日志文件。
使用echo "" > 文件路径。即可清空文件,注意,清空不是删除。正在运行的容器是不允许删除的。
为了防止这种情况再次出现,可以通过修改配置文件/etc/docker/daemon.json
,来指定log文件的数量和大小。
vim /etc/docker/daemon.json
{
"log-driver":"json-file",
"log-opts": {"max-size":"3m", "max-file":"1"}
}
官方文档给与的示例: