docker exec和docker exec -it有什么区别?

12

我是 Docker 的新手。我正在尝试使用 Docker 容器实现 MySQL。

当在 Docker 容器中执行 mysql 命令时,教程显示此命令:docker exec -it mysql1 mysql -uroot -p

Docker 文档提到 docker exec 意味着在容器中运行一个命令。
可选的 i 标记表示“即使未连接也保持 STDIN 打开” 。
可选的 t 标记表示“分配伪终端” 。

什么意思是 "保持 STDIN 打开",什么意思是 "连接"?
什么意思是 "分配伪终端"?

我不熟悉 shell 命令。我不知道为什么要在这里添加 '-it'。
如果我只输入 docker exec mysql1 mysql -uroot -p,是否会有所不同?

如此困惑,期待任何帮助...谢谢...


如果您只需要运行MySQL命令,则在主机上运行mysql -h 127.0.0.1客户端工具即可。您不需要使用docker exec及其所附带的root级别权限来执行此操作。 - David Maze
在这种情况下,我必须在主机环境中预先安装mysql客户端,对吗? - Arel Lin
2个回答

18

-i -- 不仅让程序在后台运行而无法发送数据,而是保持其可以接受某种形式的输入。

-t -- 具体来说,给我一个地方可以输入命令以将其发送到程序中,就像我打开了一个ssh或telnet会话并可以向远程机器发送命令一样。

它们联合起来基本上使得您可以像在Docker容器外部正常本地运行一样运行您的mysql1程序。


3
那么,-t 提供了一个接口来编写命令,而 -i 则为容器内的程序提供了接收编写的命令的通道。我理解得对吗? - Arel Lin
谢谢!您的解释让我一切都清晰了。 - Arel Lin

1

Will Cain 的回答更加完整,但简单来说,使用 -it 可以让您进入容器的交互模式,即:
-t:分配伪终端
-i:保持 STDIN 开启,即使未连接

Docs 中有关于 docker run 的解释。

注意docker exec 用于在已运行的容器内运行命令。因此,它非常有用于调试容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接