编写简单的nginx Dockerfile文件

.1.创建 Dockerfile 文件

touch Dockerfile

添加如下相关的配置信息

 

# 设置维护者信息

LABEL maintainer="676662095@qq.com"

 

# 使用官方Nginx基础镜像

FROM nginx:1.24.0

 

# 安装构建Nginx模块所需的工具和依赖

RUN apk add --no-cache --virtual .build-deps \

    gcc \

    libc-dev \

    make \

    openssl-dev \

    pcre-dev \

    zlib-dev \

    libxml2-dev \

    libxslt-dev \

    gd-dev \

    geoip-dev \

    perl-dev

 

# Nginx源码包解压并进入目录(需提前准备Nginx源码包,并放在Dockerfile同目录下)

ARG NGINX_VERSION=1.24.0

ADD http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz /opt/u01/exam/nginx

WORKDIR /opt/u01/exam/nginx/nginx-${NGINX_VERSION}

 

# 编译Nginx并安装所需模块

RUN ./configure \

    --with-http_ssl_module \

    --with-http_v2_module \

    --with-http_gzip_static_module \

    --with-ngx_http_core_module \

    --with-http_secure_link_module \

    --with-ngx_http_proxy_module \

    --with-ngx_http_rewrite_module \

    --ngx_http_upstream_module \

 

 

RUN make && make install

 

 

# 复制必要的配置文件和静态资源到容器

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

 

# 将静态网页资源复制到镜像中

COPY html/ /usr/share/nginx/html

 

# 设置环境变量

ENV NGX_CONF_FILE=/etc/nginx/nginx.conf

 

# 清理临时文件

# RUN rm -rf /tmp/*

 

 

# Nginx配置为随容器启动

# RUN echo "[Unit]\nDescription=The NGINX HTTP and reverse proxy server\nAfter=network.target\n\n[Service]\nUser=root\nExecStartPre=/usr/bin/rm -f /run/nginx.pid\nExecStart=/usr/local/nginx/sbin/nginx -c $NGX_CONF_FILE\nExecReload=/bin/kill -s HUP $MAINPID\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target" > /etc/systemd/system/nginx.service

 

 

# 设置容器启动时运行Nginx服务

CMD ["nginx", "-g", "daemon off;"]

 

# 暴露80端口

EXPOSE 80

 

.2.手动创建htmllog等目录,nginx.conf配置文件。

 

可根据实际需要创建其他目录。

 

.3.执行构建容器命令

docker build -f Dockerfile -t mynginx .

一定要注意,最后面有一个小数点,据网友说表示当前目录

https://www.cnblogs.com/wjdzh/p/16372088.html

如果不添加最后面的小数点,则会出现如下的错误信息,

ERROR: "docker buildx build" requires exactly 1 argument.

 

 

修改后重新构建结果如下,

 

 

导致该问题的原因,FROM语句需要放在第一句中,不能放在其他位置。参考博客如下,

https://www.cnblogs.com/fengyinxu/p/fix-docker-no-build-stage-in-current-context.html

 

修改之后,重新执行命令,发现出现新的错误信息如下。

ERROR [2/7] RUN apk add --no-cache --virtual .build-deps     gcc     libc-dev     make     openssl-dev     pcre-dev     zlib-dev     libxm  0.3s

 

从错误信息来看,可以看出错误信息是在大致第九行的位置。

 

 

尝试着使用网友使用的方式,

https://www.cnblogs.com/sxshaolong/p/14144752.html

 

 

再次执行仍然报错,

 

找到一篇博客,尝试着添加一行代码,问题未解决。

 

 

https://serverfault.com/questions/951526/run-yum-in-docker-file-not-working-but-yum-its-working-inside-the-container

 

 

查看过的博文贴在这里,或许会对您有帮助,

https://juejin.cn/post/6992848354753380389

https://blog.csdn.net/zltliqi/article/details/129992030

https://blog.51cto.com/u_16175496/9342968

 

找了N多个解决方案都没有解决,最终找到一篇博文,对于解决问题有进步。

https://blog.csdn.net/a975719898/article/details/119346919

 

最终还是构建失败,大致猜测是在下载一些文件的时候,可以需要外网之类的,导致下载不下来。

继续寻找解决方案,找到如下的博客

https://cloud.tencent.com/developer/article/2194297

 

执行到第三行命令时还是失败。

 

注释掉图片标记中的第三行代码,重新执行,继续报错。

 

 

暂时仍然未解决。

不过找到一种替代方案,那就是先在Linux环境下,安装好必要的nginx编译工具和需要模块,编译好之后,在进行打包。

这样可以简化Dockerfile文件的编写,最终内容如下

# 使用官方Nginx基础镜像

FROM nginx:1.24.0

 

# 设置维护者信息

LABEL maintainer="676662095@qq.com"

 

# Nginx源码包解压并进入目录(需提前准备Nginx源码包,并放在Dockerfile同目录下)

ARG NGINX_VERSION=1.24.0

ADD http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz /opt/u01/exam/nginx

WORKDIR /opt/u01/exam/nginx/nginx-${NGINX_VERSION}

 

# 复制必要的配置文件和静态资源到容器

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

 

# 将静态网页资源复制到镜像中

COPY html/ /usr/share/nginx/html

 

# 设置环境变量

ENV NGX_CONF_FILE=/etc/nginx/nginx.conf

 

 

# 设置容器启动时运行Nginx服务

CMD ["nginx", "-g", "daemon off;"]

 

# 暴露80端口

EXPOSE 80

 

注释掉下面的代码,大概意思就是工作目录的意思,猜测是用来编译nginx二进制代码使用的。

WORKDIR /opt/u01/exam/nginx/nginx-${NGINX_VERSION}

 

然后再次执行,终于执行成功,可以使用docker images命令进行查看。

 

 

上面的显示方式不太友好,删除刚刚构建的这个镜像,docker rmi 镜像名或镜像ID

优化一下,添加一个版本号 docker build -f Dockerfile -t mynginx:V1 .

 

 

使用自定义的nginx镜像,启动nginx容器如下,

 

 

 

打开浏览器测试访问,报错403 Forbidden

 

 

 

 排查问题,发现html目录下没有文件,然后创建一个文件,添加如下代码。

 

 

最后测试,发现可以正确访问。

到此,初步完成通过自己编写Dockerfile文件,然后构建镜像,

 

参考博文如下。

https://cikeblog.com/nginx-manual-packaging-tutorial.html

https://www.cnblogs.com/you-men/p/14944023.html

https://soulteary.com/2021/03/22/how-to-use-nginx-third-party-modules-efficiently-in-the-container-era.html

https://juejin.cn/post/7319541661939286067

https://nowtime.cc/docker/1636.html

posted @ 2024-03-24 16:24  一只爱阅读的程序员  阅读(892)  评论(0编辑  收藏  举报