Docker Container (容器) 常见命令

本文围绕Docker容器展开,介绍了容器的生命周期,包括初建、运行、停止等状态及转换关系。详细讲解了容器常见命令,如docker run、docker ps等的功能、参数和使用示例。还分享了容器批量处理技巧、交互模式,并解答了docker create、docker run等命令的区别等常见问题。

Docker 容器的生命周期

什么是容器?

通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除五种状态。 虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资 源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息, 这是容器与直接运行在主机上进程的本质区别。 容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。 运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个 容器层,该层允许修改镜像的整个副本。

容器与镜像的关系类似于程序与代码的关系。代码(镜像)是静态的,包含了程序运行所需要的所有指令和数据;而程序(容器)是动态的,是代码在特定环境下的运行实例。通过镜像创建容器,我们可以方便地部署和管理应用程序,并确保每个应用程序都在一致和隔离的环境中运行。

在学习容器的常见命令之前,我们先来看看容器的生命周期吧!

容器的生命周期是容器可能处于的状态:

  • created:初建状态。
  • running:运行状态。
  • stopped:停止状态。
  • paused:暂停状态。
  • deleted:删除状态。

各个生命周期的转换关系如图所示:

img

  • 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 exited:出现容器被终止后,将进入是否应该 restart 的选择。
    • yes:需要重启,容器执行 start 命令,转为运行状态。
    • no:不需要重启,容器转为停止状态。

Docker 在处理 OOM 事件分为 3 中情况:

  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 进程退出时,也就代表着此容器被关 闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器 关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。只有设置了–restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器 会保持停止状态。

容器暂停

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

Docker Container (容器) 常见命令

docker run

  • 功能:创建一个新的容器并运行一个命令。

  • 语法:

    docker run [OPTIONS] IMAGE [COMMAND] [ARG ...]
    
  • 别名:

    docker container run # 因为是属于容器的命令所以有这个 container,Docker 对命令进行了分类嘛
    
  • 参数:

    • -d:后台运行容器,并返回容器的 ID。
    • -i:以交互模式运行容器,通常与 -t 选项同时使用。
    • -P:随机端口映射,容器内部的端口随机映射到主机的端口。
    • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
    • -t:为容器分配一个伪输入终端,通常与 -i 选项同时使用。
    • –name:为容器指定一个名称。
    • -h:指定容器的 hostname
    • -e:设置环境变量。
    • –cpuset-cpus:绑定容器到指定的 CPU 上运行。例如: –cpuset-cpus=“0,1,2” 或者 –cpuset-cpus=“0-2” 就是将容器绑定到 0-2 这三个 CPU 上面运行。
    • -m:设置容器能够使用的内存的最大值。
    • –rm:当容器退出的时候自动删除它,即容器退出的时候不会进入 Exited 状态,而是直接进入 Delete 状态。
  • 演示:


如下图:我们使用 -d 选项让一个容器后台运行。使用 docker ps 命令可以看到容器正在运行!
在这里插入图片描述
busybox 是一个非常小的 Linux 发行版,它包含了许多基本的 UNIX 工具。当仅使用 busybox 镜像而不指定任何命令时,容器启动后会立即退出,因为它没有默认的前台进程来保持容器运行。你需要提供一个命令来让容器持续运行,例如 top。


如下图:我们使用 -i 选项运行一个容器,可以看到我们输入 ls 命令能够正常执行,能进行交互,只是交互的方式不友好!
在这里插入图片描述
上面就是仅使用 -i 选项的效果,当我们仅使用 -t 选项的时候,会为我们创建一个伪终端,但是没有加上 -i 选项就不能交互了!
在这里插入图片描述
因此,我们需要 -t -i 选项一起使用,才能达到理想的交互效果!
在这里插入图片描述


如下图:我们使用 nginx 镜像启动一个容器,-P 是随机端口映射,我们想要访问到 nginx 的主页就要看一下这个随机映射的端口是什么!
在这里插入图片描述
我们使用 docker ps 命令查看正在运行的容器,发现是主机的 32768 端口映射到了容器的 80 端口。在我们的服务器放行了 32768 的前提下,我们就能够使用公网 IP 加上端口号访问容器中启动的 nginx 服务啦!在本例中就是:47.108.251.0:32768
在这里插入图片描述
显然,这种随机映射的方式很不友好,我们在启动一个容器的时候,应该指定端口映射,而不是让系统来随机分配,这个时候我们就可以使用 -p 选项啦!
在这里插入图片描述
我们指定主机的 80 端口映射到容器的 80 端口,这样我们就可以使用 80 端口来访问容器中启动的 nginx 服务啦!
在这里插入图片描述


如下图:我们在运行容器的时候给容器指定一个名称。
在这里插入图片描述


如下图,我们可以使用 -h 选项指定容器的 hostname。
在这里插入图片描述


如下图:我们可以使用 -e 选项添加环境变量!
在这里插入图片描述


当我们使用 --rm 选项启动容器的时候,当容器退出的时候,我们使用 docker ps 命令是看不到我们之前启动的这个容器的,直接被删除了嘛!
如下图:并没有看到 NAME 为 test_–rm 的容器!
在这里插入图片描述


