Docker Container(容器)

概念

通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

为什么需要容器?

镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
Docker 容器化带来了许多好处,以下是一些主要的方面:

  1. 环境一致性:Docker 容器可以确保应用程序在开发、测试和生产环境中运行的环境完全一致。通过 Dockerfile 定义应用程序的运行环境,包括操作系统、依赖库、配置文件等,从而避免了"在我的机器上可以运行"的问题。
  2. 快速部署与启动:Docker 容器可以将应用程序及其依赖打包成一个独立的镜像,通过简单的命令即可部署到任何支持 Docker 的环境中。Docker 容器的启动速度非常快,通常只需要几秒钟。
  3. 资源隔离与利用率:Docker 容器通过命名空间和 cgroups 技术,实现了对 CPU、内存、磁盘等资源的隔离。每个容器都有自己独立的资源视图,互不干扰。并且Docker 容器不需要完整的操作系统,多个容器可以共享宿主机的操作系统内核,从而显著提高资源利用率。
  4. 可扩展性与弹性:Docker 容器可以轻松地实现水平扩展。通过 Docker Compose 或 Kubernetes 等工具,可以快速启动多个容器实例,以应对不同的负载。并且可以根据实际负载自动扩缩容,确保应用程序在高并发场景下的稳定运行。
  5. 版本控制与可重复性:Docker 镜像支持版本控制,可以通过标签(Tag)来区分不同版本的镜像。这使得应用程序的部署和回滚变得非常简单。
  6. 微服务架构支持:每个微服务可以打包成一个独立的容器,通过容器编排工具(如 Kubernetes)进行管理和通信。微服务可以独立部署和更新,不会相互影响。Docker 容器化使得微服务架构的实现更加简单和高效。

容器的生命周期

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

  • 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,非计划终止,这时需要杀死最吃内存的容器;

容器命令清单

|--------------------------|-----------------------------------------------------------------|----------------------|
| 命令 | 别名 | 功能 |
| docker create | docker container create | 创建容器 |
| docker run | docker container run | 运行容器 |
| docker attach | docker container attach | 连接到正在运行中的容器 |
| docker commit | docker container commit | 将镜像提交为容器 |
| docker cp | docker container cp | 在容器和宿主机之间拷贝 |
| docker diff | docker container diff | 检查容器里文件结构的更改 |
| docker exec | docker container exec | 在运行的容器中执行命令 |
| docker export | docker container export | 将容器导出为 tar |
| docker container inspect | | 查看容器详细信息 |
| docker container kill | | 杀死容器 |
| docker logs | docker container logs | 查看日志 |
| docker ps | docker container ls, docker container list, docker container ps | 查看正在运行的进程 |
| docker pause | docker container pause | 暂停进程 |
| docker port | docker container port | 查看容器的端口映射 |
| docker container prune | | 删除停止的容器 |
| docker rename | docker container rename | 重命名容器 |
| docker restart | docker container restart | 重启容器 |
| docker rm | docker container rm, docker container remove | 删除容器 |
| docker start | docker container start | 启动容器 |
| docker stats | docker container stats | 查看资源占用信息 |
| docker stop | docker container stop | 停止容器 |
| docker top | docker container top | 查看某个容器的资源占用 |
| docker unpause | docker container unpause | 继续运行容器 |
| docker update | docker container update | 更新容器配置 |
| docker wait | docker container wait | 阻止一个或多个容器停止,然后打印退出代码 |

容器命令详解

docker create

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

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

关键参数:

  • **-i:**以交互模式运行容器,通常与 -t 同时使用;
  • -P:随机端口映射,容器内部端口随机映射到主机的端口;
  • **-p:指定端口映射,格式为:主机(宿主)端口:**容器端口;
  • **-t:**为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • **--name:**为容器指定一个名称;
  • **-h:**指定容器的 hostname;
  • **-e :**设置环境变量;
  • **--cpuset-cpus:**绑定容器到指定 CPU 运行;
  • -m : 设置容器使用内存最大值;
  • **--network:**指定容器的网络连接类型;
  • **--link=[ ]:**添加链接到另一个容器;
  • **--volume , -v:**绑定一个卷
  • --rm:shell 退出的时候自动删除容器
  • --restart:自动重启

样例:

bash 复制代码
docker create --name mynginx nginx:1.27.5

docker run

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

bash 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

关键参数:

  • **-d:**后台运行容器,并返回容器 ID;比 create 多了这个参数,其他均一致

样例:

bash 复制代码
docker run -p 8000:80 -d nginx:1.27.5

docker ps

功能:列出容器。
语法:

bash 复制代码
docker ps [OPTIONS]

关键参数:

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

docker logs

功能:查看容器日志
语法:

bash 复制代码
docker logs [OPTIONS] CONTAINER

关键参数:

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

样例:跟踪查看容器 mynginx 的日志输出。

bash 复制代码
docker logs -f mynginx

docker attach

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

bash 复制代码
docker attach [OPTIONS] CONTAINER

