docker exec 是什么
docker exec 在运行中的容器里新开一个进程执行命令,用它开 shell 排查、跑检测命令、看进程与配置文件。它不会替换容器主进程,也不会影响容器已经固化的启动配置;退出 exec 会话,容器照常运行。
基本信息
| 语法 | docker exec [选项] CONTAINER COMMAND [ARG...] |
|---|---|
| 前提 | 容器必须处于运行状态,已停止的容器要先 start |
| 常用选项 | -it 交互终端 -u 指定用户 -w 指定工作目录 -e 传环境变量 -d 后台执行 |
| 适用平台 | 所有运行 Docker Engine 的 Linux / macOS / Windows 环境 |
典型使用场景
- 进容器看现场:确认配置文件是否按预期挂载进来、进程是否在监听、域名解析是否正常
- 临时执行检测命令:在容器网络命名空间里跑 curl、nc、dig,判断是应用问题还是网络问题
- 核对应用视角:用应用自己的用户身份执行命令,验证权限和路径是否一致
- 查看进程与句柄:ps 看主进程与子进程,必要时看连接与打开的文件
- 一次性取数据:导出配置、统计条目数、跑一条数据库查询后立即退出
常用示例
常用示例
docker exec -it web sh # 开一个交互 shell
docker exec web nginx -t # 不改容器校验配置语法
docker exec -u www-data web id # 用应用用户身份执行
docker exec web cat /etc/resolv.conf # 看容器实际拿到的 DNS 配置
docker exec -w /app web ls -l # 指定工作目录执行命令选项读法
| 选项 | 作用 | 注意 |
|---|---|---|
| -it | 交互终端 | 容器里没有 bash 时改用 sh,报没有终端说明没加 -t |
| -u | 以指定用户执行 | 默认常是 root,核对应用权限时必加 |
| -d | 后台执行 | 适合跑长任务,输出要另找渠道获取 |
| -w | 指定工作目录 | 相对路径的目标以该目录为基准 |
| -e | 注入环境变量 | 只对本次 exec 生效,不影响容器主进程 |
exec 开的进程与容器主进程无关:在里面改文件、装包、改环境变量都只作用于当前容器实例,容器一重建全部丢失。持久化的改动要落到镜像或挂载目录里。
很多精简镜像里没有 bash,甚至没有 ps、curl。排查网络时更省事的方法是起一个带完整工具的容器并复用目标容器的网络命名空间。
常见报错与原因
| 报错 | 原因 | 处理办法 |
|---|---|---|
| container is not running | 目标容器不在运行状态 | 先启动容器,或改用复制文件的方式取数据 |
| executable file not found | 镜像里没有这个命令,比如没有 bash | 换成 sh 或该镜像实际存在的工具 |
| the input device is not a TTY | 在脚本或流水线里加了终端选项 | 去掉终端选项,只保留保持输入的那个 |
| Permission denied | 默认用户对目标路径没有权限 | 用应用用户或对应编号执行,必要时核对目录属主 |
| 命令无输出直接退出 | 命令本身执行完就结束了 | 换成能打印结果的命令,例如查看文件内容或进程列表 |
排查时的常见组合
- 先看进程再看网络:确认主进程在监听哪个端口,再验证从这个容器能否连到依赖服务
- 对照配置:把容器内的配置文件与版本库里的文件比一遍,确认挂载生效
- 验证解析:查看容器内的解析配置,确认短服务名能否解析到目标地址
- 检查时间与编码:时区不一致会让日志与业务时间错位,编码不一致会出现乱码
- 核对权限:用应用用户尝试读写数据目录,提前发现只读挂载或属主问题