docker 运行、docker 执行和日志

docker run, docker exec and logs

如果我这样做:

docker run --name nginx -d nginx:alpine /bin/sh -c 'echo "Hello stdout" > /dev/stdout'

当我这样做时我可以看到 "Hello stdout" :

docker logs nginx

但是当容器 运行ning (docker 运行 --name nginx -d nginx:alpine) 而我做的时候:

docker exec nginx /bin/sh -c 'echo "Hello stdout" > /dev/stdout'

或者当我附加容器时:

docker exec -it nginx /bin/sh

然后:

echo "Hello stdout" > /dev/stdout

我在 docker 日志中看不到任何内容。而且由于我的 Nginx 访问日志被重定向到 /dev/stdout,我也看不到它们。

这个标准输出发生了什么?

当你docker exec你可以看到你有几个进程

/ # ps -ef
PID   USER     TIME   COMMAND
    1 root       0:00 nginx: master process nginx -g daemon off;
    6 nginx      0:00 nginx: worker process
    7 root       0:00 /bin/sh
   17 root       0:00 ps -ef
/ # 

在Linux中,每个进程都有自己的stdin、stdout、stderr(和其他文件描述符),在/proc/pid/fd

因此,使用您的 docker exec (pid 7) 您可以在

中显示一些内容

/proc/7/fd/1

如果你这样做 ls -ltr /proc/7/fd/1,它会显示类似 /proc/4608/fd/1 -> /dev/pts/2 这意味着输出正在发送到终端

而您的 nginx 进程 (pid 1) 在

中显示其输出

/proc/1/fd/1

如果你这样做 ls -ltr /proc/1/fd/1,它会显示类似 /proc/1/fd/1 -> pipe:[184442508] 的内容,这意味着输出正在发送到 docker 日志记录驱动程序