【Docker-13】Docker Container容器

Docker Container(容器)

一、什么是容器?

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

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

这是容器与直接运行在主机上进程的本质区别。

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

容器层,该层允许修改镜像的整个副本。

容器生活案例?

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

或者我们都学习了 Java 或者 C++之类的面向对象的语言,可以理解为镜像为基础类,

容器是实例化出来的一个个对象,没有用户需要的不一样,里面的内容也就不一样了。

为什么需要容器?

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

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

二、容器的生命周期

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

  1. created:初建状态
  2. running:运行状态
  3. stopped:停止状态
  4. paused: 暂停状态
  5. 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 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于"冰封"状态。

三、容器命令

1.容器命令清单

2.容器命令详解

1.docker create

功能:创建一个新的容器但不启动它

复制代码
语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

别名
docker container 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:自动重启

示例

2.docker run

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

复制代码
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

别名
docker container run

关键参数
○ -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:1.23.4 以后台模式启动一个容器,将容器的 8051 端口映射到主机的 80 端口,并将容器命名为 mywebsite4

root@Nanyiroot:~# docker run -d -p 8051:80 --name mywebsite4 nginx:1.23.4
9c9cbafea7f42491eef80e9238829eecd5db48b292d39f7e0c447c62c93c56d3
root@Nanyiroot:~# docker ps | grep 8051
9c9cbafea7f4   nginx:1.23.4   "/docker-entrypoint...."   32 seconds ago   Up 31 seconds   0.0.0.0:8051->80/tcp, [::]:8051->80/tcp   mywebsite4
3.docker ps

功能:列出容器

复制代码
语法
docker ps [OPTIONS]

别名
docker container ls, docker container list, docker container ps

关键参数
○ -a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :显示 latest 的容器。
○ -n :列出最近创建的 n 个容器。
○ --no-trunc :不截断输出。
○ -q :静默模式,只显示容器编号。
○ -s :显示总的文件大小。

示例:

4.docker logs

功能:查看容器日志

复制代码
语法:
docker logs [OPTIONS] CONTAINER

别名
docker container logs

关键参数
○ -f ,--follow: 跟踪日志输出
○ --since :显示某个开始时间的所有日志
○ -t,--timestamps : 显示时间戳
○ -n,-tail :仅列出最新 N 条容器日志

示例1:跟踪查看容器 mywebsite4 的日志输出

示例2:查看容器 mynginx 从 2025 年 3 月 17 日后的最新 10 条日志

5.docker attach

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

复制代码
语法
docker attach [OPTIONS] CONTAINER

别名
docker container attach

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

示例:

此处按了 Ctrl + C 后会把容器杀死。

带上参数 重新启动 mywebsite4 并且ctrl + c

此时按了 Ctrl + C 并没有把容器杀死

复制代码
显示报文为:

CONTAINER ID:容器 ID。
IMAGE:使用的镜像。
COMMAND:启动容器时运行的命令。
CREATED:容器的创建时间。
STATUS:容器状态。
PORTS:容器的端口信息和使用的连接类型(tcp \ udp)。
NAMES:自动分配的容器名称。
6.docker exec

功能:在容器中执行命令

复制代码
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

别名:
docker container exec

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

示例1:在容器 mynginx 中以交互模式执行 echo

示例2:在容器 mynginx 中以交互模式打开 shell

示例3:通过 id 进去,docker ps 可以看到容器 id

7.docker start

功能:启动停止的容器

复制代码
语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container start

示例:

8.docker stop

功能:停止运行的容器

复制代码
语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container stop

关键参数
○ -s :发送的信号
9.docker restart

功能:重启容器

复制代码
语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container restart

关键参数
○ -s :发送信号
10.docker kill

功能:强制退出容器

复制代码
语法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container kill

关键参数:
-s :发送的信号

注意事项:
○ docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号
11.docker top

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

复制代码
语法:
docker top CONTAINER [ps OPTIONS]

别名:
docker container top

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

示例:查看容器进程信息

12.docker stats

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

