什么是容器?
通俗来讲,容器是镜像的运行实体。镜像只是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用程序。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质时主机上的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上的进程的本质区别
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。这将添加一个容器层,该层允许修改镜像的整个副本。
为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿个linux或者Windows的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
容器的状态
容器各生命周期之间的转换关系如图所示
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?选择操作
容器OOM
docker在处理OOM事件时分为三种情况
(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发OOM事件。
例如:在容器当中,部署了一个web服务。假设主机分配给此容器的内存上限是1G,当脚本申请的内存大于1G时,此容器就会触发OOM事件。而在这种情况下,此容器将会被强制关闭。
但是需要注意的是,此时关闭容器的并非是Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的时宿主机操作系统的内核OOM事件,因此最终是由宿主机内核来关闭这些进程。
(2)如果用户不想关闭这个容器,那么可以选择--oom-kill-disable来禁用OOM-Killer。使用此参数时,仍需要注意,如果使用了-m设置了该容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于hung状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
(3)如果用户使用了--oom-kill-disable,但也没有使用-m来设置上限,因而此时此容器将会尽可能多的使用主机内存资源。换而言之,主机内存有多大,它将使用多大。
容器异常退出
每个容器内部都存在一个Init进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为Init进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至Init进程也退出。当Init进程退出时,也就代表着此容器被关闭。docker目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon会尝试再次重新将此容器由Stopped状态转为Running状态。只是设置了--restart参数的容器,Docker Daemon才会去尝试启动,否则容器会保持停止状态。
容器暂停
docker“剥夺”了此容器的CPU资源。而其他资源,如Memory资源、Network资源等还保留未动。如此一来,失去了CPU资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态
容器命令清单
命令 |
别名 |
功能 |
备注 |
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 |
阻止一个或多个容器停止,然后打印退出代码 |
容器命令详解
1.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" --cpuset-cpus="0,1,2" |
绑定容器到指定CPU容器运行 |
-m |
设置容器使用内存最大值 |
--network="bridge" |
指定容器的网络连接类型 |
--link=[] |
添加链接到另一个容器 |
--volume -v |
绑定一个卷 |
-rm |
shell退出的时候自动删除容器 |
--restart |
自动重启 |
示例
2.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" --cpuset-cpus="0,1,2" |
绑定容器到指定CPU容器运行 |
-m |
设置容器使用内存最大值 |
--network="bridge" |
指定容器的网络连接类型 |
--link=[] |
添加链接到另一个容器 |
--volume -v |
绑定一个卷 |
-rm |
shell退出的时候自动删除容器 |
--restart |
自动重启 |
3.docker ps
功能:列出容器
docker ps [OPTIONS]
关键参数 | |
-a |
显示所有的容器,包括未运行的 |
-f |
根据条件过滤显示的内容 |
--format |
指定返回值的模板文件。如json或者table |
-l |
显示latest的容器 |
-n |
列出最近创建的n个容器 |
--no-trunc |
不截断输出 |
-q |
静默模式,只显示容器编号 |
-s |
显示总的文件的大小 |
4.docker logs
功能:查看容器日志
docker logs [OPTIONS] CONTAINER
关键参数 | |
-f --follow |
跟踪日志输出 |
--since |
显示某个开始时间的所有日志 |
-t --timestamps |
显示时间戳 |
-n --tail |
仅列出最新N条容器日志 |
5.docker attach
功能:连接到正在运行中的容器
docker attach [OPTIONS] CONTAINER
关键参数只有--sig-proxy:是否将所有信号代理,默认是true,如果设置为false,退出的话不会影响容器,否则退出会导致容器退出
6.docker exec
功能:在容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]
关键参数 | |
-d |
分离模式:在后台运行 |
-i |
即使没有附加也保持STDIN打开 |
-t |
分配一个伪终端 |
-e |
设置环境变量 |
-u --user |
指定用户"[:]" |
-w --workdir |
指定工作目录 |
7.docker start
功能:启动停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
8.docker stop
功能:停止运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
关键参数只有-s:发送的信号
9.docker restart
功能:重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
关键参数只有-s:发送信号
10.docker kill
功能:强制退出容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
关键参数只有-s:发送的信号
注意:docker stop发送的是SIGTERM信号,docker kill发送的是SIGKILL信号
11.docker top
功能:查看容器中运行的进程信息,支持ps命令参数
docker top CONTAINER [ps OPTIONS]
注意事项:容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top 来实现查看container中运行的进程
12.docekr stats
功能:显示容器资源的使用情况,包括CPU、内存、网络I/O等
docker stats [OPTIONS] [CONTAINER ...]
关键参数 | |
--all -a |
显示所有容器,包括未运行的 |
--format |
指定返回值的模板文件。如table,json |
--no-stream |
展示当前状态就直接退出了,不再实时更新 |
--no-trunc |
不截断输出 |
正常动态输出运行容器的资源占用情况
以json格式输出
13.docker container inspect
功能:查看容器详细信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
关键参数 | |
-f |
指定返回值的模板文件。如table、json |
-s |
显示总的文件大小 |
注意事项:docker inspect会自动检查时镜像还是容器然后显示相关信息
14.docker port
功能:用于列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
15.docker cp
功能:在容器和宿主机之间拷贝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
16.docker diff
功能:检查容器里文件结构的更改
docker diff CONTAINER
17.docker commit
功能:从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数 | |
-a |
提交镜像的作者 |
-c |
使用Dockerfile指令来创建镜像;可以修改启动指令 |
-m |
提交时的说明文字 |
-p |
在commit时,将容器暂停 |
18.docker pause
功能:暂停容器中所有的进程
docker pause CONTAINER [CONTAINER...]
能看到当我们停止mynginx4中的所有进程后进入容器提示该容器已暂停
19.docker unpause
功能:恢复容器中所有的进程
docker unpause CONTAINER [CONTAINER...]
20.docker rm
功能:删除停止的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
关键参数-f:通过SIGKILL信号强制删除一个运行中的容器
21.docker export
功能:导出容器内容为tar文件
docker export [OPTIONS] CONTAINER
关键参数-o:写入到文件
22.docker wait
功能:阻塞运动直到容器停止,然后打印它的退出代码
docker wait CONTAINER [CONTAINER...]
这里我开了两个终端在第一个终端输入docker container wait mynginx4 以后这个终端就阻塞在这里了,然后我开第二个终端输入docker kill mynginx4 就可以看到第一个终端已返回了
23.docker rename
功能:重命名容器
docker rename CONTAINER NEW_NAME
24.docker container prune
功能:删除所有停止的容器
docker container prune [OPTIONS]
关键参数-f,--force:不提示是否进行确认
25.docker update
功能:更新容器配置
docker update [OPTIONS] CONTAINER [CONTAINER...]
关键参数 | |
--cpus |
cpu的数量 |
--cpuset-cpus |
使用哪些cpu |
--memory -m |
内存限制 |
--memory-swap |
交换内存 |
--cpu-period |
是用来指定容器对CPU的使用要在多长时间内做一次重新分配 |
--cpu-quota |
是用来指定在这个周期内,最多可以有多少时间用来跑这个容器 |