0


Docker 使用基础(3)—容器

  •                                    ***🎬慕斯主页***:*修仙—别有洞天**
    
                                     ♈️*今日夜电波:*******秒針を噛む—ずっと真夜中でいいのに。********
    
                                                         0:34━━━━━━️💟──────── 4:20
                                                               🔄   ◀️   ⏸   ▶️    ☰  
    
                               💗关注👍点赞🙌收藏*您的每一次鼓励都是对我莫大的支持*😍
    

首先理解几个概念

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

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

    容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

    我们可以理解镜像为Java 或者 C++的基础类,容器是实例化出来的一个个对象,没有用户需要的不一样,里面的内容也就不一样了。

下面看看官方给出的Docker 架构,可以结合此图来理解容器的概念:

为什么需要容器?
    镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。容器带来哪些收益呢,参考我们之前讲解的为什么要虚拟化、容器化。
容器的生命周期

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

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

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

一些特别说明:

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

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

选择操作:

• yes 需要重启,容器执行 start 命令,转为运行状态。

• no 不需要重启,容器转为停止状态。

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

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

容器的命令详解

前面的文章已近对run、ps讲述过了,这里不多介绍。

Docker 的一系列命令提供了对容器生命周期的全面控制,下面是对这些命令的详细解析:

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" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器

2.
docker logs

用途:获取容器的日志输出。
语法

docker logs [OPTIONS] CONTAINER

关键参数

  • -f--follow:跟随日志输出。
  • --since:显示自从某个时间点后的日志。
  • --until:显示直到某个时间点的日志。
  • --tail -n:显示最近 N 行日志。
  • -t,--timestamps :显示时间戳 。

3.
docker attach

用途:将标准输入、输出和错误流连接到一个正在运行的容器。
语法

docker attach [OPTIONS] CONTAINER

关键参数

  • --sig-proxy=true|false:是否代理信号。

如若不使用上述选项,attach后ctrl+c会导致容器退出,如下:

4.
docker exec

用途:在运行中的容器中执行命令。
语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

关键参数

  • -i :即使没有附加也保持 STDIN 打开
  • -u--user:设置用户 ID 或用户名。
  • -w,--workdir:指定工作目录
  • -e :设置环境变量
  • -t :分配一个伪终端
  • -d :分离模式: 在后台运行

5.
docker start

用途:启动一个已创建但未运行的容器。
语法

