0%
Docker#004#容器nginx-ubuntu日志管理

nginx容器访问日志和错误日志的查看方法。

如何查看nginx-ubuntu容器中产生的访问日志和错误日志?

根据构建镜像时nginx的配置文件可知,日志分别为/var/log/nginx/access.log和/var/log/nginx/error.log。为了查看日志,我们需要进入容器内部查看这两个文件。方法如下图所示:

我们知道容器结束之后,在没有commit的情况下,数据不会落盘,也就说容器退出之后,日志也随之消失。我们希望可以长期保存日志,供我们回溯审计。那nginx官方镜像是如何管理日志的?

nginx官方镜像日志管理

nginx官方镜像可以使用 docker logs -f <container id> 查看日志,如下图所示:

我们知道docker logs可以查询Docker容器打印到标准输出和标准错误的信息,而nginx使用该方法供我们查询日志,那么肯定是nginx将日志打印到标准输出和标准错误了,或者日志被重定向到标准控制台。我们看下nginx的具体实现:

由上图我们可知:nginx官方镜像将 /var/log/nginx/access.log 重定向到标准输出;/var/log/nginx/error.log 从定向到标准错误。所以我们可以使用docker logs命令来获取nginx打印的日志。

Docker将容器日志在宿主机上存放为:/var/lib/docker/containers/<container-id>/<container-id>-json.log。我们来验证下:

我们再看下该json文件的内容:

可见json文件内容,与我们使用docker logs命令查看的日志内容一致,区别只不过是内容以json结构来存储的。

修改nginx-ubuntu的Dockerfile,我们也支持docker logs

基于上文《容器技术#003#基于Docker+Ubuntu制作镜像nginx-ubuntu》 的Dockefile,我们做个简单的修改以作适配,该版本我们称为V1.1.0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Nginx 服务镜像
# sudo docker build --build-arg VERSION=1.1.0 -t nginx-ubuntu:1.1.0 .
# sudo docker run -d -p 80:80 nginx-ubuntu:1.1.0

FROM ubuntu:22.04

WORKDIR /opt/app

LABEL maintainer="mancode@sohu.com"

# 定义环境变量
ENV NGINX_PACKAGE_PATH /opt/app/nginx
ENV NGINX_PATH /usr/local/nginx

COPY ./nginx/nginx-1.25.4.tar.gz ${NGINX_PACKAGE_PATH}/nginx-1.25.4.tar.gz

COPY ./nginx/docs/index.html ${NGINX_PATH}/www/index.html

RUN apt update && apt install -y gcc g++ make libssl-dev libpcre3 libpcre3-dev zlib1g-dev \
&& useradd -M -s /sbin/nologin nginx \
&& cd ${NGINX_PACKAGE_PATH} && tar -zxf nginx-1.25.4.tar.gz && cd nginx-1.25.4 \
&& ./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_sub_module \
&& make && make install \
&& mkdir -p /var/log/nginx \
&& mkdir -p /var/cache/nginx \
&& ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log

COPY ./nginx/conf/ /etc/nginx/

ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off; master_process on;"]

相关资源可以访问Github仓库 [ mancodenet/images/docker-nginx-ubuntu ] 下载。

构建说明:

  • 当前版本与V1.0.0唯一的区别就是在创建日志目录文件之后,我们使用软链接命令,将 /var/log/nginx/access.log 和 /var/log/nginx/error.log 分别重定向到/dev/stdout 和 /dev/stderr。
  • 重定向后nginx打印到日志文件的日志,就会输出到标准控制台上,从而被docker进程捕获,然后我们就可以使用docker logs命令查询,也可以到宿主机目录 /var/lib/docker/containers/<container-id>/ 内查看json日志文件。

参考资料