Docker镜像的私有定制之nginx

一、背景

机器上已有nginx的可执行文件,但它是基于官方源码进行修改过的,可模块的源码一时找不到。另外,每次都基于源码去构建,对于Nginx部署也是麻烦。
所以,我们想要改为docker容器化部署nginx。

  • 操作系统是centos7
  • nginx版本是1.15.2

在介绍容器化方案前,我们先对目录进行一些说明。
容器里的目录结构,尽量和原主机的保持一致。比如我的宿主机nginx目录是在/server/nginx,可执行文件在/server/nginx/sbin目录下,像其他的目录(conf/logs/html)也都是在其相对路径中。
Docker镜像的私有定制之nginx_第1张图片

二、容器化思路

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下的文件列表见下:
Docker镜像的私有定制之nginx_第2张图片

方案二和方案三的区别不大,一处是底层的操作系统不同,二是要指定nginx版本进行安装。
目标都是要有一个已安装好的Nginx,第二步都是拷贝自定义文件至容器。

四、总结

本文主要是讲述了如何定制一个nginx容器,要制作自定义容器的几个办法。

你可能感兴趣的:(docker,nginx,容器)