您现在的位置是:首页 > 教程资讯 > 电脑常识

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

2020-03-14 16:01:54【电脑常识】人查看

简介 在docker早期,许多用户添加SSH server到它们的镜像里,以便他们能通过外部的shell来访问容器。这样做的话相当于把容器当作虚拟机用了,添加了一个进

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

问题

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

解决方法

使用docker exec命令。

讨论

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

docker run -d --name sleeper debian sleep infinity

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

基本模式 – 在命令行中同步运行容器中的命令 后台模式 – 后台执行容器中的命令 交互模式 – 执行一个命令,允许用户与之交互

首先我们学习基本模式。下面的命令在容器sleeper内执行一个echo命令:

$ docker exec sleeper echo "hello host from container"
hello host from container

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

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

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

$ docker exec -i -t sleeper /bin/bash
root@d46dc042480f:/#