Docker实践(28) – 直接运行容器内的命令

在docker早期,许多用户添加SSH server到它们的镜像里,以便他们能通过外部的shell来访问容器。这样做的话相当于把容器当作虚拟机用了,添加了一个进程无疑增加了系统的开销。于是Docker引入了exec命令,提供了不需要安装ssh server直接在容器内执行命令的方法。下面我们介绍这个命令。

问题

你想在一个运行的容器内执行命令。

解决方法

使用docker exec命令。

讨论

为了演示exec命令,我们先在后台启动一个容器,名称为sleeper,仅执行一个sleep命令。

  1. docker run -d --name sleeper debian sleep infinity

现在我们启动了一个容器,你可以在上面使用docker exec命令完成各种试验。exec命令有三种模式,如下:

  • 基本模式 – 在命令行中同步运行容器中的命令
  • 后台模式 – 后台执行容器中的命令
  • 交互模式 – 执行一个命令,允许用户与之交互
  • 首先我们学习基本模式。下面的命令在容器sleeper内执行一个echo命令:

    1. $ docker exec sleeper echo "hello host from container"
    2. hello host from container

    有没有注意到这个命令的结构与docker run命令类似,只是我们给的ID是正式运行容器的ID而不是镜像ID。运行的echo命令是容器内的命令,不是主机上的。
    后台模式是在后台运行命令,在你的终端不会看到输出。这个模式通常用于执行花费比较长的任务,并且不关心它的输出,如清除日志文件:

    1. $ docker exec -d sleeper find / -ctime 7 -name '*log' -exec rm {} \;

    最后是交互模式。通常用来执行一个shell,然后与之交互:

    1. $ docker exec -i -t sleeper /bin/bash
    2. root@d46dc042480f:/#
    标签:容器Docker 发布于:2019-11-20 12:19:12