玩转Docker(四):容器指令、生命周期、资源限制、容器化支持、常用命令

一、容器指令

1.运行

按用途容器大致可分为两类:服务类容器和工具类的容器。

  • 服务类容器:

服务类容器以daemon的形式运行,对外提供服务,比如Web Server、数据库等。
通过 -d以后台方式启动这类容器是非常合适的。
如果要排查问题,可以通过exec -it进入容器。

创建并启动

docker run -d webserver-image

以交互方式启动一个已经创建了的容器

docker exec -it webserver-image /bin/bash
  • 工具类容器:

工具类容器通常能给我们提供一个临时的工作环境,通常以run -it方式运行。执行exit退出终端,同时容器停止。
工具类容器多使用基础镜像,例如busybox、debian、ubuntu等。

创建并启动

docker run -it ubuntu /bin/bash
  • restart参数:
docker run -d --restart=always webserver-image

--restart=always意味着无论容器因何种原因退出(包括正常退出),都立即重启;该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次

2.启动/停止/重启

当你使用 Docker 时,你会频繁地需要停止、启动和重启容器。以下是这些操作的详细说明:

  1. 停止容器 (docker stop):

    • 用法:docker stop <container_name_or_id>
    • 作用:停止指定的容器。Docker 会发送一个 SIGTERM 信号给容器,然后等待一定时间(默认为10秒)让容器进行清理工作。如果容器在这段时间内没有停止,Docker 会发送一个 SIGKILL 信号强制终止容器。
  2. 启动容器 (docker start):

    • 用法:docker start <container_name_or_id>
    • 作用:启动之前停止的容器。这个命令会重新启动已经存在的容器,不会创建新的容器实例。
  3. 重启容器 (docker restart):

    • 用法:docker restart <container_name_or_id>
    • 作用:重启指定的容器。这个命令会先停止容器,然后再启动它。

这些命令可以帮助你有效地管理 Docker 容器的生命周期,让你能够灵活地控制容器的运行状态。

3.暂停/恢复

当你使用 Docker 时,你可能会需要暂停和恢复容器的运行。以下是 docker pausedocker unpause 命令的详细说明:

  1. 暂停容器 (docker pause):

    • 用法:docker pause <container_name_or_id>
    • 作用:暂停指定的容器。这个命令会暂停容器内所有的进程,使其停止运行。暂停后,容器内的所有进程都会被挂起,直到使用 docker unpause 命令来恢复它们的运行。
  2. 恢复容器 (docker unpause):

    • 用法:docker unpause <container_name_or_id>
    • 作用:恢复之前暂停的容器。这个命令会使被暂停的容器内的所有进程恢复运行。

这些命令可以帮助你在需要时暂停和恢复容器的运行,让你能够更灵活地控制容器的状态。

4.删除

docker rm 命令用于删除一个或多个已经停止的容器。以下是该命令的详细说明:

  • 用法:docker rm <container_name_or_id>
  • 作用:删除指定的容器。如果要删除多个容器,可以在命令中列出它们的名称或 ID。
  • 示例:docker rm my_containerdocker rm container1 container2
  • 注意:要删除正在运行的容器,需要先停止它们,然后再使用 docker rm 命令删除。

这个命令可以帮助你清理不再需要的容器,释放系统资源。在使用之前,请确保你真的不再需要这些容器,因为删除后将无法恢复。

docker rm是删除容器,而docker rmi是删除镜像。

二、生命周期

Docker 容器的生命周期包括以下几种状态的切换:

  1. 创建(Created):当你使用 docker create 命令创建一个容器时,容器就处于创建状态。在这个阶段,容器已经被创建,但还没有被启动。

  2. 启动(Running):当你使用 docker start 命令启动一个已经创建的容器时,容器就会进入运行状态。在这个阶段,容器内的进程正在运行。

  3. 暂停(Paused):你可以使用 docker pause 命令来暂停一个正在运行的容器,使得容器内的所有进程都会被挂起。

  4. 恢复(Unpaused):使用 docker unpause 命令可以恢复一个被暂停的容器,使得容器内的进程继续运行。

  5. 停止(Stopped):当你使用 docker stop 命令停止一个运行中的容器时,容器会进入停止状态。在这个阶段,容器内的进程会被发送 SIGTERM 信号,然后等待一段时间后被强制终止。

  6. 删除(Deleted):使用 docker rm 命令可以删除一个已经停止的容器,释放其占用的系统资源。

这些状态之间的切换反映了容器在其生命周期中的不同阶段,理解这些状态的切换有助于更好地管理和维护 Docker 容器。

三、资源限制

1.内存限额

容器可使用的内存包括两部分:物理内存和swap。

-m或 --memory:设置内存的使用限额,例如100MB,2GB。默认情况下值为-1,即无上限。
--memory-swap:设置内存+swap的使用限额。默认情况下值为-1,即无上限。如果在启动容器时只指定 -m而不指定 --memory-swap,那么 --memory-swap默认为 -m的两倍。
--vm:启动内存工作线程数量。
--vm-bytes:每个线程分配多大内存

  • 示例:
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1--vm-bytes 280M

2.CPU限额

默认设置下,所有容器可以平等地使用host CPU资源并且没有限制。
Docker可以通过 -c或 --cpu-shares设置容器使用CPU的权重。如果不指定,默认值为1024。

与内存限额不同,通过 -c设置的cpu share是一个相对的权重值。某个容器最终能分配到的CPU资源取决于它的cpu share占所有容器cpu share总和的比例。

  • 示例:
    containerA的cpu share 1024,是containerB的两倍。当两个容器都需要CPU资源时,containerA可以得到的CPU是containerB的两倍。
docker run --name "container_A" -c 1024 ubuntu docker run --name "container_B" -c 512 ubuntu

