跳到主要内容

守护态运行

在实际使用中, 大多数情况下我们的容器都是在后台运行的, 需要我们一直在前台一直盯着的情况就很少, 因此我们可以使用 -d 参数让容器以守护态运行在后台, 不会占用前台的窗口

docker run -d -p 8080:80 --name aname nginx:alpine

运行以上命令之后并不会像以前一样直接在终端窗口中输出 nginx 的运行日志, 而是会在后台运行, 然后打印一次容器的ID

docker ps -a
CONTAINER ID   IMAGE                       COMMAND                   CREATED              STATUS                      PORTS                    NAMES
5497f286c29d nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp aname

查看容器的运行日志

当容器运行在后台时, 我们就看不到运行日志了, 对于开发来说这是万万不行的, 分析日志可以帮助开发者快速定位问题, 因此我们可以使用 docker logs 命令来查看容器的运行日志

docker logs aname
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/11/18 12:25:32 [notice] 1#1: using the "epoll" event method
2024/11/18 12:25:32 [notice] 1#1: nginx/1.27.2
2024/11/18 12:25:32 [notice] 1#1: built by gcc 13.2.1 20240309 (Alpine 13.2.1_git20240309)
2024/11/18 12:25:32 [notice] 1#1: OS: Linux 5.15.167.4-microsoft-standard-WSL2
2024/11/18 12:25:32 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/11/18 12:25:32 [notice] 1#1: start worker processes
2024/11/18 12:25:32 [notice] 1#1: start worker process 30
2024/11/18 12:25:32 [notice] 1#1: start worker process 31
172.17.0.1 - - [18/Nov/2024:12:25:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"

运行之后就能直接看到运行日志了

跟随日志

以上的方式并不适合查看实时日志, 程序一直在运行, 日志也在不断生成, 我们不可能每次都输出全量的日志, 此时我们可以通过添加 -f 或者 --follow 参数来跟随日志输出

docker logs -f aname
docker logs --follow aname

此时终端窗口就会被占用, 一直输出日志, 直到程序停止或者我们手动退出日志的查看

限制输出长度

当容器运行了很长时间之后, 会产生大量日志, 如果不加限制, 每次我们查看日志时都需要从头到尾输出一边, 这很消耗时间和资源, 此时可以通过使用 -n 参数来限制输出的日志数量

docker logs -f -n 10 aname

此时只会一次性输出最近的10条日志, 再之前的日志就不会输出了

限制输出时间

有时我们需要排查固定时间段的日志内容, 此时使用 --since--until 即可

docker logs --since '2024-11-18T12:25:20Z' --until '2024-11-18T12:25:33Z' aname