欢迎光临
我们一直在努力

【Docker】容器

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:Docker_秦jh_的博客-CSDN博客

  9efbcbc3d25747719da38c01b3fa9b4f.gif​​​​​

目录

Docker Container(容器)

什么是容器?

容器生活案例

为什么需要容器?

容器的生命周期

容器 OOM

容器异常退出

容器暂停

容器命令清单

容器命令详解

docker create

docker run

docker ps

docker logs

docker attach

docker exec

docker start

docker stop

docker restart

docker kill

docker top

docker stats

docker container inspect

docker port

docker cp

docker diff

docker commit

docker pause

docker unpause

docker rm

docker export

docker wait

docker rename

docker container prune

docker update

容器操作案例

容器交互模式

attached 模式

detached 模式

interactive 模式

常见问题

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

docker import 和 docker load 有什么区别?

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


前言

    💬 hello! 各位铁子们大家好哇。

             今日更新了Docker相关内容     🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

Docker Container(容器)

什么是容器?

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

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

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

容器生活案例

镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样。

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

为什么需要容器?

镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样, 只有安装到主机里面运行起来才能对外提供服务,我们才能使用。

容器带来哪些收益呢,参考我们之前讲解的为什么要虚拟化、容器化。

容器的生命周期

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

  • created:初建状态
  • running:运行状态
  • stopped:停止状态
  • paused: 暂停状态
  • deleted:删除状态
  • 各生命周期之间的转换关系如图所示:

    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 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 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。

    容器命令清单

    容器命令详解

    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 退出的时候自动删除容器

    ○ –restart:自动重启

    样例

    docker create –name mynginx nginx:latest

    docker run

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

    语法

    docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

    关键参数

    ○ -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:自动重启

    样例

    #使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。

    docker run –name mynginx -d nginx:latest

    #使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主 机的 80 端口,主机的目录 /data 映射到容器的 /data。

    docker run -p 80:80 -v /data:/data -d nginx:latest

    docker ps

    功能 列出容器

    语法

    docker ps [OPTIONS]

    关键参数

    ○ -a :显示所有的容器,包括未运行的。

    ○ -f :根据条件过滤显示的内容。

    ○ –format :指定返回值的模板文件。如 json 或者 table

    ○ -l :显示 latest 的容器。

    ○ -n :列出最近创建的 n 个容器。

    ○ –no-trunc :不截断输出。

    ○ -q :静默模式,只显示容器编号。

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

    样例

    docker ps -a

    docker logs

    功能 查看容器日志

    语法

    docker logs [OPTIONS] CONTAINER

    关键参数

    ○ -f ,–follow: 跟踪日志输出

    ○ –since :显示某个开始时间的所有日志

    ○ -t,–timestamps : 显示时间戳

    ○ -n,–tail :仅列出最新 N 条容器日志

    样例

    #跟踪查看容器 mynginx 的日志输出。

    docker logs -f mynginx1

    #查看容器 mynginx 从 2016 年 7 月 1 日后的最新 10 条日志。

    docker logs –since="2016-07-01" –tail=10 mynginx

    docker attach

    功能 连接到正在运行中的容器。

    语法

    docker attach [OPTIONS] CONTAINER

    关键参数

    ○ –sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的 话不会影响容器,否则退出会导致容器退出。

    样例

    显示报文为

    CONTAINER ID: 容器 ID。

    IMAGE: 使用的镜像。

    COMMAND: 启动容器时运行的命令。

    CREATED: 容器的创建时间。

    STATUS: 容器状态。

    PORTS: 容器的端口信息和使用的连接类型(tcp\\udp)。

    NAMES: 自动分配的容器名称。

    docker exec

    功能 在容器中执行命令

    语法

    docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

    关键参数

    ○ -d :分离模式: 在后台运行

    ○ -i :即使没有附加也保持 STDIN 打开

    ○ -t :分配一个伪终端

    ○ -e :设置环境变量

    ○ -u,–user :指定用户 "[:]"

    ○ -w,–workdir:指定工作目录

    样例

    #在容器 mynginx 中以交互模式执行 echo:

    docker exec -it mynginx echo "Hello bit"

    #在容器 mynginx 中以交互模式打开 shell:

    docker exec -it mynginx bash

    #通过 id 进去,docker ps 可以看到容器 id

    docker exec -it 5706674cc67e bash

    docker start

    功能 启动停止的容器

    语法

    docker start [OPTIONS] CONTAINER [CONTAINER…]

    样例

    docker start mynginx

    docker stop

    功能 停止运行的容器

    语法

    docker stop [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

    ○ -s :发送的信号

    样例

    docker stop mynginx

    docker restart

    功能 重启容器

    语法

    docker restart [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

    ○ -s :发送信号

    样例

    docker restart mynginx

    docker kill

    功能 强制退出容器

    语法

    docker kill [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

    ○ -s :发送的信号

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

    样例

    docker kill mynginx

    docker top

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

    语法

    docker top CONTAINER [ps OPTIONS]

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

    样例

    #查看容器进程信息

    docker top mynginx

    docker stats

    功能 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。

    语法

    docker stats [OPTIONS] [CONTAINER…]

    关键参数

    ○ –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: 容器创建的进程或线程数

    样例

    docker container inspect

    功能 查看容器详细信息

    语法

    docker container inspect [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

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

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

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

    样例

    docker container inspect mynginx

    docker port

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

    语法

    docker port CONTAINER [PRIVATE_PORT[/PROTO]]

    样例

    docker port mynginx

    docker cp

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

    语法

    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH| –

    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

    样例

    #将主机/www/目录拷贝到容器 mynginx 的/www 目录下。

    docker cp /www/ mynginx:/www/

    #将容器/www/目录拷贝到主机的/wwwbak 目录下。

    docker cp mynginx:/www/ /wwwbak/

    docker diff

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

    语法

    docker diff CONTAINER

    样例

    docker diff mynginx

    docker commit

    功能 从容器创建一个新的镜像

    语法

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

    参数

    ○ -a :提交的镜像作者;

    ○ -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令

    ○ -m :提交时的说明文字;

    ○ -p :在 commit 时,将容器暂停

    样例

    docker commit c3f279d17e0a maxhou/mynginx:v01

    docker pause

    功能 暂停容器中所有的进程。

    语法

    docker pause CONTAINER [CONTAINER…]

    样例

    docker pause mynginx

    docker unpause

    功能 恢复容器中所有的进程。

    语法

    docker unpause CONTAINER [CONTAINER…]

    样例

    docker unpause mynginx

    docker rm

    功能 删除停止的容器

    语法

    docker rm [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

    ○ -f :通过 SIGKILL 信号强制删除一个运行中的容器。

    样例

    #删除 mynginx 容器

    docker stop mynginx

    docker rm mynginx

    #删除所有停止的容器

    docker rm $(docker ps -a -q)

    docker export

    功能 导出容器内容为 tar 文件

    语法

    docker export [OPTIONS] CONTAINER

    关键参数

    ○ -o:写入到文件

    样例

    #导出 nginx 为 tar

    docker export -o mynginx202203.tar mynginx

    docker wait

    功能 阻塞运行直到容器停止,然后打印出它的退出代码。

    语法

    docker wait CONTAINER [CONTAINER…]

    样例

    docker wait mynginx

    docker rename

    功能 重命名容器

    语法

    docker rename CONTAINER NEW_NAME

    样例

    docker rename mynginx myweb

    docker container prune

    功能 删除所有停止的容器

    语法

    docker container prune [OPTIONS]

    关键参数

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

    样例

    docker container prune

    docker update

    功能 更新容器配置

    语法

    docker update [OPTIONS] CONTAINER [CONTAINER…]

    关键参数

    ○ –cpus:cpu 数量

    ○ –cpuset-cpus :使用哪些 cpu

    ○ –memory :内存限制

    ○ –memory-swap:交换内存

    ○ –cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分 配

    ○ –cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容 器

    样例

    #更新内存

    docker update -m 400m myweb

    容器操作案例

    容器交互模式

    attached 模式

    # 通过 nginx 镜像创建一个容器, 映射 80 端口
    [zsc@VM-8-12-centos ~]$ docker container run -p 80:80 nginx

    -p 80:80 表示端口映射,第一个端口表示映射到宿主机的端口,第二个端口表示映 射到 Docker 容器的端口。

    • 通过上述方式创建容器,就是 attached 模式,这样容器会在前台运行

    • 访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器 的日志会实时的展现到窗口并且占用此端口

    • 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作, 所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式

    • attached 模式仅适用于容器和程序的调试阶段

    detached 模式

    在 docker container run -p 80:80 nginx 命令基础上加一个-d 或者–detach 选项表示 detached 模式, 即在后台执行

    • 在后台运行,启动后只显示容器 ID,并且可以输入任何命令

    • 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多 的误操作

    • 比起 attached 模式更建议使用

    detached 模式转 attached 模式:

    docker container attach XXX

    interactive 模式

    当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就 需要进入到交互式模式。例如创建一个 Ubuntu 容器之后,需要到系统里输入各种 Shell 命令和系统进行交互就需要进入交互式模式才可以完成

    创建运行容器并进入到交互模式

    docker container run -it nginx sh

    ○ -i:保持容器运行。通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自 动进入容器中,退出容器后,容器自动关闭

    ○ -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

    常见问题

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

    既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。

    两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将 保存完整记录,体积也会更大。

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

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

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

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

    赞(0)
    未经允许不得转载:171主机测评 » 【Docker】容器
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址