一、背景
机器上已有nginx的可执行文件,但它是基于官方源码进行修改过的,可模块的源码一时找不到。另外,每次都基于源码去构建,对于Nginx部署也是麻烦。
所以,我们想要改为docker容器化部署nginx。
- 操作系统是centos7
- nginx版本是1.15.2
在介绍容器化方案前,我们先对目录进行一些说明。
容器里的目录结构,尽量和原主机的保持一致。比如我的宿主机nginx目录是在/server/nginx,可执行文件在/server/nginx/sbin目录下,像其他的目录(conf/logs/html)也都是在其相对路径中。
二、容器化思路
1、使用docker volume的方式,挂载主机的可执行文件至容器。
nginx:
image: nginx:1.15.2
restart: always
container_name: nginx
volumes:
- /server/nginx/sbin/nginx:/usr/sbin/nginx:rw
- ./nginx/conf:/server/nginx/conf:rw
- ./nginx/logs:/server/nginx/logs:rw
- ./nginx/html:/server/nginx/html:rw
ports:
- 80:80
2、基于alpine/centos/ubuntu等操作系统,将可执行文件拷贝进容器。
这里仅以ubuntu为例:
# 使用基础的 Ubuntu 镜像
FROM ubuntu:latest
# 更新系统并安装 Nginx 1.15.2 版本
RUN apt-get update && apt-get install -y nginx=1.15.2
# 日志文件
RUN mkdir -p /server/nginx/logs
# 复制自定义的 Nginx 配置文件到容器中
COPY conf/. /server/nginx/conf
COPY html/. /server/nginx/html
# 复制您的可执行文件到容器中
COPY sbin/nginx /usr/sbin/nginx
# 暴露 Nginx 默认的 HTTP 端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
3、基于官方nginx,将可执行文件拷贝进容器。
#nginx 1.15.2 镜像作为基础镜像
FROM nginx:1.15.2
# 日志文件
RUN mkdir -p /server/nginx/logs
# 复制自定义的 Nginx 配置文件到容器中
COPY conf/. /server/nginx/conf
COPY html/. /server/nginx/html
# 复制您的可执行文件到容器中
COPY sbin/nginx /usr/sbin/nginx
# 暴露 Nginx 默认的 HTTP 端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
三、测试
docker build -t xxx-nginx:1.15.2-0826 .
docker run -it -p 8082:80 xxx-nginx:1.15.2-0826
这里再举例使用docker-compose部署nginx,采用的是自定义docker 镜像。
nginx:
image: xxx-nginx:1.15.2-0826
restart: always
container_name: nginx
volumes:
- ./nginx/nginx.conf:/server/nginx/conf/nginx.conf
- ./nginx/logs:/server/nginx/logs
ports:
- 80:80
方案三比之方案一较好的一个地方是,宿主机只需要一个nginx.conf文件。
在相对路径nginx下的文件列表见下:
方案二和方案三的区别不大,一处是底层的操作系统不同,二是要指定nginx版本进行安装。
目标都是要有一个已安装好的Nginx,第二步都是拷贝自定义文件至容器。
四、总结
本文主要是讲述了如何定制一个nginx容器,要制作自定义容器的几个办法。