因为经常需要用到 docker,需要管理存储空间,所以做一下记录。
日志管理
在 Docker 中修改日志大小主要是通过配置 日志驱动 (logging driver) 的选项来实现的。
默认情况下,Docker 容器使用 json-file 日志驱动,它会将日志写入主机的 /var/lib/docker/containers/<container-id>/ 目录中的 JSON 文件。
下面是几种常用的修改日志大小的方式👇
🧩 方法一:在运行容器时设置日志大小限制
当你使用 docker run 启动容器时,可以使用 --log-opt 参数:
docker run -d \
--name myapp \
--log-driver=json-file \
--log-opt max-size=100m \
--log-opt max-file=3 \
nginx
参数说明:
max-size=100m:单个日志文件的最大大小为 100MB。max-file=3:最多保留 3 个轮转日志文件,超过会自动删除最旧的。
日志路径(默认):
/var/lib/docker/containers/<container-id>/<container-id>-json.log
⚙️ 方法二:修改 Docker 守护进程的默认日志配置(全局生效)
-
编辑 Docker 守护进程配置文件:
sudo nano /etc/docker/daemon.json -
添加或修改以下内容:
{ "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } } -
保存并重启 Docker:
sudo systemctl restart docker
⚠️ 注意:修改全局配置后,只对新创建的容器生效,已运行的容器不会自动更新。
🧰 方法三:使用 Docker Compose 修改日志配置
如果你用 docker-compose.yml 管理容器,可以在 logging 部分设置:
services:
web:
image: nginx
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
然后重新部署:
docker compose up -d
🧹 额外:清理已有容器的过大日志
如果日志文件已经过大(例如几个 GB),可以手动清理:
# 清空某个容器日志
truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
🚨 注意:不要直接删除日志文件,否则 Docker 可能出错。应使用
truncate来清空内容。
🧩 修改现有容器日志配置的正确方法
Docker 把每个容器的配置保存在:
/var/lib/docker/containers/<container-id>/hostconfig.json
其中就包括日志驱动及其参数。
🧱 步骤一:停止容器
必须先停止容器,否则 Docker 会在容器运行时覆盖你的修改。
docker stop <container-name-or-id>
📝 步骤二:编辑配置文件
打开容器目录:
cd /var/lib/docker/containers/<container-id>/
sudo nano hostconfig.json
找到类似内容:
"LogConfig": {
"Type": "json-file",
"Config": {}
}
修改为(例如限制 100MB × 3 文件):
"LogConfig": {
"Type": "json-file",
"Config": {
"max-size": "100m",
"max-file": "3"
}
}
⚠️ 注意:
- JSON 格式必须完全正确(引号、逗号、括号等)。
- 不要改动其它字段,否则容器可能无法启动。
🔁 步骤三:重启 Docker 服务
sudo systemctl restart docker
▶️ 步骤四:重新启动容器
docker start <container-name-or-id>
可以用以下命令验证是否生效:
docker inspect <container-name-or-id> | grep -A 5 LogConfig
输出示例:
"LogConfig": {
"Type": "json-file",
"Config": {
"max-size": "100m",
"max-file": "3"
}
}
⚠️ 注意事项
- 旧日志不会自动轮转:修改后从新日志开始才会应用新规则。
- 升级或重启 Docker 不会丢失修改。
- Docker Compose 或 Swarm 管理的容器:下次
up时会被覆盖。建议直接改 Compose 文件里的logging配置。
默认存储路径
Docker 的数据(包括镜像、容器、日志、卷等)确实可以修改存放路径。默认路径是:
/var/lib/docker
很多人希望把它改到更大的磁盘(比如 /data/docker),这是完全可行的。下面是最常用、最安全的几种方法 👇
🧩 方法一:修改 Docker 的数据根目录(推荐)
1️⃣ 编辑 Docker 配置文件
编辑 daemon.json:
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
加入或修改如下内容:
{
"data-root": "/data/docker"
}
⚠️ 注意:如果文件中已有其他配置(如日志配置),确保 JSON 格式正确,比如:
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
2️⃣ 停止 Docker 服务
sudo systemctl stop docker
3️⃣ 移动现有数据(可选)
如果你希望保留原有容器、镜像等数据:
sudo rsync -aP /var/lib/docker/ /data/docker/
rsync -aP会保留权限并显示进度。
如果不需要旧数据,可以直接跳过这步(Docker 会重新创建目录)。
4️⃣ 重启 Docker
sudo systemctl start docker
检查是否生效:
docker info | grep "Docker Root Dir"
输出示例:
Docker Root Dir: /data/docker
🧱 方法二:修改 systemd 启动参数(适合临时测试)
如果你不想动配置文件,也可以在 Docker 的 systemd 启动项中加参数。
-
编辑服务文件:
sudo systemctl edit docker -
添加内容:
[Service] ExecStart= ExecStart=/usr/bin/dockerd --data-root=/data/docker -
重新加载并重启:
sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl restart docker
🧰 方法三:软链接(最简单但不太推荐)
你也可以直接创建软链接:
sudo systemctl stop docker
sudo mv /var/lib/docker /data/docker
sudo ln -s /data/docker /var/lib/docker
sudo systemctl start docker
✅ 优点:快、简单。
⚠️ 缺点:某些环境(特别是 SELinux 或容器安全策略)可能有问题。