docker run 命令是由很多很多选项的哈!大家需要了解全部的选项可以到 docker hub 的官网上了解!

docker ps

  • 功能:列出容器。
  • 语法:
    docker ps [OPTIONS]
    
  • 别名:
    docker container ls
    docker container list
    docker container ps
    
  • 参数:
    • -a:显示所有的容器,包括没有运行的。docker ps 默认只列出处于 running 状态的容器嘛。
    • -f:根据过滤条件显示容器。下面是常用的过滤条件:
      • status:状态可以是下面的任意一个: created, restarting, running, removing, paused, exited, 或者 dead。例如:docker ps -f status=running
      • name:根据容器的名字作为过滤条件。
      • id:根据容器 id 作为过滤条件。
    • –format:指定返回的文件模板。json 或者 table 等等。
    • -l:显示最近的一个容器。
    • -n:列出最近创建的 n 个容器。
    • –no-trunc:不截断输出。
    • -q:只显示容器编号。
    • -s:显示文件的大小。
  • 演示:
    这个命令就不演示啦,大家可以自己试一试。

docker create

  • 功能:创建一个新的容器但是不启动它。
  • 语法:
    docker create
<think>好的,我现在需要回答用户关于Docker删除容器命令的问题。首先,用户明确询问删除容器命令,我需要确保给出的答案准确且符合用户的实际需求。 根据提供的引用内容,用户已经有一些参考资料,我需要仔细查看这些引用,提取出相关的命令。比如,引用1提到两种方法:`docker rm $(docker ps -a -q)`和`docker container prune`。这里需要注意第一个命令只能删除未运行的容器,而`prune`命令则是删除所有停止的容器。引用3也提到了类似的命令,使用`docker rm -f`强制删除所有容器,包括运行中的。但用户可能需要谨慎使用强制删除,因为这可能会影响正在运行的服务。 另外,用户可能需要知道如何删除单个或多个容器。引用2和引用4提到了停止容器和删除单个容器命令,比如`docker stop <容器ID>`和`docker rm <容器ID>`。这些基本命令对于日常操作很重要,应该包含在回答中。 还需要考虑用户的使用场景。如果是清理未使用的容器,推荐使用`docker container prune`,因为它更安全且简单。而如果需要删除特定容器,则需要使用`docker rm`加上容器ID或名称。同时,用户可能有批量删除的需求,这时候使用子命令组合如`docker ps -aq`会更高效。 另外,需要注意不同Docker版本的差异。比如引用1提到`docker container prune`适用于1.13及以上版本,而旧版本可能需要其他方法。用户可能不清楚自己的Docker版本,所以需要提醒他们命令的适用性。 总结一下,回答需要涵盖以下内容: 1. 删除单个容器命令,包括停止和删除的步骤。 2. 批量删除所有已停止的容器。 3. 强制删除所有容器(包括运行中的)。 4. 使用`prune`命令清理未使用的容器。 5. 注意事项,如数据丢失风险和版本兼容性。 同时,要确保命令格式正确,使用代码块突出显示,并引用对应的参考资料。最后生成相关问题,帮助用户进一步了解相关操作,比如删除镜像、清理资源等。</think>### Docker删除容器命令详解 Docker删除容器的常用命令可分为**单容器操作**和**批量操作**两类,以下是具体说明: --- #### 一、删除单个容器 1. **停止容器**(若容器正在运行): ```bash docker stop <容器ID或名称> ``` 示例:`docker stop my_nginx` 2. **删除容器**: ```bash docker rm <容器ID或名称> ``` 示例:`docker rm my_nginx` **注意**:需先停止容器才能删除,否则会报错。 --- #### 二、批量删除容器 1. **删除所有已停止的容器**: ```bash docker container prune ``` 该命令会直接清理所有处于停止状态的容器[^1]。 2. **强制删除所有容器(包括运行中的)**: ```bash docker rm -f $(docker ps -a -q) ``` 或通过管道符实现: ```bash docker ps -a -q | xargs docker rm -f ``` **注意**:`-f`参数强制终止运行中的容器并删除[^3]。 --- #### 三、操作对比表 | 场景 | 命令 | 特点 | |-----------------------|-----------------------------------|----------------------------------------| | 删除单个已停止容器 | `docker rm <ID>` | 需手动停止容器 | | 删除所有未运行容器 | `docker container prune` | 安全清理,无需手动筛选[^1] | | 强制删除全部容器 | `docker rm -f $(docker ps -a -q)`| 暴力删除,可能导致数据丢失[^3] | --- #### 注意事项 1. **数据持久化**:删除容器会**丢失容器内未挂载的数据**,若需保留数据,需使用`-v`参数删除关联卷(例如`docker rm -v <ID>`)。 2. **版本兼容性**:`docker container prune`适用于Docker 1.13及以上版本[^1]。 3. **依赖关系**:若容器被其他资源(如网络、存储卷)引用,需先解除依赖。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姬如祎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值