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 日志记录驱动程序
如果我这样做:
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 日志记录驱动程序