当前位置: 首页 > news >正文

【Docker 05】Container - 容器

🌈 一、容器介绍

⭐ 01. 什么是容器

  • 镜像(image)容器(Container)的关系,就像是面向对象程序设计中的实例一样。
  • 镜像是静态的只读文件,而容器是镜像运行起来的实体,容器带有运行时需要的可写文件层。
  • 容器中的进程属于运行状态,即容器内运行着真正的应用进程,容器有 5 种状态,分别是:创建、启动、停止、删除、暂停。

容器的本质

  • 容器本质上是在主机上运行的一个进程,但是容器有着自己独立的命名空间隔离和资源限制(容器可以拥有自己的 root 文件系统、网络配置、进程空间、用户 ID 空间)。容器内的进程运行在一个隔离的环境中,在容器内部无法看到主机上的进程、环境变量、网络等信息。
  • 和镜像一样,容器也采用分层存储。每个容器在运行时,是以镜像为基础层,在上面创建一个当前容器的存储层,这个存储层被称为容器存储层

⭐ 02. 为什么需要容器

  • 镜像只是一个静态的文件,并不能提供服务。就好比一个装着操作系统(OS)的光盘一样,这个光盘就是一个静态的文件,并不能提供服务。只有将这个光盘中的 OS 安装到主机里运行起来才可以对外提供服务。

容器的优势

  1. 资源利用率高:可以将利用率较低的服务器资源进行整合,用更少的硬件资源运行更多的业务。
  2. 环境标准化:镜像打包了一个应用需要的所有的依赖信息,解决了环境差异化的问题,而容器是在镜像的基础上添加的一层,天然具备环境标准化的能力。
  3. 资源弹性伸缩:借助容器能够实现资源的控制(控制每个容器能够使用的内存、CPU 等资源)。
  4. 差异化环境提供:假设当前有两个服务,分别要在 Ubuntu 和 Centos 上,此时容器就可以很好的提供多种不同的环境。
  5. 沙箱安全:容器内的文件与主机是隔离的,对容器内的文件进行操作,或者容器内的应用崩了不会影响到宿主机。
  6. 比虚拟机更轻量、启动更快:容器它就是一个进程,不用开机关机什么的。
  7. 维护和扩展容易:容器依赖于镜像技术,使得在应用重复部分的复用更加容器,也让应用的维护更新更加简单

⭐ 03. 容器的生命周期

  • 容器的生命周期指的是容器可能处于的状态,分别有以下 5 种状态:
    1. 初建:created
    2. 运行:running
    3. 停止:stopped
    4. 暂停:paused
    5. 删除:deleted

1. 各生命周期之间的转换关系

image-20250614224224384

说明
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,此时 Linux 会杀死最占内存的容器。如果一个容器因为触发了 OOM 机制而被干掉了,它是被系统而不是 Docker 干掉的。
container process exited异常终止:出现容器被终止后,进入 restart? 选择操作;Yes 则需要重启,执行 start 命令,转为运行状态;No 则不需要重启,容器转为停止状态。

2. 容器 OOM

  • Docker 在处理 OOM 事件时,分别有以下 3 种情况:
  1. 如果容器中的应用耗尽了主机系统分配给该容器的内存限制,就会触发 OOM 事件。此时的容器并不是被 Docker 关闭的,而是被宿主机操作系统关闭的。
  2. 如果用户并不想关闭这个容器,可以通过 --oom-kill-disable 来禁用 OOM-Killer。注:在使用该参数时,如果使用 -m 设置了该容器的内存上限,一旦该容器达到了内存上限,主机不会关闭该容器,但也不会继续给该容器分配资源。
  3. 如果用户使用了 --oom-kill-disable ,但没有使用 -m 选项来设定资源上限,主机就会尽可能的为该容器分配资源,即主机有多少资源,容器就能占多少。

