Docker 管理容器
约 1568 字大约 5 分钟
2025-10-04
容器是 Docker 的一个核心概念。
简单来说,容器是一个独立运行的应用或一组应用,以及它们所需的运行环境。相比之下,虚拟机则相当于模拟出一整套操作系统(包含完整的运行环境和系统资源),然后在其上运行应用程序。
管理容器
下面的命令输出一个 “Hello World”,之后终止容器。
docker run ubuntu:18.04 /bin/echo 'Hello world'
# Hello world启动一个 bash 终端,允许用户进行交互。
docker run -t -i ubuntu:18.04 /bin/bash其中,-t 选项让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从 Registry 下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
容器核心特点:容器只包含运行所需的应用程序及其资源,不会额外占用其他系统资源。通过 ps 或 top 可以看到容器内仅运行指定的进程(如 bash)。
root@f58ec56d66bc:/# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18 root 20 0 8644 4220 2344 R 0.3 0.1 0:00.03 top
1 root 20 0 4296 3552 3020 S 0.0 0.1 0:00.13 bashroot@f58ec56d66bc:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
19 pts/0 00:00:00 ps轻量化优势:由于只运行必要的应用和进程,Docker 容器资源利用率极高,是典型的轻量级虚拟化方案。
容器创建与启动
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]创建并启动一个新容器。docker create [OPTIONS] IMAGE [COMMAND] [ARG...]只创建容器,不启动。docker start CONTAINER启动已停止的容器。docker restart CONTAINER重启容器。
容器停止与暂停
docker stop CONTAINER停止运行中的容器。docker kill CONTAINER强制终止容器。docker pause CONTAINER暂停容器内的所有进程。docker unpause CONTAINER取消暂停,继续运行。
容器删除
docker rm CONTAINER删除一个或多个已停止的容器。docker rm -f CONTAINER强制删除运行中的容器。docker container prune删除所有已停止的容器,释放空间。
容器查看与管理
docker ps查看正在运行的容器。docker ps -a查看所有容器(包括停止的)。docker inspect CONTAINER查看容器详细信息(配置、网络、挂载等)。docker logs CONTAINER查看容器日志输出。docker top CONTAINER查看容器内运行的进程。docker stats [CONTAINER...]实时查看容器资源使用情况(CPU、内存、网络等)。
容器命令执行
docker exec -it CONTAINER COMMAND在运行的容器中执行命令(常用于进入容器交互式 shell)。docker attach CONTAINER连接到正在运行的容器的主进程终端。
其他常用操作
docker rename CONTAINER NEW_NAME重命名容器。docker commit CONTAINER NEW_IMAGE将容器当前状态保存为新的镜像。docker export CONTAINER > file.tar导出容器文件系统为 tar 文件。docker cp CONTAINER:SRC_PATH DEST_PATH从容器拷贝文件到宿主机(或反向拷贝)。
后台运行
大多时候,我们希望容器在后台运行,而不是占用当前终端。可以使用 -d 选项让容器在后台运行。
否则容器会把主进程的标准输出和标准错误输出绑定到当前终端,直到容器终止或用户按 Ctrl+C 停止容器。
使用 -d 选项(即后台模式)运行容器时,主进程的标准输出(stdout)和标准错误输出(stderr)会被重定向到容器的日志系统中,可通过 docker logs 命令查看。
后台模式运行会返回容器 ID。
docker run -d nginx:latest
# e2f1c3b4d5f6a7b8c9
docker logs e2f1c3b4d5f6a7b8c9
# [日志输出]
# ...进入容器
有些时候需要进入正在运行的容器内进行操作,比如进入一个mysql容器执行SQL语句,或者进入一个web应用容器查看日志文件等。
可以使用 docker attach 命令或 docker exec 命令,但是更推荐使用 docker exec,因为 docker attach 会连接到容器的主进程终端,可能会影响容器的正常运行。
当你使用
docker attach e2f1c3b4d5f6a7b8c9连接到容器后,你其实是直接附着到容器主进程的标准输入输出上(通常是 PID 1,比如 /bin/bash 或应用进程)。
因此:
- 如果你在 attach 会话中输入
exit,就等价于让主进程退出。 - 主进程一退出,整个容器就会随之停止。
通常的做法是:
docker exec -it e2f1c3b4d5f6a7b8c9 /bin/bash这样打开的是一个新的子进程 shell,即使你退出 (exit),主进程也不会受影响,容器依然保持运行。
| 命令 | 行为 | 退出容器后效果 |
|---|---|---|
docker attach | 直接连接主进程 | 主进程退出 → 容器停止 |
docker exec -it | 启动新子进程 | 子进程退出 → 容器继续运行 |
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
docker export [CONTAINER_ID/CONTAINER_NAME] > [FILE_NAME].tar这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,例如
cat [FILE_NAME].tar | docker import - [IMAGE_NAME]:[TAG]此外,也可以通过指定 URL 或者某个目录来导入,例如
docker import https://example.com/someimage.tar
docker import /path/to/someimage.tardocker load:用于导入由docker save导出的镜像存储文件,保留完整的镜像层、历史记录和元数据。docker import:用于导入由docker export导出的容器快照文件,只保留文件系统内容,丢失历史记录和元数据,但可重新指定标签等信息。- 因此,
load更完整但体积大,import更轻便但信息少。