Docker--Docker Container(容器)

什么是容器?

简单的讲,容器就是镜像的运行实体。

容器是一个轻量级、可移植的软件单元,它包含了运行应用程序所需的所有依赖项。这些容器是基于镜像创建的,而镜像则是静态的只读文件,包含了应用程序的代码、运行时环境、系统库等。容器在运行时会带有可写文件层,并且容器中的进程处于运行状态。

关键特性:

  • 隔离性:Docker通过命名空间(NameSpace)和 控制组(cgroups)等技术实现了进程、网络、文件系统等的隔离。这使得容器中的应用程序与主机系统以及其他容器相互独立,互不干扰。
  • 可移植性:Docker容器可以在不同的Docker主机上轻松移动,无需改变密码和重新部署配置。这极大提高了应用程序的灵活性和拓展性。
  • 一致性:Docker容器确保了应用程序在开发、测试和生产环境中始终如一地运行。这有助于减少因环境差异而导致的错误和问题。
  • 资源效率:与虚拟机相比,Docker容器更加轻量级,消耗更少的内存和CPU资源。这使得它更适合于大规模部署和密集计算场景。
  • 自动化:Docker提供了丰富的工具和命令,可以自动化构建、部署和管理容器。这提高了开发和运维的效率,降低了运营成本。

Docker的生命周期

Docker的生命周期,是指从创建到销毁的整个过程。

1.已创建(Created)

  • 状态说明:容器已经被创建,但尚未启动。此时,容器内的进程还没有运行,但已经分配了唯一的ID,并配置了网络设置和挂载点等。
  • 相关命令 :使用docker create命令可以创建一个新容器,但不启动它。

2.运行中(Running)

  • 状态说明:容器已经启动,并且容器内的主进程正在运行。此时,容器可以接收并处理外部请求,执行其设计的任务。
  • 相关命令 :使用docker start命令可以启动一个已经创建的容器;使用docker run命令可以创建并启动一个新容器,这是docker createdocker start的组合。

3.停止(Stopped)

  • 状态说明:容器已经停止运行,但容器本身仍然存在,可以被重新启动或删除。停止容器时,Docker会向容器发送SIGTERM信号,等待一段时间让容器优雅关闭。如果容器未能在指定时间内停止,Docker会发送SIGKILL信号强制终止。
  • 相关命令 :使用docker stop命令可以停止一个运行中的容器。

4.暂停中(Paused)

  • 状态说明:容器已经被暂停,所有进程都被停止,但容器的状态和数据依然保留在内存中。暂停容器可以保留容器的当前状态,同时释放部分资源。
  • 相关命令 :使用docker pause命令可以暂停一个运行中的容器;使用docker unpause命令可以恢复被暂停的容器。

5.删除(Deleted)

  • 状态说明:容器已经被彻底删除,包括其状态、数据以及所有相关信息。删除容器后,无法再恢复或访问该容器。
  • 相关命令 :使用docker rm命令可以删除一个已经停止的容器。如果尝试删除一个运行中的容器,会收到错误提示。需要先停止容器,才能删除它。另外,使用docker container prune命令可以删除所有停止的容器。

容器OOM

容器OOM,即容器出现Out of Memory(内存溢出)错误,是一个在使用Docker等容器技术时可能遇到的问题。

当容器尝试使用的内存超出了系统或容器本身可用的内存限制时,就会触发OOM错误。这通常会导致容器被系统强制终止,从而影响应用程序的正常运行

OOM出错的原因:

  • 容器内存限制不足:在创建容器时,如果没有为容器分配足够的内存,或者容器在运行过程中申请的内存超过了其限制,就会触发OOM错误。
  • 应用程序内存泄漏:如果容器内运行的应用程序存在内存泄漏,即应用程序在运行过程中未能正确释放不再使用的内存,那么随着时间的推移,应用程序的内存占用会逐渐增加,最终导致OOM错误。
  • 应用程序负载过高:当应用程序的负载过高时,可能会在短时间内消耗大量内存,从而触发OOM错误。

常见使用命令

docker create

创建一个新的容器但不启动它;

cpp 复制代码
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 自动重启

例子:

创建一个mynginx1容器:

cpp 复制代码
docker create --name mynginx1 nginx:1.23.4

可以看到状态是创建的状态:

cpp 复制代码
docker ps -a | grep mynginx

docker logs

查看容器日志

cpp 复制代码
docker logs [OPTIONS] CONTAINER
关键参数 描述
--details 显示提供给日志的额外详细信息
-f, --follow 遵循日志输出
--since 显示某个时间开始的时间日志
-n, --tail all 从日志末尾开始显示的行数
-t, --timestamps 显示时间戳

例子:

运行一个端口映射8081的nginx:

cpp 复制代码
docker run --name mynginx3 -p 8081:80 -d nginx:1.23.4

日志追踪:

cpp 复制代码
docker logs -f mynginx3

通过客户端访问:

可以收到http请求操作信息:

docker attach

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

cpp 复制代码
docker attach [OPTIONS] CONTAINER

参数:
--sig-proxy :是否将所有信号代理,默认是 true,如果设置为 false,退出的

话不会影响容器,否则退出会导致容器退出。

例子:

先运行一个容器:

cpp 复制代码
docker start mynginx3

连接上一个正在运行的容器:

cpp 复制代码
docker attach mynginx3

按住ctrl+c 退出,会把容器也退出:

如果使用关键参数去连接已经运行的容器:

cpp 复制代码
docker attach --sig-proxy=false mynginx3

按住ctrl+c不会吧容器杀死:

