Docker 入门实战:常用命令和我踩过的坑

Cold 发布于 2020-05-30 24 次阅读 502 字 预计阅读时间: 2 分钟 运维笔记


{
  "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 秒。

什么时候值得容器化

我的结论:依赖复杂、需要多实例、或者经常换机器部署的东西,容器化收益巨大;单个个人博客、一次性脚本,容器化纯属自我感动。技术选型别跟风,先问自己解决了什么问题。

和喜欢的一切在一起~
最后更新于 2020-05-30