{
"log-driver": "json-file",
"log-opts": { "max-size": "50m", "max-file": "3" }
}
坑四:构建缓存失效导致镜像巨大。Dockerfile 里先 COPY 全部代码再 npm install,导致任何一行代码改动都重新装依赖。正确姿势是先 COPY package.json 装依赖,再拷代码,利用好层缓存,构建时间从 6 分钟降到 40 秒。
什么时候值得容器化
我的结论:依赖复杂、需要多实例、或者经常换机器部署的东西,容器化收益巨大;单个个人博客、一次性脚本,容器化纯属自我感动。技术选型别跟风,先问自己解决了什么问题。
拖了很久终于把 Docker 认真学了一遍,并顺手把博客和两个小服务容器化了。这篇不讲概念(镜像、容器、仓库那套网上到处都是),只记实际操作和我踩的坑。
日常高频命令
docker ps -a # 看所有容器(含已停止的)
docker logs -f --tail 100 容器 # 跟日志,排查必用
docker exec -it 容器 bash # 进容器里看现场
docker stats # 看资源占用
docker system df # 看磁盘被镜像吃了多少
docker compose up -d # 万物起点
踩过的坑
坑一:容器一删,数据没了。MySQL 容器重建之后表全空了。原因很简单:数据在容器层的可写层里,删容器等于删数据。所有有状态的服务必须挂 volume:
services:
mysql:
image: mysql:5.7
volumes:
- ./data/mysql:/var/lib/mysql
坑二:时区是 UTC。日志时间差 8 小时,排查时对时间线特别难受。要么镜像里装 tzdata 设置 Asia/Shanghai,要么 compose 里加 TZ=Asia/Shanghai 环境变量(大部分基础镜像认这个)。
坑三:日志把磁盘吃满。容器跑了大半年,json-file 日志驱动没有任何上限,单个容器日志堆了 8 个 G。在 /etc/docker/daemon.json 里加全局限制:
{
"log-driver": "json-file",
"log-opts": { "max-size": "50m", "max-file": "3" }
}
坑四:构建缓存失效导致镜像巨大。Dockerfile 里先 COPY 全部代码再 npm install,导致任何一行代码改动都重新装依赖。正确姿势是先 COPY package.json 装依赖,再拷代码,利用好层缓存,构建时间从 6 分钟降到 40 秒。
什么时候值得容器化
我的结论:依赖复杂、需要多实例、或者经常换机器部署的东西,容器化收益巨大;单个个人博客、一次性脚本,容器化纯属自我感动。技术选型别跟风,先问自己解决了什么问题。

Comments 3 条评论
容器一删数据没了,我也踩过
时区差 8 小时排查起来确实难受
先 COPY package.json 这招我也改了