关键参数:

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

样例:连接容器后按了 ctrl+c 后会把容器杀死

docker exec

功能:在容器中执行命令。
语法:

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

关键参数:

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

样例:

bash 复制代码
#在容器 mynginx 中以交互模式执行 echo:
docker exec -it mynginx echo "Hello bit"
#在容器 mynginx 中以交互模式打开 shell:
docker exec -it mynginx bash

docker start

功能:启动停止的容器。
语法:

bash 复制代码
​​​​​​​docker start [OPTIONS] CONTAINER [CONTAINER...]

docker stop

功能:停止运行的容器。
语法:

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

关键参数:

  • **-s :**发送的信号

样例:

bash 复制代码
docker stop mynginx

docker restart

功能:重启容器。
语法:

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

关键参数:

  • **-s :**发送信号

docker kill

功能:强制退出容器
语法:

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

关键参数:

  • **-s :**发送的信号
    docker stop 发送的是 SIGTERM 信号, docker kill 发送的是 SIGKILL 信号

docker top

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

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

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

docker stats

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

bash 复制代码
docker stats [OPTIONS] [CONTAINER...]

关键参数:

  • **--all , -a :**显示所有的容器,包括未运行的。
  • **--format :**指定返回值的模板文件。如 table,json。
  • **--no-stream :**展示当前状态就直接退出了,不再实时更新。
  • **--no-trunc :**不截断输出。

样例:

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

docker container inspect

功能:查看容器详细信息
语法:

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

关键参数:

  • **-f :**指定返回值的模板文件。如 table、json
  • **-s :**显示总的文件大小。

如果直接使用 docker inspect ,则会自动检查是镜像还是容器然后显示相信信息。

docker port

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

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

docker cp

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

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

样例:

bash 复制代码
#将主机/www/目录拷贝到容器 mynginx 的/www 目录下。
docker cp /www/ mynginx:/www/
#将容器/www/目录拷贝到主机的/wwwbak 目录下。
docker cp mynginx:/www/ /wwwbak/

docker diff

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

bash 复制代码
docker diff CONTAINER

样例:

bash 复制代码
docker diff mynginx

docker commit

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

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

参数:

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

样例:

bash 复制代码
docker commit -a "abc" mynginx mynginx:v1.0

docker pause

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

bash 复制代码
docker pause CONTAINER [CONTAINER...]

docker unpause

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

bash 复制代码
docker unpause CONTAINER [CONTAINER...]

docker rm

功能:删除停止的容器
语法:

bash 复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]

关键参数:

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

样例:

bash 复制代码
#删除 mynginx 容器
docker stop mynginx
docker rm mynginx
#删除所有停止的容器
docker rm $(docker ps -a -q)

docker export

功能:导出容器内容为 tar 文件,与 docker save 命令功能相似,不过 docker save 是将镜像文件导出为 tar 文件。
语法:

bash 复制代码
docker export [OPTIONS] CONTAINER

关键参数

  • **-o:**写入到文件。

样例

bash 复制代码
#导出 mynginx 为 tar
docker export -o mynginx.tar mynginx

这样我们就可以得到了一个有关 mynginx 容器的 tar 文件,我们可以使用 docker import 将该 tar 文件解压出来生成一个镜像文件 mynginx。

bash 复制代码
docker import mynginx.tar mynginx

不过该镜像文件与其源镜像文件 nginx:1.27.5 的区别就是,该文件的配置均没有设置,如 Cmd,Env 均为空。

docker wait

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

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

docker rename

功能:重命名容器
语法:

bash 复制代码
docker rename CONTAINER NEW_NAME

docker container prune

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

bash 复制代码
docker container prune [OPTIONS]

关键参数

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

docker update

功能:更新容器配置
语法:

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

关键参数

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

样例

bash 复制代码
#更新内存
docker update -m 400m mynginx
相关推荐
清寒敲代码2 小时前
LVS集群的基本原理和相关配置
运维·服务器·lvs
徐子宸2 小时前
Docker面试题(1)
java·docker·容器
ivwdcwso3 小时前
构建安全与合规的Jenkins环境:全周期审计方案详解
运维·安全·ci/cd·jenkins·devops·审计
LitchiCheng3 小时前
RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)
linux·运维·risc-v
sun03224 小时前
Jenkins的Pipline中有哪些区块,以及其它知识点整理
运维·jenkins
西阳未落5 小时前
Linux(7)——进程(概念篇)
linux·运维·服务器
领世达检测V133529092495 小时前
智能门锁为什么需要做欧盟网络安全 EN18031 标准检测认证
运维·服务器·网络
樂5025 小时前
Web 服务、 Nfs 服务器以及 Dns 服务器综合实验
运维·服务器
莱茵不哈哈6 小时前
Docker:容器化技术
运维·docker·容器
luckyext6 小时前
SQL SERVER常用聚合函数整理及示例
运维·服务器·数据库·sql·mysql·sqlserver·mssql