在Docker上部署NGINX和NGINX Plus

高性能应用程序交付平台NGINX Plus,负载均衡器和Web服务器可通过Docker容器部署。

  • 先决条件
  • 在Docker容器中运行NGINX开源
  • 在Docker容器中运行NGINX Plus
    • 创建NGINX Plus Docker映像
  • 管理NGINX配置和内容文件
    • 在Docker主机上维护内容和配置
    • 从Docker主机复制配置和内容文件
    • 维护容器中的配置文件和内容文件
  • 管理日志
    • 使用默认日志记录
    • 使用自定义日志
  • 控制NGINX

先决条件

  • Docker安装
  • Docker Hub帐户(NGINX开源)
  • nginx-repo.crtnginx-repo.key文件,用于创建Docker映像的Dockerfile(NGINX Plus)

在Docker容器中运行NGINX开源

您可以使用Docker Hub中的NGINX开源映像在Docker容器中创建NGINX实例。

  1. 启动运行在容器中的NGINX实例,并使用默认NGINX配置和以下命令:

    $ docker run --name mynginx1 -p 80:80 -d nginx
    

    • mynginx1 是基于NGINX映像创建的容器的名称
    • -d选项指定容器以分离模式运行:容器继续运行直到停止,但不响应在命令行上运行的命令。
    • -p选项告诉Docker将NGINX映像(端口80)在容器中公开的端口映射到Docker主机上的指定端口。第一个参数指定Docker主机中的端口,第二个参数映射到容器中公开的端口

    该命令返回容器ID的长格式fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d。这种形式的ID用于日志文件的名称。

  2. 验证容器是否已创建,并使用以下命令运行:docker ps

此命令还允许查看在上一步中设置的端口映射:PORTS输出中的字段报告80Docker主机上的端口已映射到80容器中的端口。

在Docker容器中运行NGINX Plus

Docker也可以与NGINX Plus一起使用。将Docker与NGINX Open Source结合使用的区别在于,您首先需要创建NGINX Plus映像,因为作为商业产品,NGINX Plus在Docker Hub上不可用。

注意:切勿将NGINX Plus映像上传到公共存储库(例如Docker Hub)。这样做违反您的许可协议。

创建NGINX Plus Docker映像

生成NGINX Plus图像:

  1. 创建Docker构建上下文或Dockerfile。在示例中,Debian 9(“ Stretch”)用作基础Docker映像:

    #For Debian 9
    FROM debian:stretch-slimLABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"# Download certificate and key from the customer portal (https://cs.nginx.com)
    # and copy to the build context
    COPY nginx-repo.crt /etc/ssl/nginx/
    COPY nginx-repo.key /etc/ssl/nginx/# Install NGINX Plus
    RUN set -x \&& apt-get update && apt-get upgrade -y \&& apt-get install --no-install-recommends --no-install-suggests -y apt-transport-https ca-certificates gnupg1 \&& \NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \found=''; \for server in \ha.pool.sks-keyservers.net \hkp://keyserver.ubuntu.com:80 \hkp://p80.pool.sks-keyservers.net:80 \pgp.mit.edu \; do \echo "Fetching GPG key $NGINX_GPGKEY from $server"; \apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys     "$NGINX_GPGKEY" && found=yes && break; \done; \test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \echo "Acquire::https::plus-pkgs.nginx.com::Verify-Peer \"true\";" >> /etc/apt/apt.conf.d/90nginx \&& echo "Acquire::https::plus-pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \&& echo "Acquire::https::plus-pkgs.nginx.com::SslCert     \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \&& echo "Acquire::https::plus-pkgs.nginx.com::SslKey      \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \&& printf "deb https://plus-pkgs.nginx.com/debian stretch nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \&& apt-get update && apt-get install -y nginx-plus \&& apt-get remove --purge --auto-remove -y gnupg1 \&& rm -rf /var/lib/apt/lists/* \&& rm -rf /etc/ssl/nginx# Forward request logs to Docker log collector
    RUN ln -sf /dev/stdout /var/log/nginx/access.log \&& ln -sf /dev/stderr /var/log/nginx/error.logEXPOSE 80STOPSIGNAL SIGTERMCMD ["nginx", "-g", "daemon off;"]
    

  2. 与NGINX开放源代码一样,默认的NGINX Plus映像具有相同的默认设置:

    • 访问和错误日​​志链接到Docker日志收集器
    • 未指定任何卷:Dockerfile可用于创建基础映像,您可以从中创建具有指定卷的新映像,或者可以手动指定卷:
    VOLUME /usr/share/nginx/html
    VOLUME /etc/nginx

    • 创建容器时,不会从Docker主机复制任何文件:您可以COPY向每个Dockerfile 添加定义,或者您创建的映像可用作另一个映像的基础
  3. 登录到NGINX Plus客户门户并下载您的nginx-repo.crtnginx-repo.key文件。对于NGINX Plus试用版,文件将随试用包一起提供。

  4. 将文件复制到Dockerfile所在的目录。

  5. 例如,创建一个Docker映像nginxplus(请注意命令中的最后一个句点)。

    $ docker build --no-cache -t nginxplus .
    

    --no-cache选项告诉Docker从头开始构建映像,并确保安装了最新版本的NGINX Plus。如果以前使用Dockerfile生成不带该--no-cache选项的映像,则新映像将使用Docker缓存中先前生成的映像中的NGINX Plus版本。

  6. nginxplus使用以下命令验证是否已成功创建映像:docker images

  7. 根据该图像创建一个容器,例如mynginxpluscontainer:

  8. mynginxplus使用以下命令验证容器是否已启动并正在运行:docker ps

