如何在正在运行的 Docker 容器上运行命令

通常,我们希望完全包含 Docker 应用程序,但有时出于开发或自动化目的,能够像使用 Linux VM 一样使用 Docker 容器。 Docker 提供了用于在容器内运行命令甚至整个 shell 的工具。

在容器中运行命令

要在容器中运行命令,将需要其容器 ID,除非我们为该容器设置了特定名称。 这是一个长的十六进制字符串,我们可以从 Docker 进程列表中找到:

$ docker ps

然后,我们可以使用 exec -it 命令在容器内运行。 例如,查看日志文件的输出:

$ docker exec -it containerID tail /var/log/nginx/access.log

我们还可以在容器内运行脚本:

$ docker exec -it containerID script.sh

-it 选项分别用于“交互模式”和 TTY,几乎一直使用。 我们可以使用其他一些选项:

  • --workdir 或 -w 在命令之前更改当前目录。

  • --detach 或 -d 在后台运行命令。

  • --env 或 -e 在运行前设置环境变量。

  • --env-file 做同样的事情,但处理起来更安全。

  • --privileged 以扩展权限运行命令。

  • --user 作为不同的用户运行

当然,这只适用于正在运行的容器。 如果想暂停容器进行维护,则需要通过新的镜像版本部署更新,或者从主机操作系统更改卷挂载的数据。

通过 SSH 连接到容器

不仅限于简单的命令,我们实际上可以通过运行 /bin/bash 作为命令来打开 shell。 可能会受到可用工具的限制——大多数容器都具有相当准系统的 Linux 安装——但它使运行许多命令变得更加容易。

$ docker exec -it containerID /bin/bash

这只是一个可从主机访问的 shell,在大多数情况下运行良好。 但是,如果愿意,我们可以将容器设置为通过 SSH 像 VPS 一样完全可用。 可以在 Docker 容器中运行 SSH 服务 的文章中阅读有关设置的更多信息。

将文件复制到容器和从容器拷贝出来

使用 exec -it 运行命令可以工作,但主机和容器之间仍有一层阻止简单的脚本编写。 一方面,虽然向容器发送命令很容易,但从文件系统中获取输出却更难。

虽然可以通过管道将 exec -it 的 STDOUT 传输到主机操作系统上的其他服务,但也可以将文件复制到容器的文件系统或从容器的文件系统拷贝文件。 例如,拉出一个日志文件并将其粘贴到主机上:

$ docker cp container:/var/log/nginx/example.log example.log

或拉出整个目录

$ docker cp nginx:/etc/nginx/ nginxconfig/

但是,如果经常这样做,则可能需要考虑使用绑定或卷挂载来使数据可以直接从主机访问。

本文转载自:迹忆客(https://www.jiyik.com)

以上是 如何在正在运行的 Docker 容器上运行命令 的全部内容, 来源链接: utcz.com/z/290284.html

回到顶部