docker start [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • --attach:连接到容器的标准输入/输出/错误

6.
docker stop

用途:停止一个正在运行的容器。
语法

docker stop [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • --time-t:等待容器停止的秒数。

7.
docker restart

用途:重启容器。
语法

docker restart [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • --time-t:等待容器停止的秒数。

8.
docker kill

用途:强制停止一个正在运行的容器。
语法

docker kill [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • SIGNAL:发送的信号,默认为 SIGKILL。

9.
docker top

用途:显示容器内运行的进程。
语法

docker top CONTAINER

无需参数。

10.
docker stats

用途:显示容器的资源使用情况。
语法

docker stats [OPTIONS] [CONTAINER...]

关键参数

  • -a--all:显示所有容器的统计信息。
  • --format :指定返回值的模板文件。如 table,json
  • --no-stream :展示当前状态就直接退出了,不再实时更新。
  • --no-trunc :不截断输出

返回报文

CONTAINER ID 与 NAME: 容器 ID 与名称。

CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。

MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。

NET I/O: 容器通过其网络接口发送和接收的数据量。

BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。

PIDs: 容器创建的进程或线程数。

如下为:docker stats --format json

11.
docker container inspect

用途:显示容器的详细信息。
语法

docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

关键参数

○ -f :指定返回值的模板文件。如 table、 json

○ -s :显示总的文件大小

12.
docker port

用途:显示容器的端口映射。
语法

docker port CONTAINER PRIVATE_PORT[/PROTO]

无需参数。

13.
docker cp

用途:在容器和本地文件系统之间复制文件或目录。
语法

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

关键参数

  • -L:保持符号链接。

样例

#将主机/www/目录拷贝到容器 mynginx 的/www 目录下。
docker cp /www/ mynginx:/www/ 
#将容器/www/目录拷贝到主机的/wwwbak 目录下。
docker cp mynginx:/www/ /wwwbak/
14.
docker diff

用途:显示容器文件系统的更改。
语法

docker diff CONTAINER

无需参数。

15.
docker commit

用途:将容器的更改提交为新的镜像。
语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

关键参数

  • -m--message:提交的信息。
  • -a--author:作者信息。
  • -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令
  • -p :在 commit 时,将容器暂停。

16.
docker pause

用途:暂停容器的所有进程。
语法

docker pause [OPTIONS] CONTAINER [CONTAINER...]

无需参数。

17.
docker unpause

用途:恢复已暂停的容器。
语法

docker unpause [OPTIONS] CONTAINER [CONTAINER...]

无需参数。

18.
docker rm

用途:删除一个或多个容器。
语法

docker rm [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • -f--force:强制删除运行中的容器。

19.
docker export

用途:将容器的内容导出为 tar 归档。
语法

docker export CONTAINER > archive.tar

关键参数

  • -o:写入到文件

20.
docker wait

用途:阻塞直到容器停止,然后返回退出代码。
语法

docker wait [OPTIONS] CONTAINER

无需参数。

21.
docker rename

用途:重命名一个容器。
语法

docker rename CONTAINER NEW_NAME

无需参数。

22.
docker container prune

用途:删除所有已停止的容器。
语法

docker container prune [OPTIONS]

关键参数

  • -f, --force:不提示是否进行确认

23.
docker update

用途:更新容器的资源限制。
语法

docker update [OPTIONS] CONTAINER [CONTAINER...]

关键参数

  • --memory:设置容器的内存限制。
  • --cpus:设置容器的 CPU 份额。
  • --cpuset-cpus :使用哪些 cpu。
  • --memory-swap:交换内存 。
  • --cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。
  • --cpu-quota: 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。docker update 命令用于调整一个或多个正在运行的容器的资源配置,如CPU份额、内存限制、重启策略等。下面是几个使用 docker update 的例子:

例子

更新容器的CPU份额:

假设你有一个容器,其ID是

abcd1234

,你想增加它的CPU份额,可以使用以下命令:

docker update --cpu-shares 512 abcd1234

这会将容器的CPU份额设置为512。CPU份额是用来决定容器在与其他容器竞争CPU时间时的优先级。

更新容器的内存限制:

如果想限制容器使用的内存,可以使用

--memory

-m

选项。例如,将容器

abcd1234

的最大可用内存限制为512MB,可以这样操作:

docker update --memory 512M abcd1234

更新容器的重启策略:

你可能希望容器在意外停止后自动重启。为了设置容器

abcd1234

的重启策略为总是重启,可以使用以下命令:

docker update --restart always abcd1234

这将确保当容器意外终止时,Docker守护进程会尝试自动重启它。

更新多个容器的配置:

你也可以同时更新多个容器的配置。例如,更新两个容器

abcd1234

efgh5678

的CPU份额和内存限制:

docker update --cpu-shares 256 --memory 256M abcd1234 efgh5678

更新容器的Block IO权重:

对于磁盘I/O,你可以设置容器的Block IO权重,权重范围在10到1000之间,0表示禁用。例如,将容器

abcd1234

的Block IO权重设置为500:

docker update --blkio-weight 500 abcd1234

请注意,不是所有的配置都可以在容器运行时更新。例如,你不能更新已经运行的容器的网络配置或更改其基础镜像。此外,某些选项(如

--kernel-memory

)在较新的Docker版本中可能已经被弃用。

在执行任何

docker update

命令之前,确保了解你正在更改的配置的具体含义,以及这些更改如何影响容器的性能和稳定性。

容器批量处理技巧

docker container ls

命令(通常简写为

docker ps

)用于列出系统上当前运行的Docker容器。但是,

docker container ls

是更现代且推荐使用的语法,因为它更清晰地表明了你正在操作的是容器。这两个命令在功能上是相同的,只是语法略有不同,

docker container ls

更符合Docker命令的一致性设计。

基本语法

docker container ls [OPTIONS]

选项说明

  • -a, --all: 显示所有容器,包括未运行的。如果不加这个选项,默认只显示正在运行的容器。
  • -f, --filter: 用于过滤输出。例如,你可以通过名字、状态或其他属性过滤容器。
  • --format: 设置输出格式,可以使用Go模板语言来定制输出的样式。
  • -l, --latest: 显示最近创建的容器。
  • --no-trunc: 不截断输出,完整显示所有信息。
  • --quiet, -q: 只显示容器的ID。

输出列说明

默认情况下,

docker container ls

docker ps

的输出包含以下列:

  • CONTAINER ID: 容器的唯一标识符。
  • IMAGE: 创建容器的镜像名称。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器创建的时间。
  • STATUS: 容器的状态,如运行中(Up)、已退出(Exited)等。
  • PORTS: 已映射的端口,如果有的话。
  • NAMES: 分配给容器的名称。

示例

  • 列出所有容器(包括未运行的):
docker container ls -a
  • 只显示容器的ID:
docker container ls -q
  • 根据名字过滤容器:
docker container ls --filter name=myapp
  • 自定义输出格式:
docker container ls --format "table {{.Names}}\t{{.Status}}\t{{.RunningFor}}"

理解完前面的操作,那么我们再结合前面所提到的命令,可以做到如下的容器批处理:

docker stop `docker ps -q`
docker start `docker ps -aq`

容器自动重启

容器重启选项如下:

docker run --restart=no [容器名] :默认值不自动重启

docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃

docker run --restart=always [容器名] :always 容器退出时总是重启

docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器

如果容器启动时没有设置–restart 参数,则通过下面命令进行更新:docker update --restart=always [容器名]

需要注意的是:

当一个Docker容器配置了自动重启策略为always时,确实意味着容器会在任何情况下自动重启,包括容器正常或异常退出之后。这意味着,一旦容器停止运行,Docker守护进程会自动检测并重新启动它。

然而,尽管always策略会让容器在停止后立即重启,你仍然可以通过以下几种方式真正地阻止容器的自动重启:

1、使用docker stop命令。

2、使用docker update命令来更改容器的重启策略,例如:

docker update --restart=no <container-id-or-name>

3、删除容器: 如果你不打算再使用这个容器,可以使用docker rm命令来删除容器。这将彻底阻止容器的自动重启,因为你已经删除了容器本身。

删除运行中的容器需要加上-f或--force选项:

docker rm -f <container-id-or-name>

一些常见的问题

docker create、 docker start 和 docker run 有什么区别?

docker create 命令从 Docker 映像创建一个全新的容器。但是,它不会立即运行它。

docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器,则可以使用此命令启动它。docker run 命令是创建和启动的组合,因为它创建了一个新容器并立即启动它。实际上,如果 docker run 命令在您的系统上找不到上述映像,它可以从 Docker Hub 中提取映像。

docker import 和 docker load 有什么区别?

想要了解 docker load 与 docker import 命令的区别,还必须知道 docker save与 docker export 命令:

• docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。

• docker export container_id:将一个容器导出为文件,再使用 dockerimport 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用docker import 命令来导入一个容器快照到本地镜像库。两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

docker rm & docker rmi & docker prune 的差异?

docker rm : 删除一个或多个容器

docker rmi : 删除一个或多个镜像

docker prune: 用来删除不再使用的 docker 对象


     **             感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!** 

                                   ![](https://img-blog.csdnimg.cn/a2296f4aa7fd45e9b1a1c44f9b8432a6.gif)​

** 给个三连再走嘛~ **

标签: docker 容器 运维

本文转载自: https://blog.csdn.net/weixin_64038246/article/details/140352787
版权归原作者 慕斯( ˘▽˘)っ 所有, 如有侵权,请联系我们删除。

“Docker 使用基础(3)—容器”的评论:

还没有评论