NGINX Plus容器的控制和管理方式与NGINX开源容器相同。

管理内容和配置文件

NGINX和NGINX配置文件提供的内容可以通过几种方式进行管理:

  • 文件在Docker主机上维护
  • 文件从Docker主机复制到容器
  • 文件保存在容器中

在Docker主机上维护内容和配置文件

创建容器后,可以将Docker主机上的本地目录挂载到容器中的目录。NGINX映像使用默认的NGINX配置,该配置/usr/share/nginx/html用作容器的根目录,并将配置文件放入中/etc/nginx。对于本地目录中包含内容/var/www且配置文件位于中的Docker主机/var/nginx/conf,请运行以下命令:

$ docker run --name mynginx2 --mount type=bind,source=/var/www,target=/usr/share/nginx/html,readonly --mount source=/var/nginx/conf,target=/etc/nginx/conf,readonly -p 80:80 -d nginx

对Docker主机上本地目录中文件的任何更改都会反映在目录和容器中。该选项意味着只能在Docker主机上更改这些目录,而不能在容器内更改。/var/www and /var/nginx/conf/usr/share/nginx/html/etc/nginxreadonly

从Docker主机复制内容和配置文件

在容器创建期间,Docker可以从Docker主机上的本地目录复制内容和配置文件。创建容器后,可通过在文件更改时创建新容器或修改容器中的文件来维护文件。

复制文件的一种简单方法是使用基于NGINX映像的新Docker映像生成期间运行的命令创建Dockerfile。对于Dockerfile中的文件复制(COPY)命令,本地目录路径是相对于Dockerfile所在的构建上下文的。

假设目录content 目录为,配置文件目录为conf,则Dockerfile所在目录的两个子目录都位于该目录下。NGINX映像default.conf/etc/nginx/conf.d目录中具有默认的NGINX配置文件,包括。要仅从Docker主机使用配置文件,请使用以下RUN命令删除默认文件:

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx

通过从Dockerfile所在的目录中运行命令来创建NGINX映像。命令末尾的句点(“。”)将当前目录定义为构建上下文,其中包含Dockerfile和要复制的目录:

$ docker build -t mynginx_image1 .

mynginx3根据mynginx_image1图像创建一个容器:

$ docker run --name mynginx3 -p 80:80 -d mynginx_image1

要更改容器中的文件,请使用下一部分中所述的帮助容器。

维护容器中的内容和配置文件

