作者:Sylearn
链接:https://www.zhihu.com/question/562537102/answer/1963177139114317535
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Docker 看似“一个命令启动容器”,实则涉及镜像、网络、数据持久化持续交付的闭环。为了把知识点一次性归纳清楚,我整理了这套笔记,并配上关键流程图,方便我自己,也方便大家快速定位到对应命令和使用场景。

为什么镜像是 Docker 的基石

镜像管理
  • 在任何调试之前先运行 docker --versiondocker info,确认客户端与守护进程状态,避免“版本锅”。
  • 镜像操作的核心命令极少:docker pull 拉取基线、docker images 检查版本、docker tag 对齐命名规范、docker rmi 做容量治理。
  • 在多环境分发时,docker save/docker load 是最快的离线同步手段。我在弱网 IDC 推镜像时经常这么做,甚至会预先生成 *.tar 归档。

把镜像当成“不可变基础设施单元”才能理解 Docker 的设计哲学。

容器生命周期:像管控微服务一样管控容器

容器生命周期管理
  • 一开始给容器命名:docker run --name gateway -d ...,这样后续的 logsexec 才不至于混乱。
  • docker ps/docker ps -a 组合能快速定位“僵尸容器”。线上巡检时先看 -a,确认是否有 CrashLoop。
  • 状态控制上,docker restartdocker kill 分别对应“平滑重启”和“立即兜底”。日志排查时离不开 docker logs -fdocker inspect
  • 容器删除 (docker rm) 不仅为了清洁,也是为了触发自动化编排重新调度,保证声明式配置生效。

网络与数据卷:让容器之间有话可说

网络与数据卷
  • 在生产环境,我倾向于通过 docker network create 先建逻辑网络,再让服务用 --network 加入,实现“最小暴露”。
  • 端口映射要记得区分“主机:容器”,用 docker port 逐一核对非常关键,尤其在多实例场景。
  • 数据持久化离不开 volume。我常用 docker volume create + docker run -v vol:/data,再配合 docker cp 做冷备。
  • 个人觉得,卷和网络是把 Docker 拉到企业级的关键。如果不规范,很容易出现“数据丢失或端口冲突”这类事故。

镜像构建与发布:CI/CD 的落地关键

镜像构建与发布
  • 构建阶段:docker build -t repo:tag . 是底层逻辑,--build-arg 用于注入构建时变量(比如 Git SHA)。把版本号写进标签,方便回滚。
  • 优化阶段:每次发布前执行一次 docker image prunedocker builder prune,可以避免 CI 机器“磁盘占满”。
  • 推送阶段:docker login 确认凭证,docker push/docker pull 让镜像在仓库与节点之间流动。配合企业私有 Registry,能实现灰度。
  • Composecompose up -dcompose downcompose logs -f 等命令适合多容器协同,是中小团队落地微服务的桥梁。

Dockerfile 编写指南:高质量镜像的源头

Dockerfile编写指南
  • 核心指令:FROM 决定安全基线,WORKDIR 保证路径一致性,COPY/RUN 是构建阶段的主力。
  • 运行时配置:EXPOSEENVCMD 把命令式动作封装成声明式行为,让镜像暗含运行时上下文。
  • 健康检查:HEALTHCHECK --interval=30s ... 可以让编排工具(Compose、Swarm、Kubernetes)自动发现坏实例。
  • 最佳实践:多阶段构建、合并 RUN、.dockerignore、复用依赖缓存、非 root 运行,是在代码走查时必查的清单。

最后的一些建议:

  1. 在安全安全,建议配合 TrivyClair 等工具做镜像扫描,避免基础镜像漏洞滞留。
  2. 如果要实现标准化,建立镜像命名规范(如 <owner>/<service>:<branch>-<build>)和生命周期策略。
  3. 在监控方面,容器只是执行单元,真正的可观测性还是需要结合 Prometheus、Loki 等采集容器指标与日志进行观察。