ECS 上跑 Docker:日志别写进容器可写层
在华为云 ECS 上用 Docker 跑业务时,最容易被忽略的不是镜像本身,而是容器的可写层。默认情况下,容器标准输出会落到本机 json-file 日志驱动;应用如果再把日志、缓存、上传文件写进容器内部目录,一次镜像更新或容器重建就会把这些数据一起丢掉,磁盘也会在没有告警时被打满。
下面是一套在 ECS 上比较稳妥、也容易落地的做法。
1. 日志限制大小,并落到数据盘
json-file 不限制时,单个容器的日志可以长到几十 GB。建议在运行参数里加上轮转,并把业务日志目录挂到数据盘,而不是系统盘根分区。
docker run -d --name app --restart=unless-stopped \
--log-opt max-size=20m --log-opt max-file=5 \
-v /data/app/logs:/var/log/app \
-p 127.0.0.1:8080:8080 \
your-registry/app:1.2.0
要点有三条。第一,max-size 和 max-file 控制 docker logs 占用的磁盘。第二,业务自己写的日志用 volume 挂到 /data,系统盘只留给操作系统和 Docker 引擎。第三,ECS 数据盘单独挂载并写入 fstab,避免重启后目录变成空目录,容器却照常启动,日志全部写进系统盘。
2. 端口不要直接对公网全开
安全组是 ECS 的第一道门。容器映射端口时,优先只绑定 127.0.0.1,再由本机 Nginx 或 ELB 反代。安全组入方向只放行 80/443 或业务真正需要的端口,来源收窄到办公网、堡垒机或负载均衡网段,而不是 0.0.0.0/0 上的全部端口。
数据库、Redis、管理后台端口不要映射到宿主机公网。需要临时排查时用 SSH 隧道,查完就关。
3. 重启策略和健康检查
ECS 重启或 Docker 升级后,没有 restart policy 的容器不会自己起来。生产服务至少使用 unless-stopped。同时给镜像加上 HEALTHCHECK,或在编排里配置健康检查,避免进程僵死但容器状态仍是 running,负载均衡却继续把流量打进来。
4. 镜像更新时先保住数据
发版顺序建议固定为:先确认 volume 挂载点存在且有磁盘空间,再拉取新镜像,最后用相同的 volume、日志参数和环境变量重建容器。不要把数据库数据目录和上传目录放进镜像层。密钥不要写进 Dockerfile,放到 ECS 上权限收紧的 env 文件或密钥管理服务里,运行时再注入。
按这四步处理之后,容器重建不会再误删日志和上传文件,系统盘也不容易因为 docker logs 被写满。日常巡检只看两件事:用 df -h 看数据盘水位,用 docker ps 看健康状态是不是 healthy。
- 点赞
- 收藏
- 关注作者
评论(0)