3. 容器异常退出

  • 每个容器内部都有一个 Init 进程,容器中的其他所有进程都是该进程的子进程。如果某个子进程因为某种原因退出了,它的父进程也会同步退出,直到 Init 进程也退出位置。如果 Init 进程也退出了,则表示该容器被关闭了。
  • Docker 目前没办法直到此时的进程退出是不是正常退出,容器一旦出现关闭情况,Docker 就会尝试将该容器由 Stopped 状态转换为 Running 状态(前提:容器被设置了 --restart 参数,否则会保持在停止状态)。

4. 容器暂停

  • 容器被 Docker 剥夺了 CPU 资源,但其他资源(如 Memory、Network)还保留没动。
  • 失去了 CPU 资源的进程是不会被主机的内核系统所调度的,此时容器就处于暂停状态。

🌈 二、容器命令

命令别名功能
01docker createdocker container create创建容器
02docker rundocker container run运行容器
03docker psdocker container ps查看正在运行的进程
04docker logsdocker container logs查看日志
05docker attachdocker container attach连接到正在运行的容器
06docker execdocker container exec在运行的容器中执行命令
07docker startdocker container start启动容器
08docker stopdocker container stop停止容器
09docker restartdocker container restart重启容器
10docker killdocker container kill杀死容器
11docker topdocker container top查看某个容器的资源占用
12docker statsdocker container stats查看资源占用信息
13docker container inspect查看容器的详细信息
14docker portdocker container port查看容器的端口映射
15docker cpdocker container cp在容器和宿主机之间拷贝
16docker diffdocker container diff检查容器里文件结构的更改
17docker commitdocker container commit将镜像提交为容器
18docker pausedocker container pause暂停容器进程
19docker unpausedocker container unpause接触暂停,继续运行容器
20docker rmdocker container rm删除容器
21docker exportdocker container export将容器导出为 tar
22docker waitdocker container wait阻止 1 / n 个容器停止,然后打印退出代码
23docker renamedocker container rename重命名容器
24docker container prune删除停止的容器
25docker updatedocker container update更新容器配置

⭐ 01. docker create

  • 用于创建一个新的容器,但是不启动它。

1. 基础语法

shelldocker create [options] image [command] [arg...]
options 的可选项功能
-i以交互模式运行容器,通常与 -t 同时使用
-P随机端口映射:容器内部的端口随机映射到主机的端口
-p指定端口映射:格式为 主机端口:容器端口
-t为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb"为容器指定一个名称
-h"mars"指定容器的 hostname
-e username="ritchie"设置环境变量
--cpuset-cpus="0-2" 或 --cpuset-cppus="0,1,2"绑定容器到指定的 CPU 核上运行
-m设置容量使用内存最大值
--network="bridge"指定容器的网络连接类型
--link=[容器名]添加链接到另一个容器,可以访问另一个容器的网络
--volume 或 -v绑定一个卷
--rmshell 退出的时候自动删除容器
--restart自动重启容器

2. 使用示例

  1. 使用 nginx:1.24.0 镜像创建一个名为 CoffeeCat 的容器,并将宿主机 8050 端口映射到容器的 80 端口上。
docker create --name CoffeeCat -p 8050:80 nginx:1.24.0

image-20250615100510272

  1. 再使用 docker start CoffeeCat 启动这个容器。

image-20250615100815160

  1. 在浏览器上访问本主机的 8050 端口,可以看到 nginx 已经在跑了。

image-20250615101008163

⭐ 02. docker run

  • 用于创建一个新的容器并运行一个默认 / 指定的命令。

1. 基础语法

docker run [options] image [command] [arg...]
options 的可选项功能
-d在后台运行容器,并返回容器的 ID;比 docker create 多了这个参数(不带该参数默认在前台)
-i以交互模式运行容器,通常与 -t 同时使用
-P随机端口映射:容器内部的端口随机映射到主机的端口
-p指定端口映射:格式为 主机端口:容器端口
-t为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb"为容器指定一个名称
-h"mars"指定容器的 hostname
-e username="ritchie"设置环境变量
--cpuset-cpus="0-2" 或 --cpuset-cppus="0,1,2"绑定容器到指定的 CPU 核上运行
-m设置容量使用内存最大值
--network="bridge"指定容器的网络连接类型
--link=[容器名]添加链接到另一个容器,可以访问另一个容器的网络
--volume 或 -v绑定一个卷
--rmshell 退出的时候自动删除容器
--restart自动重启容器

