一,什么是容器?
容器是一个基于镜像创建的可运行实例,并且单独存在。
一个镜像可以创建出多个容器。

以上便是一个容器的组成,运行一个容器时,实际上是在容器化的环境里创建该文件系统的读写副本,这样就添加了一个容器层,这一层可以修改整个镜像的整个副本。
二,容器的生命周期
容器的生命周期分为五种:
created:初建状态
running:运行状态
stopped:停止状态
paused:暂停状态
deleted:删除状态

这里的暂停状态和停止状态还是有区别的,询问AI给出的核心区别如下。
| 特性 | pause 状态 |
stop 状态 |
|---|---|---|
| 是否运行 | 暂停执行,但仍在内存中 | 已终止,进程退出 |
| 资源占用 | 占用内存 + CPU 时间片冻结 | 只占磁盘空间(可写层),不占内存 |
| 恢复速度 | 极快(毫秒级) | 需要重新启动容器(秒级) |
| 文件系统 | 保持不变 | 保持不变 |
| 网络连接 | 冻结(TCP 连接可能断开) | 断开 |
| Cgroup 控制 | 使用 freezer cgroup 暂停 |
Cgroup 被释放 |
| 是否能通信 | ❌ 不响应请求 | ❌ 无法通信 |
三,容器常用的操作命令
1,创建容器
docker create

可以通过docker ps来查看新创建的镜像

2,启动容器
docker start:基于一个已经创建好的容器直接启动
docker run:直接基于一个镜像来新建一个容器来启动
启动的一个流程大概如下:
1,首先检查本地是否有需要的镜像
2,如果有则直接开始启动,若没有则去dockerhub拉取
3,分配文件系统并且在镜像的只读层创建一个可写层
4,从docker的ip池中分配一个ip给容器
5,执行用户的启动命令来运行镜像
3,终止容器
docker stop -t 10 (默认等待10秒)
停止一个容器的大概流程如下:
1,Docker daemon 接收到停止请求,获取容器的主进程 PID(即 PID 1,由 CMD 或 ENTRYPOINT 启动的进程)
2,Docker 向容器内的 主进程(PID 1) 发送SIGTERM信号
3,等待退出时间
4,如果在超时前未正常退出,docker则会发送SIGKILL信号给容器,强制退出。
4,进入容器
docker attach ... (不太常用,也不建议用)
docker exec -it 容器名 /bin/bash (最常用)
5,删除容器
docker rm 容器名 :可以用于删除一个停止状态的容器
docker rm -f 容器名:删除一个正在运行中的容器,要添加 -f (或者--force) 参数
6,导出容器和导入镜像
导出命令:docker export
导入命令:docker import
例如:
docker export busybox > busybox.tar
docker import busybox.tar busybox:test
这样就实现了将busybox容器的数据导出,并且将其导入到了一个新的镜像之中。
这样就实现了容器的迁移。