微信咨询

微信咨询

13610*910*9

服务热线 7*24小时

电话咨询

docker学习记录

iamdu2025-06-17 23:05:40 浏览: 389

docker ps 是 Docker 命令行工具中的一个基础命令,用于查看当前正在运行的容器(Container)状态。在容器化环境中,它是最常用的调试和监控工具之一。

docker images  # 查看所有镜像

容器、镜像、网络、存储卷的大白话理解

1. 容器:打包好的 “应用盒子”

  • 类比:就像外卖打包盒,里面装着做好的饭菜(应用程序),还有配套的餐具(依赖环境,比如操作系统、运行库)。
  • 特点
    • 每个 “盒子” 独立运行,互不干扰(比如你点麻辣烫和汉堡,不会串味)。
    • 盒子很轻便,打开就能用,吃完扔掉也不占地方(容器启动快,删除后不残留垃圾)。
  • 例子:明道云的容器就是装着明道云程序的盒子,启动后就能通过浏览器访问。

2. 镜像:制作 “盒子” 的 “模板”

  • 类比:相当于外卖店的菜单模板,上面写着 “麻辣烫套餐需要哪些食材、怎么搭配”,根据这个模板能做出无数份一模一样的麻辣烫。
  • 特点
    • 镜像是静态的文件,记录了容器启动时需要的所有内容(应用程序、依赖、配置)。
    • 同一个镜像可以创建多个容器(比如用同一个模板做出 10 份麻辣烫外卖)。
  • 例子:你看到的 mingdaoyun-community:6.3.0 就是镜像,相当于 “明道云 6.3.0 版的制作模板”。

3. 网络:“盒子” 之间的 “通信马路”

  • 类比:外卖员需要马路(网络)把盒子送到你手里,不同的 “马路”(网络模式)决定了送餐的方式。
  • 特点
    • 容器默认在 Docker 自己的 “虚拟马路”(网桥网络)上,也可以指定走其他 “马路”(比如主机网络、自定义网络)。
    • 网络配置决定了容器能不能被外界访问(比如你的明道云容器把 8880 端口 “暴露” 到马路上,你才能通过浏览器访问)。
  • 例子:你看到的 0.0.0.0:8880->8880/tcp 就是网络配置,意思是 “把容器的 8880 端口绑定到电脑的 8880 端口,外界可以通过电脑 IP 访问明道云”。

4. 存储卷:“盒子” 的 “保鲜盒”

  • 类比:外卖盒里的食物吃完就没了,但如果你想把剩下的饭菜保存到冰箱(存储卷),下次加热还能吃。
  • 特点
    • 容器里的数据默认随容器删除而消失,但存储卷可以独立保存数据(比如明道云的用户数据、配置文件)。
    • 存储卷就像一个 “外挂硬盘”,挂在容器上,即使容器重启或删除,数据也不会丢。
  • 例子:如果明道云用了存储卷,你创建的表单、数据都会存在里面,不会因为重启容器而丢失。

一句话总结

  • 镜像是模板,用来做容器(应用盒子);
  • 网络让盒子能被找到和访问;
  • 存储卷是盒子的保鲜盒,用来存重要数据。

一个镜像和一个容器是不同的概念,它们的关系可以这样理解:

核心结论

一个镜像可以创建多个容器,但一个容器只能基于一个镜像启动;一个容器里 不能包含多个镜像

类比理解(以 “烹饪” 为例)

  • 镜像(Image):相当于 “菜谱”,记录了制作某种食物的所有步骤和原材料(如 “番茄炒蛋” 的菜谱)。
  • 容器(Container):相当于 “按菜谱炒出的一盘菜”,是菜谱的具体实例(一盘实际能吃的番茄炒蛋)。

具体说明

1. 镜像与容器的关系

  • 镜像→容器:单向创建
    镜像是容器的 “模板”,容器是镜像的 “运行实例”。比如基于 ubuntu:20.04 镜像可以启动多个不同的 Ubuntu 容器,每个容器都是该镜像的一个独立运行环境。
  • 容器依赖镜像
    容器启动时必须指定一个基础镜像,且无法在运行时直接添加其他镜像(除非通过特殊方式,如在容器内再运行 Docker,但这属于嵌套场景,非常规用法)。

