编写简单的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.手动创建html、log等目录,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