每天5分钟玩转Docker容器技术
上QQ阅读APP看书,第一时间看更新

4.1 运行容器

docker run是启动容器的方法。在讨论Dockerfile时我们已经学习到,可用三种方式指定容器启动时执行的命令:

(1)CMD指令。

(2)ENTRYPOINT指令。

(3)在docker run命令行中指定。

例如下面的例子,如图4-1所示。

图4-1

容器启动时执行pwd,返回的/是容器中的当前目录。执行docker ps或docker container ls可以查看Docker host中当前运行的容器,如图4-2所示。

图4-2

咦,怎么没有容器?用docker ps -a或docker container ls -a看看,如图4-3所示。

图4-3

-a会显示所有状态的容器,可以看到,之前的容器已经退出了,状态为Exited。

这种“一闪而过”的容器通常不是我们想要的结果,我们希望容器能够保持runing状态,这样才能被我们使用。

4.1.1 让容器长期运行

如何让容器保存运行呢?

因为容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。

理解了这个原理,我们就可以通过执行一个长期运行的命令来保持容器的运行状态。例如执行下面的命令,如图4-4所示。

图4-4

while语句让bash不会退出。可以打开另一个终端查看容器的状态,如图4-5所示。

图4-5

可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端。

可以加上参数 -d以后台方式启动容器,如图4-6所示。

图4-6

容器启动后回到了docker host的终端。这里看到docker返回了一串字符,这是容器的ID。通过docker ps查看容器,如图4-7所示。

图4-7

现在我们有了两个正在运行的容器。这里注意一下容器的CONTAINER ID和NAMES这两个字段。

CONTAINER ID是容器的“短ID”,前面启动容器时返回的是“长ID”。短ID是长ID的前12个字符。

NAMES字段显示容器的名字,在启动容器时可以通过 --name参数显式地为容器命名,如果不指定,docker会自动为容器分配名字。

对于容器的后续操作,我们需要通过“长ID”“短ID”或者“名称”来指定要操作的容器。比如下面停止一个容器,如图4-8所示。

图4-8

这里我们就是通过“短ID”指定了要停止的容器。

通过while启动的容器虽然能够保持运行,但实际上没有干什么有意义的事情。容器常见的用途是运行后台服务,例如前面我们已经看到的http server,如图4-9所示。

图4-9

这一次我们用 --name指定了容器的名字。我们还看到容器运行的命令是httpd-foreground,通过docker history可知这个命令是通过CMD指定的,如图4-10所示。

图4-10

4.1.2 两种进入容器的方法

我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。有两种方法进入容器:attach和exec。

1. docker attach

通过docker attach可以attach到容器启动命令的终端,例如如图4-11所示的例子。

图4-11

这次我们通过“长ID” attach到了容器的启动命令终端,之后看到的是echo每隔一秒打印的信息。

注:可通过Ctrl+p,然后Ctrl+q组合键退出attach终端。

2. docker exec

通过docker exec进入相同的容器,如图4-12所示。

图4-12

说明如下:

① -it以交互模式打开pseudo-TTY,执行bash,其结果就是打开了一个bash终端。

② 进入到容器中,容器的hostname就是其“短ID”。

③ 可以像在普通Linux中一样执行命令。ps -elf显示了容器启动进程while以及当前的bash进程。

④ 执行exit退出容器,回到docker host。

    docker exec -it <container> bash|sh

这是执行exec最常用的方式。

3. attach VS exec

attach与exec主要区别如下:

(1)attach直接进入容器启动命令的终端,不会启动新的进程。

(2)exec则是在容器中打开新的终端,并且可以启动新的进程。

(3)如果想直接在终端中查看启动命令的输出,用attach;其他情况使用exec。

当然,如果只是为了查看启动命令的输出,可以使用docker logs命令,如图4-13所示。

图4-13

-f的作用与tail -f类似,能够持续打印输出。

4.1.3 运行容器的最佳实践

按用途容器大致可分为两类:服务类容器和工具类的容器。

服务类容器以daemon的形式运行,对外提供服务,比如Web Server、数据库等。通过 -d以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过exec -it进入容器。

工具类容器通常能给我们提供一个临时的工作环境,通常以run -it方式运行,比如如图4-14所示的例子。

图4-14

运行busybox, run -it的作用是在容器启动后就直接进入。我们这里通过wget验证了在容器中访问internet的能力。执行exit退出终端,同时容器停止。

工具类容器多使用基础镜像,例如busybox、debian、ubuntu等。

4.1.4 容器运行小结

容器运行相关的知识点:

(1)当CMD、Entrypoint和docker run命令行指定的命令运行结束时,容器停止。

(2)通过 -d参数在后台启动容器。

(3)通过exec -it可进入容器并执行命令。

指定容器的三种方法:

(1)短ID。

(2)长ID。

(3)容器名称。可通过 --name为容器命名。重命名容器可执行docker rename。

容器按用途可分为两类:

(1)服务类的容器。

(2)工具类的容器。