Docker 里面的镜像(Image)和容器(Container)到底是什么
很多人学 Docker:
最容易懵的就是:
镜像 和 容器因为:
这两个概念太抽象但实际上:
你只要理解一个核心:
镜像是模板 容器是运行实例整个 Docker:
瞬间就通了。
一、先记住一句话(最重要)
镜像(Image) = 安装包/模板 容器(Container) = 运行中的程序二、最经典类比(必须理解)
类比1:游戏
| Docker | 游戏类比 |
|---|---|
| 镜像 | 游戏安装包 |
| 容器 | 正在运行的游戏 |
类比2:类和对象
如果你学过 C++/Java:
| Docker | 面向对象 |
|---|---|
| Image | 类 |
| Container | 对象 |
类比3:蛋糕模具
| Docker | 蛋糕 |
|---|---|
| Image | 蛋糕模具 |
| Container | 做出来的蛋糕 |
三、什么是镜像(Image)
镜像:
本质:
只读模板里面包含:
程序 运行环境 依赖 配置例如:
Redis镜像 MySQL镜像 Ubuntu镜像 Go镜像四、镜像本身能运行吗
不能。
镜像:
只是:
模板必须:
通过镜像创建容器才能运行。
五、镜像里到底有什么
例如:
Redis 镜像。
里面已经包含:
Redis程序 Linux环境 Redis配置 启动命令所以:
你不需要:
手动安装 Redis六、什么是容器(Container)
容器:
是:
镜像运行后的实例也就是:
真正运行中的程序七、容器是活的
镜像:
静态 不会运行容器:
动态 真正运行例如:
dockerrun redisDocker 会:
Redis镜像 ↓ 创建Redis容器 ↓ 启动Redis八、真正运行的是容器
很多新人会误以为:
docker run redis 是在运行镜像其实:
真正运行的是:
容器镜像只是:
创建容器的模板九、一个镜像可以创建多个容器
例如:
一个 Redis 镜像。
可以:
dockerrun redisdockerrun redisdockerrun redis创建:
多个Redis容器十、为什么镜像是只读的
镜像:
设计思想:
保持稳定所以:
镜像不会改变真正会变化的是:
容器十一、容器里面的数据会变化
例如:
Redis 容器:
数据会增加 配置会变化 日志会变化这些:
都属于:
容器层十二、删除容器不会删除镜像
例如:
dockerrmmyredis删除的是:
Redis容器但:
Redis镜像还在所以:
下次启动:
非常快。
十三、删除镜像
dockerrmi redis才是真正删除:
Redis镜像十四、Docker 工作流程(必须掌握)
Docker 最核心流程:
Docker Hub ↓ 下载镜像(Image) ↓ 创建容器(Container) ↓ 运行程序十五、最经典命令解析
下载镜像
dockerpull redis作用:
下载 Redis 镜像此时:
还没运行创建运行容器
dockerrun redisDocker:
基于 Redis 镜像 创建 Redis 容器 并启动十六、查看镜像
dockerimages输出:
REPOSITORY TAG redis latest mysql latest这些:
都是:
镜像十七、查看容器
dockerps输出:
CONTAINER ID IMAGE xxxxx redis这里:
IMAGE 表示: 这个容器基于哪个镜像十八、镜像和容器关系图(重点)
Redis镜像 ↓ 创建 ↓ Redis容器1(运行中) Redis镜像 ↓ 创建 ↓ Redis容器2(运行中)十九、为什么 Docker 启动快
虚拟机:
启动整个操作系统Docker:
直接基于镜像创建容器所以:
非常轻量 启动极快二十、镜像分层(了解)
Docker 镜像:
底层:
其实:
分层存储例如:
Ubuntu层 ↓ Go层 ↓ 项目代码层所以:
Docker:
非常节省空间因为:
相同层:
会复用。
二十一、为什么 Go 特别适合 Docker
因为:
Go:
编译后只有一个二进制文件非常容易:
做成镜像所以:
Go + Docker是绝配。
二十二、真实开发里怎么用
例如:
你的项目:
Gin项目 MySQL Redis Nginx都会:
各自运行在不同容器二十三、整个项目可能是这样
mysql容器 redis容器 gin容器 nginx容器每个:
相互隔离但:
可以通信二十四、为什么 Docker 这么火
因为:
Docker 真正解决:
环境一致性问题以前:
我电脑能跑 你电脑跑不了现在:
同一个镜像 所有机器都能跑二十五、最后一句总结(必须记住)
镜像(Image) = 程序 + 环境 + 配置 的模板 容器(Container) = 镜像运行后的实例 = 真正运行中的程序Docker 核心思想:
镜像负责“打包” 容器负责“运行”