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