2. 使用示例

  • 使用 Docker 镜像 nginx:latest 以后台模式启动一个容器,并将该容器命名为 CoffeeCat2
docker run --name CoffeeCat2 -d nginx:latest

image-20250615142946346

  • 使用 Docker 镜像 nginx:latest 以后台模式启动一个容器,将容器的 80 端口映射到主机的 8060 端口,将主机的 /data 目录映射到容器的 /data 目录。
docker run -p 8060:80 -v /data:/data -d nginx:latest

image-20250615143206111

⭐ 03. docker ps

  • 该命令用于列出容器

1. 基础语法

docker ps [options]
options 的可选项功能
-a显示所有的容器,包括未运行的
-f根据条件过滤显示的内容
--format指定返回值的模板文件(如 json 或 table,默认为 table)
-l显示 Latest 的容器
-n列出最近创建的 n 个容器
--no-trunc不截断输出
-q静默模式,只显示容器的编号
-s显示总的文件大小

2. 使用示例

  • 显示所有的容器(包括未运行的)。
docker ps -a

image-20250615150534120

  • 显示容器名包含了 CoffeeCat 的所有容器。
docker ps -f name=CoffeeCat

image-20250615150830079

⭐ 04. docker logs

  • 该命令用于查看容器的日志信息。

1. 基础语法

docker logs [options] container
options 的可选项功能
-f 或 --follow持续跟踪日志输出
--since显示某个时间开始的所有日志
-t 或 --timestamps显示时间戳
-n 或 --tail仅列出最新的 n 条容器日志

2. 使用示例

  • 持续跟踪查看容器 CoffeeCat 的日志输出
docker logs -f CoffeeCat

image-20250615151845971

  • 查看容器 CoffeeCat 从 2025 年 6 月 14 日后的最新 5 条日志。
docker logs --since="2025-06-14" --tail=5 CoffeeCat

image-20250615152035606

⭐ 05. docker attach

  • 该命令用于连接到某个正在运行的容器。

1. 基础语法

docker attach [options]  container
options 的可选项功能
--sig-proxy是否将所有信号代理,默认为 true(退出时会导致容器退出),如果设置为 false,退出时不会影响容器。

2. 使用示例

  1. 连接到正在运行的 CoffeeCat 容器,当参数为默认的 true 时,按下 ctrl + c 会将容器 CoffeeCat 杀死。
docker attach CoffeeCat

image-20250615153216140

  1. 如果将参数设置为 false 时,按下 ctrl + c 并不会将容器 CoffeeCat2 杀死。
docker attach --sig-proxy=false CoffeeCat2

image-20250615153337367

⭐ 06. docker exec

  • 用于在容器中执行命令。

1. 基础语法

docker exec [options] container command [arg...]
options 的可选项功能
-d分离模式,在后台运行
-i即使没有附加也保持 stdin 的开启
-t分配一个伪终端
-e设置环境变量
-u 或 user指定某个用户去运行
-w 或 --workdir指定工作目录

2. 使用示例

  • 在容器 CoffeeCat 中,以交互模式执行 echo
docker exec -it CoffeeCat echo "hello world"

image-20250615154608835

  • 在容器 CoffeeCat 中,以交互模式打开 shell。如果想要退出的话,输入 exit 即可。
docker exec -it CoffeeCat bash

image-20250615154709076

⭐ 07. docker start

  • 用于启动 1 / n 个停止的容器

1. 基础语法

docker start [options] container [container...]

2. 使用示例

  • 启动 CoffeeCat 和 CoffeeCat2 两个容器。
docker start CoffeeCat CoffeeCat2

image-20250615155533192

⭐ 08. docker stop

  • 用于停止 1 / n 个正在运行的容器。

1. 基础语法

docker stop [options] container [container...]
options 的可选项功能
-s发送 SIGTERM 信号