由于SSH无法用于访问NGINX容器,因此要直接编辑内容或配置文件,您需要创建一个具有shell访问权限的帮助器容器。为了使帮助容器能够访问文件,请创建一个新映像,该映像具有为该映像定义的正确的Docker数据卷:

  1. 复制nginx内容和配置文件,并使用Dockerfile定义映像的卷:

    FROM nginx
    COPY content /usr/share/nginx/html
    COPY conf /etc/nginx
    VOLUME /usr/share/nginx/html
    VOLUME /etc/nginx

  2. 通过运行以下命令来创建新的NGINX映像:

    $ docker build -t mynginx_image2 .

  3. mynginx4根据mynginx_image2镜像创建一个NGINX容器:

    $ docker run --name mynginx4 -p 80:80 -d mynginx_image2

  4. 启动一个mynginx4_files具有外壳的帮助程序容器,以提供对mynginx4我们刚刚创建的容器的内容和配置目录的访问:

    $ docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash
    root@b1cbbad63dd1:/#

    注意:

    • 新的mynginx4_files辅助容器在前台运行,带有一个持久的标准输入(该-i选项)和一个tty(该-t选项)。定义的所有卷mynginx4都作为本地目录安装在帮助容器中。
    • debian参数表示帮助容器使用Docker Hub中的Debian映像。因为NGINX映像也使用Debian,所以将Debian用于帮助容器是最有效的,而不是让Docker加载另一个操作系统
    • /bin/bash参数表示bash shell在helper容器中运行,并显示一个shell提示,您可以根据需要修改该文件

要启动和停止容器,请运行以下命令:

$ docker start mynginx4_files
$ docker stop mynginx4_files

要退出外壳但不让容器运行,请按,Ctrl+p然后按Ctrl+q。要重新获得对正在运行的容器的Shell访问,请运行以下命令:

$ docker attach mynginx4_files

要退出外壳并终止容器,请运行exit命令。

管理日志

您可以使用默认日志记录或自定义日志记录。

使用默认日志记录

默认情况下,NGINX映像配置为将NGINX 访问日志和错误日志发送到Docker日志收集器。这是通过将它们链接到stdout和来完成的stderr:然后将两个日志中的所有消息都写入/var/lib/docker/containers/container-ID/container-ID-json.logDocker主机上的文件中。container-ID是创建容器时返回的长格式ID 。要显示长格式ID,请运行以下命令:

$ docker inspect --format '{{ .Id }}' container-name

您可以同时使用Docker命令行和Docker Engine API提取日志消息。

要从命令行提取日志消息,请运行以下命令:

$ docker logs container-name

要使用Docker Remote API提取日志消息,GET请使用Docker Unix袜子发送请求:

$ curl --unix-sock /var/run/docker-sock http://localhost/containers/container-name/logs?stdout=1&stderr=1

要仅在输出中包括访问日志消息,请仅包括stdout=1。要将输出限制为错误日志消息,请仅包含stderr=1。有关其他可用选项,请参阅Docker Engine API文档的获取容器日志部分。

使用自定义日志

如果要为某些配置块(例如和)以不同的方式配置日志记录,请为将日志文件存储在容器中的目录定义一个Docker卷,创建一个帮助器容器来访问日志文件,并使用任何日志记录工具。要实现此目的,请创建一个新映像,其中包含日志文件的一个或多个卷。server {}location {}

例如,要将NGINX配置为在中存储日志文件/var/log/nginx/log,请VOLUME将此目录的定义添加到Dockerfile中(前提是在容器中管理内容和配置文件):

然后,您可以创建一个映像,并使用它来创建有权访问日志目录的NGINX容器和帮助器容器。辅助容器可以安装任何所需的日志记录工具。

控制NGINX

由于不能直接访问NGINX容器的命令行,因此NGINX命令不能直接发送到容器。相反,可以通过Docker 命令将信号发送到容器kill

要重新加载NGINX配置,请将HUP信号发送到Docker:

$ docker kill -s HUP container-name

要重启NGINX,请运行以下命令来重启容器:

$ docker restart container-name

