docker run
和 docker exec
都是 Docker 中用来与容器交互的命令,但它们的用途和行为有很大的不同。下面我会详细解释它们之间的区别。
1. docker run
docker run
命令用于 创建并启动一个新的容器,并且可以运行一个命令或指定一个程序。每次使用 docker run
时,都会从镜像创建一个新的容器实例。
用法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
特点:
- 创建并启动容器:
docker run
会启动一个新的容器实例,基于指定的镜像。 - 运行一个命令:你可以指定一个命令来在容器中运行(如果没有指定命令,则会运行镜像的默认命令,通常是镜像中定义的
ENTRYPOINT
或CMD
)。 - 可以传递参数:可以为容器指定参数(如挂载卷、设置环境变量、端口映射等)。
- 容器生命周期:运行完指定的命令后,容器会退出,除非你通过某些方式让容器在后台运行(如使用
-d
参数)。
示例:
-
启动一个 Ubuntu 容器,并在容器内运行 Bash shell:
docker run -it ubuntu bash
-
启动一个容器并运行一个后台应用(如 Nginx):
docker run -d -p 80:80 nginx
-
启动一个容器并挂载一个卷:
docker run -v /host/path:/container/path ubuntu
2. docker exec
docker exec
命令用于 在正在运行的容器中执行一个命令。这不会创建新的容器,而是作用于已启动的容器。
用法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
特点:
- 在现有容器中执行命令:
docker exec
允许你在一个已经在运行的容器中执行新的命令。 - 不会重新创建容器:你可以多次在同一个容器内执行不同的命令。
- 交互式执行:通常使用
-it
选项来执行交互式命令(如进入容器的 shell)。 - 容器保持运行:使用
docker exec
不会影响容器的运行状态,容器会继续运行并执行其原本的任务。
示例:
-
进入一个运行中的容器,启动一个交互式 Bash shell:
docker exec -it <container_id_or_name> bash
-
在运行中的容器内执行一个简单的命令:
docker exec <container_id_or_name> ls /usr
-
在容器内运行一个后台进程:
docker exec -d <container_id_or_name> some_command
3. 主要区别
特性 | docker run | docker exec |
---|---|---|
容器生命周期 | 每次运行时都会创建一个新的容器 | 在已有的容器中执行命令,不会创建新容器 |
用途 | 启动一个新的容器并运行命令/程序 | 在已运行的容器内执行命令 |
交互性 | 可以使用 -it 选项进行交互式运行容器 | 使用 -it 选项可以交互式进入容器,但容器已在运行 |
容器状态 | 容器在命令执行完成后会退出(除非使用后台模式) | 容器会保持运行,命令执行完后容器继续运行 |
创建容器 | 会创建一个新的容器并启动 | 不会创建新容器,只对现有容器操作 |
适用场景 | 适用于启动应用、服务、进程或临时任务 | 适用于调试、管理或监控正在运行的容器 |
4. 何时使用 docker run
和 docker exec
-
使用
docker run
:- 当你需要从一个镜像启动一个新的容器,并运行某个命令时。
- 如果容器没有运行,你需要使用
docker run
来创建并启动容器。 - 启动一个新的服务或应用。
-
使用
docker exec
:- 当容器已经在运行时,你需要进入容器进行调试、查看日志、执行一些命令或修改容器内的配置。
- 在一个已经启动的容器中进行实时操作,而不影响容器的生命周期。
总结
docker run
用来创建和启动一个新的容器,并执行指定的命令。docker exec
用来在已经运行的容器内执行命令,可以多次对一个容器执行操作。