2. 使用示例

  • 停止正在运行的 CoffeeCat 和 CoffeeCat2 容器。
docker stop CoffeeCat CoffeeCat2

image-20250615160052166

⭐ 09. docker restart

  • 用于重新启动 1 / n 个容器(将容器先停止,再启动)。

1. 基础语法

docker restart [options] container [container...]
options 的可选项功能
-s发送的信号

2. 使用示例

docker restart CoffeeCat

⭐ 10. docker kill

  • 用于强制退出容器

1. 基础语法

docker kill [options] container [container...]
options 的可选项功能
-s发送 SIGKILL 信号

2. 使用示例

docker kill CoffeeCat

⭐ 11. docker top

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

1. 基础语法

docker top container [ps options]

2. 使用示例

docker top CoffeeCat

image-20250615160958640

⭐ 12. docker stats

  • 用于显示容器资源的使用情况(CPU、内存、网络 I/O 等)。

1. 基础语法

docker stats [options] [container...]
options 的可选项功能
--all 或 -a显示所有容器的资源使用情况(包括未运行的)
--format指定返回值的模板文件(如 table、json)
--no-stream展示完当前状态就直接退出,不实时更新
--no-trunc不截断输出

2. 使用示例

  • 列出所有正在运行的容器信息。
docker stats

image-20250615161618067

返回报文说明
CONTAINER ID容器 ID
NAME容器名称
CPU %容器使用的 CPU 的百分比
MEM USAGE / LIMIT容器正在使用的总内存,以及被允许使用的内存总量
MEM %容器使用的内存的百分比
NET I/O容器通过其网络接口发送和接收的数据量
BLOCK I/O容器从主机上的块设备读取和写入的数据量
PIDS容器创建的进程 / 线程数

⭐ 13. docker container inspect

  • 用于查看容器的详细信息(如 IP、启动命令、使用的镜像等)。

1. 基础语法

docker container inspect [options] container [container...]
options 的可选项功能
-f指定返回值的模板文件(如 table、json)
-s显示总的文件大小

2. 使用示例

docker container inspect CoffeeCat

image-20250615163900220

⭐ 14. docker port

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

1. 基础语法

docker port container [private_port[/proto]]

2. 使用示例

docker port CoffeeCat

image-20250615164939694

⭐ 15. docker cp

  • 用于再容器和宿主机之间拷贝文件。

1. 基础语法

# 将容器内的文件拷贝到宿主机中
docker cp [options] container:src_path dest_path|-
# 将宿主机中的文件拷贝到容器内
docker cp [options] src_path|- container:dest_path

2. 使用示例

  • 将主机的 /www/ 目录拷贝到 CoffeeCat 的 /www 目录下。
docker cp /www/ CoffeeCat:/www/
  • 将 CoffeeCat 容器的 /www/ 目录拷贝到主机的 /wwwbak 目录下。
docker cp CoffeeCat:/www/ /wwwbak/

⭐ 16. docker diff

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

1. 基础语法

docker diff container

2. 使用示例

docker diff CoffeeCat

image-20250615170121555

说明
Aadd:新增的内容
Cchange:该文件被修改过
Ddelete:被删除的文件

⭐ 17. docker commit

  • 用于将运行中的容器提交为一个新的镜像

1. 基础语法

docker commit [options] container [repository[:tag]]
options 的可选项功能
-a提交的镜像作者
-c使用 Dockerfile 指令来创建镜像,可以修改启动指令
-m提交时的说明文件,用于描述提交的这个镜像
-p在 commit 时,将该容器暂停

2. 使用示例

  • 将正在运行的 CoffeeCatForCommit 容器提交为一个名为 mywebsite:v1.0 的镜像。
docker commit CoffeeCatForCommit mywebsite:v1.0

image-20250615171453896

⭐ 18. docker pause

  • 用于暂停容器中所有的进程(剥夺容器内进程的 CPU 时间片)。

1. 基础语法

docker pause container [container...]

2. 使用示例

docker pause CoffeeCat

image-20250615172846432