3.磁盘读写带宽限额

bps是byte per second,每秒读写的数据量。
iops是io per second,每秒IO的次数。

可通过以下参数控制容器的bps和iops:
● --device-read-bps:限制读某个设备的bps。
● --device-write-bps:限制写某个设备的bps。
● --device-read-iops:限制读某个设备的iops。
● --device-write-iops:限制写某个设备的iops。

  • 示例:
    限制容器对 /dev/sda 设备的写入带宽为 1MB/s。
docker run --device-write-bps=/dev/sda:1mb my_container

还可以通过设置 --blkio-weight参数来改变容器block IO的优先级。
–blkio-weight与 --cpu-shares类似,设置的是相对权重值,默认为500。
在下面的例子中,containerA读写磁盘的带宽是containerB的两倍。

  • 示例:
docker run -it --name container_A --blkio-weight 600 ubuntu docker run -it --name container_B --blkio-weight 300 ubuntu

四、cgroup和namespace

Docker 使用了 Linux 内核提供的两个重要特性来实现容器化:cgroup(Control Groups)和 namespace。以下是对它们的详细说明:

  1. cgroup(控制组)

    • cgroup 是 Linux 内核提供的一种机制,用于限制、账户和隔离一个或多个进程的资源使用。通过 cgroup,你可以限制容器对 CPU、内存、磁盘 I/O 等资源的使用。
    • 在 Docker 中,cgroup 被用来限制容器的资源使用,例如限制 CPU 使用率、内存使用量、磁盘 I/O 带宽等。
    • 通过 cgroup,Docker 可以确保容器在运行时不会过度占用宿主机的资源,从而实现资源的隔离和管理。
  2. namespace(命名空间)

    • namespace 是 Linux 内核提供的另一种机制,用于隔离系统资源,使得在一个命名空间中的进程看到的资源与其他命名空间中的进程是隔离的。
    • 在 Docker 中,namespace 被用来隔离容器的进程空间、网络空间、文件系统空间等。每个容器都有自己独立的命名空间,使得它们看到的系统资源是隔离的。
    • 通过 namespace,Docker 可以实现容器的隔离,使得每个容器都拥有自己独立的运行环境,互相之间不会产生影响。

综合起来,cgroup 和 namespace 是 Docker 实现容器化的重要基础,它们使得 Docker 能够实现资源的隔离、管理和容器的隔离运行。

五、常用命令

最后,总结一下docker容器的常用命令:

  1. create:创建容器

    • 用法:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    • 说明:使用指定的镜像创建一个新的容器,但不启动它。
  2. run:运行容器

    • 用法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • 说明:创建并启动一个新的容器,可以指定各种选项和参数。
  3. pause:暂停容器

    • 用法:docker pause CONTAINER
    • 说明:暂停指定的容器内所有的进程。
  4. unpause:取消暂停继续运行容器

    • 用法:docker unpause CONTAINER
    • 说明:取消暂停指定的容器,使得容器内的进程继续运行。
  5. stop:发送SIGTERM停止容器

    • 用法:docker stop [OPTIONS] CONTAINER
    • 说明:发送 SIGTERM 信号停止指定的容器,等待一定时间后再发送 SIGKILL 信号强制停止。
  6. kill:发送SIGKILL快速停止容器

    • 用法:docker kill [OPTIONS] CONTAINER
    • 说明:发送 SIGKILL 信号快速停止指定的容器。
  7. start:启动容器

    • 用法:docker start [OPTIONS] CONTAINER
    • 说明:启动之前停止的容器。
  8. restart:重启容器

    • 用法:docker restart [OPTIONS] CONTAINER
    • 说明:重启指定的容器。
  9. attach:attach到容器启动进程的终端

    • 用法:docker attach [OPTIONS] CONTAINER
    • 说明:attach 到正在运行的容器中的主进程的标准输入、输出和错误输出。
  10. exec:在容器中启动新进程,通常使用"-it"参数

    • 用法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    • 说明:在运行的容器中执行新的命令。
  11. logs:显示容器启动进程的控制台输出,用"-f"持续打印

    • 用法:docker logs [OPTIONS] CONTAINER
    • 说明:获取容器的日志输出,使用 -f 选项可以持续地打印日志。
  12. rm:从磁盘中删除容器

    • 用法:docker rm [OPTIONS] CONTAINER
    • 说明:删除指定的容器,释放其占用的磁盘空间。

这些命令涵盖了 Docker 容器的创建、管理、运行和监控等方方面面,是使用 Docker 进行容器化应用开发和部署的重要工具。

相关推荐

  1. Docker容器命令

    2023-12-17 07:48:04       11 阅读
  2. docker容器创建命令

    2023-12-17 07:48:04       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-17 07:48:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-17 07:48:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-17 07:48:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-17 07:48:04       18 阅读

热门阅读

  1. 7个精选的矢量数据库和搜索引擎项目

    2023-12-17 07:48:04       43 阅读
  2. Qt容器QToolBox工具箱

    2023-12-17 07:48:04       36 阅读
  3. es6 中的箭头函数和普通函数有什么区别?

    2023-12-17 07:48:04       31 阅读
  4. Python 迭代器详解:遍历数据的高效利器

    2023-12-17 07:48:04       31 阅读
  5. 基于JNI 实现 嵌套 List 类型参数解析

    2023-12-17 07:48:04       35 阅读
  6. SOEM主站开发篇(5):CMakeLists.txt文件解析

    2023-12-17 07:48:04       32 阅读
  7. Julia调用Matlab, Python以及R的微分方程求解器

    2023-12-17 07:48:04       40 阅读
  8. 【人生感悟】涅槃重生

    2023-12-17 07:48:04       43 阅读