2. 为什么容器不能包含多个镜像?

  • 镜像的结构设计:镜像采用分层存储(类似洋葱结构),每个镜像包含独立的文件系统和配置。若容器包含多个镜像,会导致文件系统冲突(如不同镜像的同名文件覆盖),无法正常运行。
  • 容器的单一职责原则:Docker 设计理念强调 “一个容器只运行一个服务”,因此容器通常基于单一镜像构建,确保环境的一致性和稳定性。

例外情况:多镜像组合的实现方式

如果需要多个镜像协同工作,通常通过以下方式实现:

  • Docker Compose:用 YAML 文件定义多个容器(每个容器基于不同镜像),并编排它们的网络和依赖关系(如 Web 容器 + 数据库容器)。
  • 镜像构建时集成:在一个镜像的 Dockerfile 中通过 RUN 命令安装其他软件,但本质上仍是单一镜像(例如在 Node.js 镜像中安装数据库客户端)。

总结

  • 镜像≠容器:镜像是静态模板,容器是动态运行体。
  • 一个容器只能有一个基础镜像,但多个容器可以共享同一个镜像。
  • 若需多服务协作,应通过 Docker Compose 等工具管理多个容器,而非在一个容器中集成多个镜像。

镜像和容器的大小变化逻辑:大白话解释

1. 镜像的大小:创建后固定不变

  • 镜像是什么? 镜像就像 “固化的模板”,打包了运行环境、程序、依赖等所有文件。
  • 为什么大小固定? 镜像采用分层存储(类似叠加的只读文件层),创建后无法修改已有层的内容。比如你基于 ubuntu:20.04 镜像构建新镜像,只能新增层(如安装软件),但原镜像的层始终不变。
  • 例子:下载一个官方 nginx 镜像,它的大小是固定的,不管启动多少容器,镜像本身不会变大。

2. 容器的大小:运行时可能越来越大

  • 容器是什么? 容器是镜像的 “运行实例”,在镜像的基础上增加了一个可写层(Writable Layer)。
  • 为什么容器会变大?
    • 写入文件:容器运行时产生的日志、临时文件、用户数据等,都会存在这个可写层中。例如:Web 容器生成的访问日志、数据库容器存储的数据。
    • 缓存或临时数据:程序运行时产生的缓存(如 Docker 的构建缓存)、未清理的临时文件,也会占用空间。
  • 例子:一个 Node.js 容器运行时不断生成日志文件,可写层会逐渐积累数据,导致容器占用的磁盘空间变大。

3. 镜像和容器的大小关系:相互独立

  • 镜像大小 ≠ 容器占用空间
    • 镜像大小是模板的 “初始体积”,容器占用空间 = 镜像大小 + 可写层数据大小。
    • 即使删除容器,镜像依然存在;反之,删除镜像会导致依赖它的容器无法启动。
  • 类比理解
    • 镜像 = 空白笔记本的模板(固定页数)。
    • 容器 = 你拿到笔记本后在上面写的内容(笔记越多,笔记本越 “重”)。

4. 如何控制容器变大?最佳实践

  • 定期清理可写层数据
    • 清理日志:例如用 logrotate 工具轮转日志,避免无限增长。
    • 移除临时文件:在 Dockerfile 中用 RUN 命令清理(如 apt-get clean)。
  • 使用数据卷(Volume)
    将动态数据(如数据库、用户上传文件)挂载到宿主机或独立卷,不存放在容器的可写层中,这样即使删除容器,数据也不会丢失,且容器体积不会因数据增长而变大。
  • 定期删除无用容器
    用 docker container prune 命令删除停止运行的容器,释放可写层空间。

总结

  • 镜像:静态模板,大小固定,多个容器可共享。
  • 容器:动态实例,运行时可写层会积累数据,导致占用空间变大。
  • 关键区别:镜像负责 “环境定义”,容器负责 “运行时数据存储”,两者的大小变化逻辑完全独立。