⭐ 19. docker unpause

  • 用于恢复容器中所有被暂停的进程。

1. 基础语法

docker unpause container [container...]

2. 使用示例

docker unpause CoffeeCat

image-20250615173023142

⭐ 20. docker rm

  • 用于删除处于停止状态的容器

1. 基础语法

docker rm [options] container [container]
options 的可选项功能
-f通过 SIGKILL 信号强制删除运行中的容器

2. 使用示例

  • 删除 1 / n 个容器(这里就删除 CoffeeCat2 容器)
docker stop CoffeeCat2
docker rm CoffeeCat2

image-20250615173554038

  • 删除所有停止的容器
docker rm $(docker ps -a -q)

⭐ 21. docker export

  • 用于导出容器中的内容为 tar 文件

1. 基础语法

docker export [options] container
options 的可选项功能
-o将导出的内容写入到指定文件

2. 使用示例

  • 将 CoffeeCat 容器中的内容导出到 CoffeeCat2025.tar 文件中。

image-20250615174002762

⭐ 22. docker wait

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

1. 基础语法

docker wait container [container]

2. 使用示例

docker wait CoffeeCat

image-20250615174649065

  • 再新开一个终端,将这个 CoffeeCat 容器 kill 掉,就可以在原来的终端那里看到 CoffeeCat 的退出码了。

image-20250615174820411

⭐ 23. docker rename

  • 用于重命名容器

1. 基础语法

docker rename container new_name

2. 使用示例

  • 将 CoffeeCat 改名为 NewCoffeeCat
docker rename CoffeeCat NewCoffeeCat

⭐ 24. docker container prune

  • 用于删除所有停止的容器。该操作非常有风险,除非明确的知道自己要干什么,否则不建议使用该命令。

1. 基础指令

docker container prune [options]
options 的可选项功能
-f 或 --force不提示是否确认,强制进行删除、

⭐ 25. docker update

  • 该命令用于更新容器的配置

1. 基础指令

docker update [options] container [container...]
options 的可选项功能
--cpusCPU 数量
--cpuset-cpus使用哪些 CPU
--memory内存限制
--memory-swap交换内存
--cpu-period指定容器对 CPU 的使用要在多长时间内重新做一次分配
--cpu-quota指定在某个周期内,最多可以有多少时间来跑这个容器

2. 使用示例

  • 将 CoffeeCat 容器可用的内存更新为 400M
docker update --memory 400m 

相关文章:

  • Spring AI的ChatClient和ChatModel接口
  • Node.js 中的 Token 认证机制详解
  • 动态规划之斐波那契数(一)
  • java 集合 泛型
  • (LeetCode 每日一题) 1432. 改变一个整数能得到的最大差值(贪心)
  • 编译链接实战(30)strip移除了哪些内容
  • JVM 类加载过程/对象创建过程/双亲委派机制/垃圾回收机制
  • 大模型微调(Fine-tuning)概览
  • Vue-Leaflet地图组件开发(四)高级功能与深度优化探索
  • 基于51单片机的温度和液位监测系统(串口传输)
  • Vue 性能优化
  • kicad运行时出错,_Pnext->_Myproxy = nullptr;访问内存出错
  • 自我实现的量子隐喻:在可能性场域中动态拓展涌现节点
  • 安装前端vite框架,后端安装fastapi框架
  • Multisim仿真Buck电路基本拓扑
  • 进程和线程区别、管道和套接字、共享变量、TCP三次握手,是否可以少一次握手、子进程和主进程区别和API——Nodejs
  • Spring Cloud Gateway 全面学习指南
  • LabVIEW电路板焊点自动检测
  • 力扣刷题(第五十八天)
  • 【测开面试题】八股文总结
  • 做家乡的网站/搜索引擎优化指南
  • 网页设计网站搭建/工业和信息化部
  • 龙岩房地产信息网/青岛网站优化公司哪家好
  • 做网站怎么打空格/百度推广价格
  • 潍坊网站建设最新报价/重庆网站建设软件
  • 开发公司销售房产交哪些税/网站服务器速度对seo有什么影响