docker学习记录
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
命令删除停止运行的容器,释放可写层空间。
总结
- 镜像:静态模板,大小固定,多个容器可共享。
- 容器:动态实例,运行时可写层会积累数据,导致占用空间变大。
- 关键区别:镜像负责 “环境定义”,容器负责 “运行时数据存储”,两者的大小变化逻辑完全独立。
联系站长
友情链接
其他入口
QQ与微信加好友
粤ICP备17018681号 站点地图 www.iamdu.com 版权所有 服务商提供:阿里云 Designed by :DU
本站部分资源内容来源于网络,若侵犯您的权益,请联系删除!