复制代码
语法:
docker stats [OPTIONS] [CONTAINER...]

别名:
docker container stats

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

示例1:列出所有在运行的容器信息

示例2: json 格式显示

示例3:定制化的表格显示

复制代码
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
13.docker container inspect

功能:查看容器详细信息

复制代码
语法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

关键参数:
○ -f :指定返回值的模板文件。如 table、json
○ -s :显示总的文件大小。

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

示例:

14.docker port

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

复制代码
语法:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

别名:
docker container port 

示例:

15.docker cp

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

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

别名:
docker container cp

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

示例

16.docker diff

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

复制代码
语法:
docker diff CONTAINER

C表示change
A表示add

示例

17.docker commit

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

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

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

示例:基于已有的 nginx:1.23.4 容器,创建一个新镜像 mywebsite4:v1.0,并验证是否能保存你在容器中做的改动

关键:把正在运行的容器 快照成一个新的镜像 ,叫做 mywebsite4:v1.0

Docker 镜像版本迭代和验证修改是否保留的过程

🔁 场景:在 mywebsite4forcommit 容器中修改了文件,然后通过 docker commit 生成新的镜像 mywebsite4:v2.0,并验证修改是否成功保存。

复制代码
启动镜像 v2.0,进入容器交互式终端,并设置 --rm 表示退出后自动删除容器(只是为了测试,不留垃圾)
18.docker pause

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

复制代码
语法:
docker pause CONTAINER [CONTAINER...]  

别名:
docker container pause

示例:

19.docker unpause

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

复制代码
语法:docker unpause CONTAINER [CONTAINER...]

别名:
docker container unpause
20.docker rm

功能:删除停止的容器

复制代码
语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container rm

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

示例1:删除 mywebsite5 容器

示例二:删除所有停止的容器

复制代码
docker rm $(docker ps -a -q)
21.docker export

功能:导出容器内容为 tar 文件 -- 导出的时候会丢失数据

复制代码
语法:
docker export [OPTIONS] CONTAINER

别名:
docker container export

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

示例:导出 mywebsite6 为tar

其中docker export docker import是对应的,之前我们也学过docker import 在镜像里

22.docker wait

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

复制代码
语法:
docker wait CONTAINER [CONTAINER...]

别名:
docker container wait

示例:

23.docker rename

功能:重命名容器。

复制代码
语法:
docker rename CONTAINER NEW_NAME

别名:
docker container rename

示例:

24.docker container prune

功能:删除所有停止的容器

复制代码
语法:
docker container prune [OPTIONS]

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

示例:

25.docker update

功能:更新容器配置。

复制代码
语法:
docker update [OPTIONS] CONTAINER [CONTAINER...]

别名:
docker container update 

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

示例:

相关推荐
leo·Thomas1 小时前
NetBox Docker 全功能部署方案(Ubuntu 22.04 + Docker)
运维·ubuntu·docker·容器·资产管理
惜.己1 小时前
linux中的常用命令(一)
linux·运维·服务器
lcw_lance2 小时前
数字孪生[IOC]常用10个技术栈(总括)
大数据·运维·人工智能
乐维_lwops3 小时前
金融企业如何借力运维监控强化合规性建设?
运维·金融·运维监控
m0_593758103 小时前
系统重装之后,通过ssh无法登录
linux·运维·服务器
银河麒麟操作系统3 小时前
【银河麒麟高级服务器操作系统】服务器外挂存储ioerror分析及处理分享
linux·运维·服务器
某不知名網友3 小时前
Linux_进程退出与进程等待
linux·运维·服务器
wayuncn3 小时前
服务器托管的常见问题
运维·服务器·服务器租用·服务器托管·idc托管
ALex_zry4 小时前
告别手动输入密码:基于SSHPass的自动化文件传输实践告别手动输入密码:基于SSHPass的自动化文件传输实践
运维·自动化
@CLoudbays_Martin114 小时前
CF后台如何设置TCP 和 UDP 端口?
大数据·运维·服务器·网络·数据库