文章目录
Docker 基础使用(0)基础认识
Docker 基础使用 (1) 使用流程概览
Docker 基础使用(2) 镜像与容器
Docker 基础使用(3) 存储卷
镜像的含义
Docker image 即镜像, 本质上是一个个只读文件这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行应用程序必须的资源。 镜像可以理解为面向对象编程中的类, 可以实例化出许多容器。
镜像的构成
镜像中是一层层Union FS (Union File System译为:联合文件系统) , 联合文件系统可以将多层目录挂载到同一目录下,形成一个虚拟文件系统 。每一层文件系统我们叫做一层 layer。联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是docker 镜像中每一层文件系统都是只读的。
这种设计使得镜像在构成时的流程为,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性。
镜像的作用
功能在本地开发后传入云端运行, 为了避免运行环境的差异导致的运行问题,Docker将所有用到的环境配置一起"打包"生成镜像。Docker的核心设计是"容器镜像的分层的存储格式",这种设计实现的基础是联合文件系统。
(看完前面只需要知道,镜像是一个类似于类的东西,镜像是由多层文件系统构成的)
所以镜像的作用有(或者说分层设计的优势):
节约存储空间:镜像的层可以被共享。如果多个镜像共享相同的层,这些层只需要在磁盘上存储一次,从而节约存储空间。
提高镜像的可复用性:镜像的层可以被重复使用。当一个镜像被修改时,只需存储新增的或修改过的层,而其他层可以继续被之前的镜像所使用。
加快镜像的传输速度:当镜像需要从一个地方传输到另一个地方时,只需传输新增或修改的层,而不需要传输整个镜像,这样可以大大加快传输速度。
便于镜像的管理:通过分层,可以更加方便地管理和组织镜像的不同部分,使得镜像的构建、共享和更新变得更加灵活和高效。
镜像的指令
(注意:只说明常用指令的存在,具体以及指令的拓展用法还是随用随查)
bash
# 列出本地镜像
docker images
# 给镜像打标签,可用于推送镜像仓库
docker tag
# 拉取镜像
docker pull
# 推送镜像
docker push
# 删除镜像
docker rmi
# 用于使用 Dockerfile 创建镜像
docker build
# 将指定镜像保存成 tar 归档文件
docker save
#导入使用 docker save 命令导出的镜像
docker load
# 查看镜像历史
docker history
# 从归档文件中创建镜像。
docker import
# 删除不使用的镜像
docker image prune
容器的含义
1.容器是镜像的实例化,镜像是只读文件,容器可读也可写。
2.容器中运行着进程。
3.容器有初建、运行、停止、暂停和删除五种状态。
4.容器本身也是一个进程,这个进程的不同之处在于做了更多的资源隔离。在容器内部,观测到宿主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
- 容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
容器的状态
- created:初建状态
- running:运行状态
- stopped:停止状态
- paused: 暂停状态
- deleted:删除状态
bash
docker create : 创建容器后,不立即启动运行,容器进入初建状态;
docker run : 创建容器,并立即启动运行,进入运行状态;
docker start : 容器转为运行状态;
docker stop : 容器将转入停止状态;
docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;
docker restart : 重启容器,容器转入运行状态;
docker pause : 容器进入暂停状态;
docker unpause : 取消暂停状态,容器进入运行状态;
docker rm : 删除容器,容器转入删除状态。
容器对于OOM事件的处理:
OOM是Out Of Memory的缩写,中文翻译为内存溢出。
在启动容器时,可以使用Docker命令行工具或者Docker Compose文件来设置容器的内存限制。例如,通过docker run
命令,可以使用-m标志来指定容器的内存限制,例如docker run -m 512m my_container
表示将最大内存限制设置为512MB。
对于OOM事件,Docker通常有以下三种处理方案:
(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。但需要注意的是,**此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。**因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.
(补充:Docker Daemon是Docker引擎的后台进程,负责管理Docker对象(如镜像、容器、网络等)的创建、运行和分发。它接受来自Docker API的请求,并通过与其他进程通信来执行这些请求。Docker Daemon还负责与Docker客户端进行通信,并监控容器的运行状态。)
(2) 如果用户不想关闭这个容器,那么可以选择--oom-kill-disable
来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
(补充: 禁用的完整命令为 docker run --oom-kill-disable --memory=1g my_container
)
(补充: hung 状态即为挂起状态)
(3) 如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大
容器异常退出的处理流程
每个容器内部都存在一个 Init 进程(类似于Linux中的进程ID为1的进程),容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。(只有设置了--restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态。)
容器暂停状态的解释
即容器不被分配CPU资源
容器的指令
(注意:只说明常用指令的存在,具体以及指令的拓展用法还是随用随查)
bash
# 创建一个新的容器但不启动它
docker create
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
bash
# 创建一个新的容器并运行一个命令
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
○ -d: 后台运行容器,并返回容器 ID;比 create 多了这个参数
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
○ --restart:自动重启
bash
# 列出容器
docker ps
docker ps [OPTIONS]
○ -a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :显示 latest 的容器。
○ -n :列出最近创建的 n 个容器。
○ --no-trunc :不截断输出。
bash
查看容器日志
docker logs
连接到正在运行中的容器
docker attach
在容器中执行命令
docker exec
启动停止的容器
docker start
停止运行的容器
docker stop
重启容器
docker restart
强制退出容器
docker kill
查看容器中运行的进程信息,支持 ps 命令参数
docker top
显示容器资源的使用情况,例如CPU、内存、网络 I/O 等。
docker stats
查看容器详细信息
docker container inspect
用于列出指定的容器的端口映射
docker port
在容器和宿主机之间拷贝文件
docker cp
检查容器里文件结构的更改
docker diff
从容器创建一个新的镜像。
docker commit
暂停容器中所有的进程
docker pause
恢复容器中所有的进程
docker unpause
删除停止的容器
docker rm
导出容器内容为 tar 文件
docker export
阻塞运行直到容器停止,然后打印出它的退出代码。
docker wait
重命名容器
docker rename
删除所有停止的容器
docker container prune
更新容器配置
docker update
需要注意的相似指令间的区别
1. docker create / docker start / docker run
docker create 命令从 Docker 镜像创建一个全新的容器。但不会立即运行它。
docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器,则可以使用此命令启动它。
docker run 命令是创建和启动的组合,它创建一个新容器并立即启动它。实际上,如果 docker run 命令在您的系统上找不到上述映像,它可以从Docker Hub 中提取镜像。
2. docker import / docker load
docker save images_name
:将一个镜像导出为文件,再使用 docker load
命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export
命令导出的文件占用的空间更大,因为docker load
会保存镜像的所有历史记录。
docker export container_id
:将一个容器导出为文件,再使用 docker import
命令将容器导入成为一个新的镜像,但是相比 docker save
命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态。可以使用docker import
命令来导入一个容器快照到本地镜像库。两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。
3. docker rm / docker rmi / docker prune
docker rm : 删除一个或多个容器
docker rmi : 删除一个或多个镜像
docker prune: 用来删除不再使用的 docker 对象, 删除所有已停止的容器、悬空镜像以及未使用的网络和卷。