简介
容器中的应用通常会将状态消息和错误消息写入标准输出和标准错误。这是容器化系统中的一种重要设计模式:容器运行时负责捕获输出流,并集中提供这些内容,而不是让每个容器单独管理复杂的日志文件。
这也是容器镜像通常与传统服务器软件采用不同构建方式的原因之一。在容器平台中,输出有用的 stdout/stderr 内容通常比只将日志隐藏在本地文件中更受推荐。
作为开发者或系统管理员,访问这些日志对于了解后台容器内部发生的情况至关重要。在 Kubernetes 等实际平台中,这种 stdout/stderr 模型也是集中式日志处理管道的基础。
在本实验中,你将学习如何:
- 运行一个持续生成输出的容器。
- 获取截至当前已经生成的日志。
- 实时跟踪日志,以便在应用运行时监控它。
- 在不停止应用的情况下,安全地停止日志监控。
启动后台进程
在此步骤中,你将以 detached 模式启动一个 Docker 容器。为了模拟真实应用,我们会运行一个每秒打印一条消息的简单脚本。
以 detached 模式运行容器时(使用 -d 标志),容器会在后台运行,因此你不会立即在终端中看到它的输出。
这些输出仍然存在,只是由 Docker 捕获,而不是直接流式传输到当前的 shell 会话中。
运行以下命令启动容器:
docker run -d --name web-log-app alpine sh -c "while true; do echo 'Application is running...'; sleep 1; done"
命令说明:
docker run -d:在后台启动容器。--name web-log-app:将容器命名为「web-log-app」。alpine:使用轻量级的「Alpine Linux」镜像。sh -c "...":这是在容器内部运行的命令。它执行一个 shell 脚本,运行无限循环(while true),每次循环打印一条消息(echo),然后暂停 1 秒(sleep 1)。
确认容器正在运行:
docker ps
你应该能看到 web-log-app 出现在活动容器列表中。
查看已有日志
由于容器在后台运行,其输出不会显示在当前终端中。Docker 会捕获这些输出,你可以使用 docker logs 命令查看。
在此步骤中,你将获取容器启动以来已经生成的日志。
运行以下命令:
docker logs web-log-app
你会看到一系列「Application is running...」消息。
工作原理:
docker logs 命令会获取截至当前时刻存储的所有日志,并将它们打印到屏幕上。命令随后立即退出,你会返回命令行提示符。这个命令适合检查应用的历史输出或确认应用是否已正常启动。
因此,docker logs 显示的是截至当前时刻的历史输出,而不是进入容器的交互式 shell。它以只读方式显示容器主进程写入的内容。
几秒后再次运行该命令,你会看到更长的消息列表,因为容器仍在后台持续生成日志。
docker logs web-log-app
实时监控日志
有时,仅查看过去的日志还不够。为了调试问题或监控实时流量,你可能需要观察日志生成的过程。这类似于在 Linux 中使用 tail -f 命令。
在此步骤中,你将使用 -f(follow,跟踪)标志实时流式查看日志。
运行以下命令:
docker logs -f web-log-app
当前发生了什么?
命令行提示符不会返回。此时,终端已连接到容器的日志流。你会看到每秒出现一条新的「Application is running...」消息。
这在概念上类似于 tail -f,但数据源是 Docker 捕获的日志流,而不是你直接读取的普通文件。
在与应用交互时,这种模式对于观察应用的行为非常有用。
退出监控并清理环境
当前终端正在持续跟踪日志。容器仍在运行,docker logs 命令正在等待新的输出。
要停止查看日志并返回命令行提示符,需要发送中断信号。
按键盘上的 Ctrl+C。
重要概念:
在这里按下 Ctrl+C 会停止 docker logs 命令(日志查看器),但不会停止容器本身。web-log-app 容器仍在后台运行,并继续生成日志。
这个区别在实际运维中非常重要。观察容器和控制容器是两种不同的操作,把两者混淆是初学者常见的错误。
你可以通过检查进程列表来确认这一点:
docker ps
你应该仍然能在列表中看到 web-log-app。
清理环境:
实验完成后,停止并删除容器以释放资源。我们将使用 docker rm -f,它会强制删除正在运行的容器(同时执行停止和删除操作)。
docker rm -f web-log-app
总结
在本实验中,你学习了访问 Docker 容器日志的基础知识。你练习了以下操作:
- 运行后台进程:使用
docker run -d,让终端可以继续使用。 - 查看已有日志:使用
docker logs <container_name>查看过去的输出。 - 监控实时日志:使用
docker logs -f <container_name>流式查看实时输出。 - 退出日志查看:使用
Ctrl+C停止查看日志,同时保持应用运行。
这些技能对于在各种环境中调试和监控容器化应用都非常重要。



