容器的基本操作:运行容器
一、运行容器
docker run
是启动容器的方法,在前面学习Dockerfile 时已经知道,可以通过CMD 、ENDPOINT 指令和docker run
命令指定容器启动时执行的命令;
如下所示:容器启动时执行 pwd
,返回的 /
是容器中的当前目录
执行 docker ps
或 docker container ls
可以查看 Docker host 中当前运行的容器:
用 docker ps -a
或 docker container ls -a
看看,-a
会显示所有状态的容器;
之前的容器已经退出了,状态为Exited;那么问题来了,如何
让容器长期运行?
容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出;
例如执行如下命令:
docker run ubuntu /bin/bash -c "while true; do sleep 1; done"
while循环保证了bash不会退出,另外打开一个终端,查看容器的状态,具体结果:
可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端;
我们可以加上参数 -d
以后台方式启动容器;
docker run -d ubuntu /bin/bash -c "while true; do sleep 1; done"
具体结果如下:
注意:CONTAINER ID
是容器的 “短ID”,前面启动容器时返回的是 “长ID”,短ID是长ID的前12个字符;NAMES
字段显示容器的名字,在启动容器时可以通过 --name
参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字;
对于容器的后续操作,我们需要通过 “长ID”、“短ID” 或者 “名称” 来指定要操作的容器
比如下面停止一个容器:docker stop 短id
但是,容器在工作中更常见的用途是运行后台服务,譬如:
用 --name
指定了容器的名字,参数 -d
以后台方式启动容器,
docker run --name "my_httpd_server" -d httpd
看到容器运行的命令是httpd-foreground
,通过 docker history
可知这个命令是通过 CMD 指定的;
二、进入容器的两种方法
经常需要到容器里去查看日志、调试、启动其他进程等,有两种方法进入容器:attach 和 exec。
第一种方式:docker attach
第二种方式:docker exec
通过 docker exec
进入相同的容器:
其中,-it
以交互模式打开 pseudo-TTY,执行 bash,其结果就是打开了一个 bash 终端;
可以像在普通 Linux 中一样执行命令。ps -elf
显示了容器启动进程while
以及当前的 bash
进程;
docker exec -it <container> bash|sh
是执行 exec 最常用的方式
一句话,如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec;
当然,如果只是为了查看启动命令的输出,可以使用 docker logs
命令:
-f
的作用与 tail -f
类似,能够持续打印输出;
三、运行容器最佳实践
按用途容器大致可分为两类:服务类容器和工具类的容器;
服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等,通过 -d
以后台方式启动这类容器是非常合适的,如果要排查问题,可以通过 exec -it
进入容器;
工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it
方式运行;
工具类容器多使用基础镜像,例如 busybox、debian、ubuntu 等,以busybox为例:
指定容器的三种方法:短ID,长ID,容器名称,可通过 --name
为容器命名。重命名容器可执行docker rename;
通过 -d
参数在后台启动容器;
通过 exec -it
可进入容器并执行命令;