Docker Container(容器)

一、概念

容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。

虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。

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

运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本

二、容器的生命周期

  1. created:初建状态
  2. running:运行状态
  3. stopped:停止状态
  4. paused: 暂停状态
  5. deleted:删除状态

killed by out-of-memory(因内存不足被终止):宿主机内存被耗尽,也被称为OOM(非计划终止) 这时需要杀死最吃内存的容器

container process exitde(异常终止):出现容器被终止后,将进入Should restart,选择操作:

  • yes 需要重启,容器执行 start 命令,转为运行状态
  • no 不需要重启,容器转为停止状态

2.1 容器OOM

1. 若容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。 如:在容器中,部署了一个 web 服务。假设主机分配给此容器的内存上限为1G, 当脚本申请的内存大于1G时,此容器就会触发OOM事件。而在这种情况下,此容器将会被强制关闭。

但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.

2. 若用户不想关闭这个容器,那么可以选择--oom-kill-disable来禁用OOM-Killer。使用此参数时,仍需注意,若使用-m设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去

3. 若用户使用了--oom-kill-disable,但也没有使用-m来设定上限,此时此容器将会尽可能多地使用主机内存资源

2.2 容器异常退出

每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,若一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。docker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时并且容器设置了--restart 参数,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态

2.3 容器暂停

Docker"剥夺"了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源等还保留未动。失去了 CPU 资源的进程是不会被主机内核系统所调度的, 所以此容器就处于“冰封”状态

三、容器命令详解

3.1 docker create 

创建一个新的容器但不启动

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 别名
docker container 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:自动重启

3.2 docker start

启动停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container start

3.3 docker run

创建一个新的容器并运行一个命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 别名
docker container run
  • -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:自动重启

3.4 docker ps

列出容器

docker ps [OPTIONS]
# 别名
docker container ls, docker container list, docker container ps
  • -a:显示所有的容器,包括未运行的
  • -f:根据条件过滤显示的内容
  • --format:指定返回值的模板文件。如 json 或者 table
  • -l:显示 latest 的容器
  • -n:列出最近创建的 n 个容器
  • --no-trunc:不截断输出
  • -q:静默模式,只显示容器编号
  • -s:显示总的文件大小

3.5 docker logs

查看容器日志

docker logs [OPTIONS] CONTAINER
# 别名
docker container logs
  • -f,--follow:跟踪日志输出
  • --since:显示某个开始时间的所有日志
  • -t,--timestamps:显示时间戳
  • -n,--tail:仅列出最新 N 条容器日志

3.6 docker attach

连接到正在运行的容器中

docker attach [OPTIONS] CONTAINER
# 别名
docker container attach
  • --sig-proxy:是否将所有信号代理,默认是 true。若设置为 false,退出的话不会影响容器,否则退出会导致容器退出

3.7 docker exec

在容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 别名
docker container exec 
  • -d:分离模式: 在后台运行
  • -i:即使没有附加也保持 STDIN 打开
  • -t:分配一个伪终端
  • -e:设置环境变量
  • -u,--user:指定用户 "<name|uid>[:<group|gid>]"
  • -w,--workdir:指定工作目录

3.8 docker stop

停止运行的容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container stop
  • -s:发送的信号

3.9 docker restart

重启容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container restart
  • -s:发送的信号

3.10 docker kill

强制退出容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container kill
  • -s:发送的信号

注意事项:docker stop发送的是 SIGTERM 信号,docker kill发送的是 SIGKILL 信号

3.11 docker top

查看容器中运行进程信息,支持ps命令参数

docker top CONTAINER [ps OPTIONS]
# 别名
docker container top

容器运行时不一定有 /bin/bash 终端来交互执行 top 命令,而且容器还不一定有 top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程

3.12 docker stats

显示容器资源的使用情况,包括:CPU、内存、网络IO等

docker stats [OPTIONS] [CONTAINER...]
# 别名
docker container stats
  • --all,-a:显示所有的容器,包括未运行的
  • --format:指定返回值的模板文件。如 table,json
  • --no-stream:展示当前状态就直接退出了,不再实时更新
  • --no-trunc:不截断输出

返回报文:

  • CONTAINER ID 与 NAME:容器 ID 与名称
  • CPU% 与 MEM%:容器使用的 CPU 和内存的百分比
  • MEM USAGE / LIMIT:容器正在使用的总内存,以及允许使用的内存总量
  • NET I/O:容器通过其网络接口发送和接收的数据量
  • BLOCK I/O:容器从主机上的块设备读取和写入的数据量。
  • PIDs:容器创建的进程或线程数

3.13 docker container inspect

查看容器详细信息

docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
  • -f:指定返回值的模板文件。如 table、json
  • -s:显示总的文件大小

注意事项:docker inspect 会自动检查是镜像还是容器然后显示相应信息

3.14 docker port

用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口

docker port CONTAINER [PRIVATE_PORT[/PROTO]]
# 别名
docker container port

3.15 docker cp

在容器和宿主机之间拷贝文件

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 别名
docker container cp

3.16 docker diff

 检查容器里文件结构的更改

docker diff CONTAINER

3.17 docker commit

从容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • -a:提交的镜像作者;
  • -c:使用 Dockerfile 指令来创建镜像;可以修改启动指令
  • -m:提交时的说明文字;
  • -p:在 commit 时,将容器暂停

3.18 docker pause

暂停容器中所有进程

docker pause CONTAINER [CONTAINER...]
# 别名
docker container pause

3.19 docker unpause

恢复容器中所有进程

docker unpause CONTAINER [CONTAINER...]
# 别名
docker container unpause

3.20 docker rm

删除停止的容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container rm
  • -f:通过 SIGKILL 信号强制删除一个运行中的容器
     

3.21 docker export

导出容器内容为tar文件

docker export [OPTIONS] CONTAINER
# 别名
docker container export
  • -o:写入到文件

3.22 docker wait

阻塞运行直到容器停止,然后打印其退出代码

docker wait CONTAINER [CONTAINER...]
# 别名
docker container wait

3.23 docker rename

重命名容器

docker rename CONTAINER NEW_NAME
# 别名
docker container rename

3.24 docker container prune

删除所有停止的容器

docker container prune [OPTIONS]
  • -f,--force:不提示是否进行确认
     

3.25 docker update

更新容器配置

docker update [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container update
  • --cpus:cpu 数量
  • --cpuset-cpus:使用哪些 cpu
  • --memory:内存限制
  • --memory-swap:交换内存
  • --cpu-period:是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
  • --cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG_Bond20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值