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
相关推荐
fragrans14 分钟前
设置docker镜像加速器
运维·docker·容器
Karoku0661 小时前
【自动化部署】Ansible 基础命令行模块
运维·服务器·数据库·docker·容器·自动化·ansible
~菜鸟笔记~2 小时前
Docker学习笔记
学习·docker
代码浪人4 小时前
docker 基于Debian镜像安装FreeSwitch1.10.7
docker·容器·debian·freeswitch
LeonNo1110 小时前
k8s, deployment
java·容器·kubernetes
真上帝的左手16 小时前
十一、容器化 vs 虚拟化-Docker 命令
docker·容器
我的运维人生16 小时前
Docker实践与应用举例:构建高效开发与部署环境
docker·容器·eureka·运维开发·技术共享
小杨童鞋16 小时前
docker中onlyoffice升级指导
运维·docker·云原生·容器·eureka
一掬净土16 小时前
K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常
容器·kubernetes·k8s·diskpressure·磁盘压力