docker exec 是干什么的
docker exec 在运行中的容器里执行一条命令,最常用的用法是开一个交互式 shell 进去排查问题。它启动的是容器内的新进程,不改动容器本身的启动配置,退出 shell 也不会把容器停掉,这一点与 attach 有本质区别:attach 是接到容器主进程的输入输出上,误按中断键可能直接把主进程干掉。
基本信息
| 基本语法 | docker exec [选项] 容器 命令 [参数] |
|---|---|
| 高频组合 | -it 交互终端 / -u 指定用户 / -w 指定工作目录 / -e 追加环境变量 |
| 前提条件 | 容器必须处于运行状态,否则报错提示容器未运行 |
| 可用 shell | 精简镜像常只有 sh 没有 bash,进不去时先试 sh |
| 非交互用法 | docker exec 容器 命令 一次执行并返回结果,适合脚本 |
| 执行身份 | 默认是镜像里配置的用户,很多操作需要显式加 -u root |
典型使用场景
- 排查运行中的服务:进容器看进程、端口、配置文件与运行时目录的实际状态
- 验证环境变量与挂载是否按预期生效,确认配置文件里的内容与期望一致
- 连数据库或缓存客户端做连通性测试,判断是网络问题还是应用问题
- 在容器内执行一次性数据修复脚本,比重新构建镜像再发布快得多
- 抓取诊断信息:把日志、进程列表、网络状态输出到终端或重定向到文件
- 模拟应用视角:以容器内用户身份测试文件权限与目录可写性
常用选项速查
| 选项 | 作用 | 使用注意 |
|---|---|---|
| -it | 分配交互终端 | 脚本里不要加,会挂住等待输入 |
| -u root | 以指定用户执行 | 排查权限问题时最常用 |
| -w 目录 | 指定工作目录 | 避免每次都先 cd 再执行命令 |
| -e 键=值 | 追加环境变量 | 只影响这次执行,不改容器配置 |
| --privileged | 特权模式执行 | 风险高,仅在确有必要时短暂使用 |
常用示例
常用示例
docker exec -it myapp sh # 进入容器(先试 sh,不一定有 bash)
docker exec -it -u root myapp bash # 以 root 身份进入排查权限问题
docker exec myapp env | grep -i path # 看运行时环境变量
docker exec -w /app myapp ls -al # 指定目录执行命令
docker exec myapp cat /etc/nginx/conf.d/default.conf # 核对容器内实际配置
# 排查完记得退出,exec 不会影响容器状态exec 开的是新进程,它看到的环境与容器主进程可能有差异:环境变量来自容器配置,但 shell 初始化与工作目录不同,排查时以主进程视角为准。
用 exec 做的修改会随容器销毁而丢失,也与最终镜像不一致。临时验证可以,正式变更必须回到镜像构建或编排配置里。
优先用 exec 而不是 attach:attach 连接的是容器主进程,输入输出都指向它,误按中断键可能让主进程收到信号直接退出。
容器里能用的工具取决于镜像:精简镜像可能没有 curl、netstat、ps。必要时临时装包验证,但不要把它当成长期运维手段。
排查时的注意点
- 先确认容器处于运行状态,否则命令会直接失败
- 优先尝试更简易的 shell,精简镜像通常没有完整 shell
- 执行命令前加分隔符,避免参数被工具自身吃掉
- 临时改动要回到配置仓库,否则重建后问题重现
- 涉及写操作时先确认影响范围,只读排查优先
- 把有价值的输出导出保存,容器重建后现场就不再存在