docker exec

在容器中执行命令

cpp 复制代码
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

关键参数:

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

例子:

运行容器打印出"hello":

cpp 复制代码
docker exec -it mynginx3 echo "hello"

在后台运行打印"hello":

cpp 复制代码
docker exec -d mynginx3 echo "hello"

以交互方式在容器中运行bash:

cpp 复制代码
docker exec -it mynginx3 bash

docker start

启动停止的容器

cpp 复制代码
docker start [OPTIONS] CONTAINER [CONTAINER...]

例子:

启动退出的mynginx2:

cpp 复制代码
docker start mynginx2

docker stop

停止运行的容器

cpp 复制代码
docker stop [OPTIONS] CONTAINER [CONTAINER...]

docker restart

重启容器

cpp 复制代码
docker restart [OPTIONS] CONTAINER [CONTAINER...]

docker kill

强制退出容器

cpp 复制代码
docker kill [OPTIONS] CONTAINER [CONTAINER...]

注意:docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号

docker top

查看容器中运行的进程信息

cpp 复制代码
docker top CONTAINER [ps OPTIONS]

docker stats

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

关键参数

参数 描述
--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: 容器创建的进程或线程数。
cpp 复制代码
docker stats [OPTIONS] [CONTAINER...]



docker container inspect

查看容器详细信息

cpp 复制代码
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

docker port

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

cpp 复制代码
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

docker cp

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

cpp 复制代码
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

例子:

在当前目录下创建一个文件:

运行容器,并在容器创建一个对应的目录:

cpp 复制代码
docker run -it --name mynginx4 nginx:1.23.4 bash
mkdir www

将宿主机的文件复制过去:

cpp 复制代码
docker cp /root/Doc/test.txt mynginx4:/www/

查看文件内容:

在容器mynginx4 的www目录下创建文件test2.txt:

将容器mynginx4 的文件复制到宿主机来:

cpp 复制代码
docker cp mynginx4:/www/test2.txt /root/Doc/

docker diff

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

cpp 复制代码
docker diff CONTAINER

例子:

在容器中创建一个目录:

cpp 复制代码
docker exec -it mynginx3 mkdir /www/

再次查看该容器的文件结构:

docker commit

从容器创建一个新的镜像。

cpp 复制代码
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

关键参数

参数 描述
-a 提交的镜像作者;
-c 使用 Dockerfile 指令来创建镜像;可以修改启动指令
-m 提交时的说明文字;
-p 在 commit 时,将容器暂停

例子:

从一个容器中创建出对应的镜像出来:

cpp 复制代码
docker commit mynginx4 mywebsite:1.1

使用选项 -a 和 -m:

cpp 复制代码
docker commit -a 'wahaha' -m 'test docker commit' mynginx4 mywebsite:1.2

使用选项 -c 修改启动命令:

cpp 复制代码
docker commit -c 'CMD["tail","-f","/etc/hosts"] -p mynginx4 mywebsite:1.3


docker pause 和 docker unpause

暂停容器中所有的进程 和 恢复容器中所有的进程

cpp 复制代码
docker pause CONTAINER
docker unpause CONTAINER

例子:

docker rm

删除停止的容器

cpp 复制代码
docker rm [OPTIONS] CONTAINER

关键参数:-f:通过SIGKILL信号强制删除一个运行的容器

例子:

docker export

导出容器内容为 tar 文件

cpp 复制代码
docker export [OPTIONS] CONTAINER

关键参数: -o:写入到文件

例子:

无论容器是否在运行,都可以进行导出:

cpp 复制代码
docker export -o mynginx202411.tar mynginx3

docker wait

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

cpp 复制代码
docker wait CONTAINER [CONTAINER...]

例子:

docker rename

重命名容器

cpp 复制代码
docker rename CONTAINER NEW_NAME

例子:

docker container prune

删除所有停止的容器

cpp 复制代码
docker container prune [OPTIONS]

关键参数: -f : 不提示是否进行确认

例子:

查看所有容器:

cpp 复制代码
docker ps -a
docker container prune

docker update

更新容器配置

cpp 复制代码
docker update [OPTIONS] CONTAINER [CONTAINER...]

关键参数:

参数 描述
--cpus cpu 数量
--cpuset-cpus 使用哪些 cpu
--memory 内存限制
--memory-swap 交换内存
--cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
--cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

例子:

cpp 复制代码
docker update -m 400m mynginx1
相关推荐
阿方索14 小时前
Kubernetes Pod 管理
云原生·容器·kubernetes
哪里不会点哪里.14 小时前
Docker
运维·docker·容器
汪碧康14 小时前
一文掌握k8s的健康检查探针
云原生·容器·kubernetes·k8s·xkube·k8s管理平台
七七powerful14 小时前
docker 搭建wtsap代理
运维·docker·容器
Shanxun Liao15 小时前
Docker vlmcsd 完整管理指南
运维·docker·容器
有谁看见我的剑了?16 小时前
K8s crictl 客户端学习
学习·容器·kubernetes
怒放de生命201016 小时前
前端子包+docker流水线部署+nginx代理部署
前端·nginx·docker
KubeSphere 云原生16 小时前
云原生周刊:Kubernetes 1.35 新机制与云原生生态更新
云原生·容器·kubernetes
Java程序员威哥16 小时前
云原生Java应用优化实战:资源限制+JVM参数调优,容器启动快50%
java·开发语言·jvm·python·docker·云原生
大房身镇、王师傅16 小时前
【Docker】RockyLinux10 安装 docker-compose
运维·docker·容器·docker-compose·rockylinux10