概念
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
Docker 容器化带来了许多好处,以下是一些主要的方面:
- 环境一致性:Docker 容器可以确保应用程序在开发、测试和生产环境中运行的环境完全一致。通过 Dockerfile 定义应用程序的运行环境,包括操作系统、依赖库、配置文件等,从而避免了"在我的机器上可以运行"的问题。
- 快速部署与启动:Docker 容器可以将应用程序及其依赖打包成一个独立的镜像,通过简单的命令即可部署到任何支持 Docker 的环境中。Docker 容器的启动速度非常快,通常只需要几秒钟。
- 资源隔离与利用率:Docker 容器通过命名空间和 cgroups 技术,实现了对 CPU、内存、磁盘等资源的隔离。每个容器都有自己独立的资源视图,互不干扰。并且Docker 容器不需要完整的操作系统,多个容器可以共享宿主机的操作系统内核,从而显著提高资源利用率。
- 可扩展性与弹性:Docker 容器可以轻松地实现水平扩展。通过 Docker Compose 或 Kubernetes 等工具,可以快速启动多个容器实例,以应对不同的负载。并且可以根据实际负载自动扩缩容,确保应用程序在高并发场景下的稳定运行。
- 版本控制与可重复性:Docker 镜像支持版本控制,可以通过标签(Tag)来区分不同版本的镜像。这使得应用程序的部署和回滚变得非常简单。
- 微服务架构支持:每个微服务可以打包成一个独立的容器,通过容器编排工具(如 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 ID与NAME:**容器 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