docker exec -it 是与 Docker 容器交互最常用的命令之一。本文将精炼介绍其核心用法和关键技巧。

docker exec -it 是什么?

这个命令组合用于在正在运行的 Docker 容器中以交互方式执行命令。

  • exec: 在容器内执行命令。
  • -i (--interactive): 保持标准输入(STDIN)开启,允许你向命令发送输入。
  • -t (--tty): 分配一个伪终端,为你提供一个交互式的命令行界面。

简单来说,docker exec -it 就像是 SSH 进入一台正在运行的容器。

两种主要用法

1. 进入交互式 Shell(用于调试)

这是最常见的用法,可以让你进入容器的命令行环境,自由探索和执行多个命令。

# 进入容器的 shell 环境
docker exec -it <容器名称或ID> /bin/sh

为什么用 /bin/sh

  • sh (Bourne Shell) 是一个基础的 Shell,几乎存在于所有 Linux 镜像中,包括轻量级的 Alpine。
  • bash (Bourne Again Shell)功能更强大,但在很多镜像(尤其是 Alpine)中默认不安装。
  • 经验法则: 先用 sh,如果需要 bash 的高级功能(如命令补全),再尝试 bash。如果 bash 不可用,你会看到 executable file not found 的错误。

2. 执行单个命令(用于脚本)

这种方式在执行完指定命令后会立即退出,非常适合自动化脚本。

# 检查应用日志
docker exec -it my-app tail -f /var/log/app.log

# 操作数据库
docker exec -it my-postgres psql -U user -d db_name

# 查看文件列表
docker exec -it my-container ls -l /app

关键注意事项

  1. 容器必须在运行中exec 只能作用于 running 状态的容器。
  2. 修改是临时的:在容器内的所有文件修改,在容器重启后都会丢失,除非你修改的是挂载卷(Volume)中的数据。
  3. 权限问题:命令以容器内指定的默认用户身份运行,可能会有权限限制。

总结

  • 需要调试或探索容器内部?使用 docker exec -it <container> /bin/sh
  • 需要自动化或执行一次性任务?使用 docker exec -it <container> <command>
  • 不确定用 sh 还是 bash优先用 sh,因为它的兼容性最好。

掌握 docker exec -it,可以让你管理 Docker 容器更加得心应手。