在Docker上部署NGINX和NGINX Plus相关推荐

  1. docker上部署nginx容器80端口自动转443端口

    拉去nginx镜像 # docker pull nginx 运行nginx容器config用于拷贝nginx配置文件 # docker run --name nginxconfig -d docker ...

  2. 如何在Kubernetes 上部署安装PHP + Nginx 多容器应用

    引言 Kubernetes是一个开源的容器编排系统.它允许你创建.更新和扩展容器,而无需担心停机. 要运行一个PHP应用程序,Nginx充当PHP-FPM的代理.将此设置打包到单个容器中可能是一个繁琐 ...

  3. 在Centos8上部署Django环境(Nginx+mysql+uwsgi)

    前言:笔者通过阿里云的学生"在家实践计划"获得了一台2核4G的云ECS实例,并安装了Centos8镜像.于是尝试部署一套Django的生产环境.笔者选择了 Nginx + uwsg ...

  4. 开源项目新蜂商城在Linux上部署,mysql+nginx

    newbee-mall是一项基于Spring Boot的在线商城系统,非常适合新手了解学习Spring Boot框架 源码新蜂商城后端接口 newbee-mall-api 新蜂商城 Vue3 版本 n ...

  5. 解决微服务在docker上部署后无法连接数据库的问题

    在利用docker部署完应用程序后,就接着考虑如何将程序连接到数据库. 但是过程中发现一些问题: 本地程序在打包后连接的是本地的数据库,在服务器上部署之后必须提供相同的环境才能部署成功. 这里博主用的 ...

  6. 在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor

    如果是新服务器先要进行基本的配置 部署前应用配置 开发环境与生产环境中的应用一般会有两套不同的配置.比如 DEBUG 选项,数据库配置等. 对于 setting.py 文件, 在生产环境中我们要设置 ...

  7. Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)

    # 使用docker-compose.yml 安装gitlab服务器 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/ ...

  8. Docker上部署MariaDB

    这篇文章主要分为两个部分. 第一部分通过描述使用场景介绍为什么要使用 Docker 以及在 Docker 中使用 MariaDB 有什么优势. 接下来在第二部分中详细介绍如何安装 Docker ,使用 ...

  9. Docker上部署GitLab服务器

    # 安装docker的前提下 运行此段代码即可 请确保 /srv/gitlab/ 目录下创建好config logs data 目录 sudo docker run --detach \ --host ...

最新文章

  1. java 苹果vcf解析_VCF文件格式解析
  2. 刷题笔记-2019年6月26日
  3. php数字加零,php实现数字补零的两种方法
  4. 浩辰CAD2021中文版
  5. 结构化数据建模——titanic数据集的模型建立和训练(Pytorch版)
  6. 可穿戴在线展持续升温:聚焦产业热点 畅谈核心技术发展
  7. Android - 文字中显示图片
  8. 更开放的分布式事务 | Fescar 品牌升级,更名为 Seata
  9. 启用zhparser插件时一直报Permission denied
  10. [Flex]实现Application未初始化前加载自定义配置内容
  11. google ads 关联 firebase 进行广告投放配置
  12. idea中MySQL数据库分页
  13. Python从ftp服务器下载文件的源码
  14. Android Fingerprint属性
  15. rog幻13和幻14区别 幻13和幻14评测怎么选
  16. 《文明之光》吴军 著,读书笔记
  17. 【比特熊故事汇】X Microsoft Build 2022——微软专家+MVP,技术亮点全解析
  18. MYSQL学习思维导图
  19. win11 某个任务栏图标显示空白解决方法
  20. 4星|《维米尔的帽子》:17世纪荷兰画中的全球化踪迹,鸦片与烟草被当时中国主流文化接纳的故事...

热门文章

  1. WordPress 主题教程 #4b:Header 模板 2
  2. 关于application/x-www-form-urlencoded等字符编码的解释说明
  3. javascript 中的面向对象实现 如何封装
  4. MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明)
  5. Unix系统的diff工具程序
  6. Samba 和Shell Script 的应用
  7. 【AI视野·今日NLP 自然语言处理论文速览 第二十六期】Wed, 3 Nov 2021
  8. JVM—引用计数和可达性分析算法(存活性判断)
  9. 【C++基础学习】二维数组的动态分配及参数传递
  10. TreeView节点的演练 c# 1614840318