目录
1. 什么是容器?
(1)容器的概念:
-
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
-
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
-
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
(2)容器的生活案例来理解。镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样。
(3)或者我们都学习了 Java 或者 C++之类的面向对象的语言,可以理解为镜像为基础类,容器是实例化出来的一个个对象,用户需要的不一样,里面的内容也就不一样了。
(4)为什么需要容器?
- 镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
- 容器带来哪些收益呢,可以参考为什么要虚拟化、容器化。
2. 容器的生命周期
(1)容器的生命周期是容器可能处于的状态。
- created:初建状态。
- running:运行状态。
- stopped:停止状态。
- paused: 暂停状态。
- deleted:删除状态。
(2)各生命周期之间的转换关系如图所示:
- docker create:创建容器后,不立即启动运行,容器进入初建状态;
- docker run:创建容器,并立即启动运行,进入运行状态;
- docker start:容器转为运行状态;
- docker stop:容器将转入停止状态;
- docker kill:容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;
- docker restart:重启容器,容器转入运行状态;
- docker pause:容器进入暂停状态;
- docker unpause:取消暂停状态,容器进入运行状态;
- docker rm:删除容器,容器转入删除状态。
- killed by out-of-memory(因内存不足被终止):宿主机内存被耗尽,也被称为 OOM:非计划终止 这时需要杀死最吃内存的容器
- container process exitde(异常终止):出现容器被终止后,将进入 Should restart?选择操作:
- yes 需要重启,容器执行 start 命令,转为运行状态。
- no 不需要重启,容器转为停止状态。
2.1 容器处理OOM事件
(1)Docker 在处理 OOM 事件时分为三种情况:
- 如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程。
- 如果用户不想关闭这个容器,那么可以选择–oom-kill-disable 来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
- 如果用户使用了–oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。
2.2 容器异常退出
- 每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。
- 当 Init 进程退出时,也就代表着此容器被关闭。docker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时, Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running状态。只有设置了–restart 参数的容器, Docker Daemon 才会去尝试启动,否则容器会保持停止状态。
2.3 容器暂停
(1)Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、 Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。
3. 容器命令详解
3.1 容器命令清单
(1)容器命令如下:
命令 | 别名 | 功能 |
---|---|---|
docker create | docker container create | 创建容器 |
docker run | docker container run | 运行容器 |
docker attach | docker container attach | 连接到正在运行中的容器。 |
docker commit | docker container commit | 将镜像提交为容器 |
docker cp | docker container cp | 在容器和宿主机之间拷贝 |
docker diff | docker container diff | 检查容器里文件结构的更改。 |
docker exec | docker container exec | 在运行的容器中执行命令 |
docker export | docker container export | 将容器导出为 tar |
docker container inspect | 查看容器详细信息 | |
docker kill | docker container kill | 杀死容器 |
docker logs | docker container logs | 查看日志 |
docker ps | docker container ls,docker container list,docker container ps | 查看正在运行的进程 |
docker pause | docker container pause | 暂停进程 |
docker port | docker container port | 查看容器的端口映射 |
docker container prune | 删除停止的容器 | |
docker rename | docker container rename | 重命名容器 |
docker restart | docker container restart | |
docker rm | docker container rm, docker container remove | 删除容器 |
docker start | docker container start | 启动容器 |
docker stats | docker container stats | 查看资源占用信息 |
docker stop | docker container stop | 停止容器 |
docker top | docker container top | 查看某个容器的资源占用 |
docker unpause | docker container unpause | 继续运行容器 |
docker update | docker container update | 更新容器配置 |
docker wait | docker container wait | 阻止一个或多个容器停止,然后打印退出代码 |
3.2 docker create命令
(1)功能:
- 创建一个新的容器但不启动它
(2)语法:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
(3)别名:
docker container create
(4)关键参数:
- -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:自动重启。
(5)样例:
docker create --name mynginx nginx:latest
3.3 docker run命令
(1)功能:
- 创建一个新的容器并运行一个命令
(2)语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(3)别名:
docker container run
(4)关键参数:
- -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:自动重启
(5)样例:
#使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
#使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
3.4 docker ps命令
(1)功能:
- 列出容器。
(2)语法:
docker ps [OPTIONS]
(3)别名:
docker container ls, docker container list, docker container ps
(4)关键参数:
- -a:显示所有的容器,包括未运行的。
- -f:根据条件过滤显示的内容。
- –format:指定返回值的模板文件。如 json 或者 table
- -l:显示 latest 的容器。
- -n:列出最近创建的 n 个容器。
- –no-trunc:不截断输出。
- -q:静默模式,只显示容器编号。
- -s:显示总的文件大小。
(5)样例:
docker ps -a
3.5 docker logs命令
(1)功能:
- 查看容器日志
(2)语法:
docker logs [OPTIONS] CONTAINER
(3)别名:
docker container logs
(4)关键参数:
- -f ,–follow:跟踪日志输出
- –since:显示某个开始时间的所有日志
- -t,–timestamps:显示时间戳
- -n, --tail:仅列出最新 N 条容器日志
(5)样例:
#跟踪查看容器 mynginx 的日志输出。
docker logs -f mynginx1
#查看容器 mynginx 从 2016 年 7 月 1 日后的最新 10 条日志。
docker logs --since="2016-07-01" --tail=10 mynginx
3.6 docker attach命令
(1)功能:
- 连接到正在运行中的容器。
(2)语法:
docker attach [OPTIONS] CONTAINER
(3)别名:
docker container attach
(4)关键参数:
- –sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的话不会影响容器, 否则退出会导致容器退出。
(5)样例:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker attach mynginx
#此处按了 ctrl+c 后会把容器杀死
^C2023/03/15 06:26:24 [notice] 1#1: signal 2 (SIGINT) received,
exiting
2023/03/15 06:26:24 [notice] 28#28: exiting
2023/03/15 06:26:24 [notice] 28#28: exit
2023/03/15 06:26:24 [notice] 1#1: signal 17 (SIGCHLD) received
from 28
2023/03/15 06:26:24 [notice] 1#1: worker process 28 exited with
code 0
2023/03/15 06:26:24 [notice] 1#1: exit
root@139-159-150-152:/data/myworkdir/dockerfile/cache# docker
attach --sig-proxy=false mynginx