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

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

bash 复制代码
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

启动停止的容器

bash 复制代码
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container start

3.3 docker run

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

bash 复制代码
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

列出容器

bash 复制代码
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

查看容器日志

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

3.6 docker attach

连接到正在运行的容器中

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

3.7 docker exec

在容器中执行命令

bash 复制代码
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

停止运行的容器

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

3.9 docker restart

重启容器

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

3.10 docker kill

强制退出容器

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

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

3.11 docker top

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

bash 复制代码
docker top CONTAINER [ps OPTIONS]
# 别名
docker container top

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

3.12 docker stats

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

bash 复制代码
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

查看容器详细信息

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

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

3.14 docker port

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

bash 复制代码
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
# 别名
docker container port

3.15 docker cp

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

bash 复制代码
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 别名
docker container cp

3.16 docker diff

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

cpp 复制代码
docker diff CONTAINER

3.17 docker commit

从容器创建一个新的镜像

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

3.18 docker pause

暂停容器中所有进程

bash 复制代码
docker pause CONTAINER [CONTAINER...]
# 别名
docker container pause

3.19 docker unpause

恢复容器中所有进程

bash 复制代码
docker unpause CONTAINER [CONTAINER...]
# 别名
docker container unpause

3.20 docker rm

删除停止的容器

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

3.21 docker export

导出容器内容为tar文件

bash 复制代码
docker export [OPTIONS] CONTAINER
# 别名
docker container export
  • -o:写入到文件

3.22 docker wait

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

bash 复制代码
docker wait CONTAINER [CONTAINER...]
# 别名
docker container wait

3.23 docker rename

重命名容器

bash 复制代码
docker rename CONTAINER NEW_NAME
# 别名
docker container rename

3.24 docker container prune

删除所有停止的容器

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

3.25 docker update

更新容器配置

bash 复制代码
docker update [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container update
  • --cpus:cpu 数量
  • --cpuset-cpus:使用哪些 cpu
  • --memory:内存限制
  • --memory-swap:交换内存
  • --cpu-period:是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
  • --cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
相关推荐
别挡16 分钟前
CentOS Stream 8中安装和使用 Docker
linux·docker·centos
人工智障调包侠1 小时前
Linux 目录介绍
linux·运维·服务器
愤怒的代码1 小时前
Centos使用阿里云镜像安装docker
linux·docker·centos
汪公子4922 小时前
使用docker部署考试系统
docker
Java小白白同学2 小时前
Linux 硬盘扩容操作手册
linux·运维·服务器
大江东去了吗3 小时前
k8s HPA
云原生·容器·kubernetes
大白菜和MySQL3 小时前
keepalived和lvs高可用集群
linux·运维·lvs
好奇的菜鸟3 小时前
如何使用Docker快速启动Nginx服务器
服务器·nginx·docker
花菜回锅肉3 小时前
开源可视化大屏superset Docker环境部署
数据仓库·docker·容器·开源·superset
学习向前冲4 小时前
高效诊断Linux性能问题
linux·运维·服务器