docker使用环境变量的方式动态配置nginx

news/2024/7/7 21:47:48 标签: nginx, docker, 运维

docker使用环境变量的方式动态配置nginx

  • 一、需求
  • 二、制作镜像
    • 2.1 准备nginx.tmplate模板文件
    • 2.2 准备Dockerfile
    • 2.3 执行Dockerfile
  • 三、启动nginx
  • 四、补充
    • 4.1 关于nginx容器内配置文件的管理问题

一、需求

使用docker部署nginx时,由于nginx配置文件里面的一些ip和端口是随着环境变化而改变的,即在不同的环境里,使用的ip和端口都不一样。这就导致每次部署到新环境时,都要重新编写配置文件,再制作成新的镜像,比较繁琐。

所以我想要制作一个通用的镜像,将ip和端口设置成变量,等到需要部署到其他环境时候,再相应地传入ip和端口变量值

参考文章:
使用docker环境变量动态配置nginx

二、制作镜像

nginxtmplate_9">2.1 准备nginx.tmplate模板文件

nginx.tmplate文件内容如下:

server{
   listen      80;
   server_name localhost;
   auth_basic "请输入账号密码";
   auth_basic_user_file /usr/share/nginx/htpasswd;   # 存放密码文件的路径

   location / {
      root  /usr/share/nginx/html/;
      index index.html;
   }

   location /skywalking/graphql {
      proxy_method POST;
      proxy_pass http://${SKYWALKING_SERVER_IP}:${SKYWALKING_SERVER_PORT}/graphql;
      # 此处的两个变量为容器启动时传入
   }

   location /skywalking {
      alias /usr/share/nginx/dist/;
      try_files $uri $uri/ /skywalking/index.html;
   }

   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   /usr/share/nginx/html;
   }
}

其中${SKYWALKING_SERVER_IP}${SKYWALKING_SERVER_PORT}两个变量是根据环境变化而变化的

2.2 准备Dockerfile

# 1.继承基础nginx镜像
FROM nginx:1.21.5

RUN \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
# 2.将准备的模板文件拷贝到容器的配置文件目录
COPY ./deploy/nginx.template /etc/nginx/conf.d
# 3. 切换工作目录
WORKDIR /etc/nginx/conf.d
# 4. 添加环境变量的写入
ENTRYPOINT envsubst '$SKYWALKING_SERVER_IP $SKYWALKING_SERVER_PORT'  < nginx.template > default.conf && cat default.conf && nginx -g 'daemon off;'

EXPOSE 80

envsubst '$SKYWALKING_SERVER_IP $SKYWALKING_SERVER_PORT' < nginx.template > default.conf命令作用:

  1. 取环境变量$SKYWALKING_SERVER_IP$SKYWALKING_SERVER_PORT的值注入到模板文件 nginx.template相应的位置,(所以此处变量名要和模板文件中保持一致)
  2. 将替换好的模板内容输出到default.conf文件

envsubst命令使用参考:
https://blog.csdn.net/kozazyh/article/details/107905080

cat default.conf命令作用:
查看生成的defual.conf文件内容。方便后续容器启动的时候,直接使用docker logs命令查看

2.3 执行Dockerfile

执行命令docker build -t nginx-test:9.3.0 .,制作出镜像nginx-test:9.3.0

nginx_73">三、启动nginx

dockercomposeyml_74">3.1 准备docker-compose.yml

docker-compose.yaml内容如下:

version: '3.1'
services:
    nginx:
        image: monitor/demo/monitor-skywalking-ui-9.3:20230522150607      # 镜像名称
        container_name: nginx     # 容器名字
        restart: "no"     # 开机自动重启
        ports:     # 端口号绑定(宿主机:容器内)
            - '5080:80'
        environment:
            - SKYWALKING_SERVER_IP=47.106.225.35  #传入的变量值
            - SKYWALKING_SERVER_PORT=12800   #传入的变量值

执行命令:docker-compose up -d启动。

四、补充

nginx_95">4.1 关于nginx容器内配置文件的管理问题

参考文章:
https://www.cnblogs.com/fps2tao/p/9958009.html


http://www.niftyadmin.cn/n/352870.html

相关文章

分布式事务解决方案探讨

分布式事务解决方案 一、什么是事务&#xff1f;二、什么是分布式事务&#xff1f;三、分布式事务的理论模型3.1 X/Open 分布式事务模型3.1.1 X/Open事务执行流程3.1.2 XA 协议 3.2 两阶段提交协议3.3 三阶段提交协议 四、分布式事务场景解决方案4.1 TCC补偿方案4.2 基于可靠性…

办公室想装修?玻璃隔断让你的办公区域成为艺术品!

玻璃隔断是现代办公室装修中非常受欢迎的设计元素。它们不仅可以实现空间区分&#xff0c;还能为办公区带来现代感和艺术气息。 玻璃隔断的优点 1. 明亮&#xff1a;玻璃隔断可以让自然光线进入整个房间&#xff0c;使空间变得更加明亮&#xff0c;有益于工作效率和员工的情绪健…

C++小知识点(for,nullptr)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

Linux系统配置ntp时钟同步

1. 首先&#xff0c;您可以尝试手动更新系统时间&#xff0c;以使其更接近 NTP 时间 sudo ntpdate -u pool.ntp.org 也可以使用 ntpd -q 命令手动进行一次时间同步&#xff0c;并使用 ntpq -p 命令检查同步状态和偏差。 2. ntp.conf 文件是 NTP&#xff08;Network Time Prot…

RocketMQ 怎么实现的消息负载均衡以及怎么能够保证消息被顺序消费

一、RocketMQ 怎么实现的消息负载均衡 RocketMQ是一种开源的分布式消息中间件&#xff0c;它使用了一种称为消息负载均衡的机制来实现消息的分发和消费的负载均衡。RocketMQ的消息负载均衡主要是通过以下两个方面实现的&#xff1a; 消息队列分组&#xff08;Message Queue G…

设计模式 - 单例设计模式

所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类 只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法(静态方法)。 单例设计模式八种方式 饿汉式(静态常量饿汉式&#xff08;静态代码块&#xff09;懒…

我干了8年测试,告诉你现在软件测试还能不能找到工作!

观点&#xff1a;如果你还是以前的思维来学习测试&#xff0c;那你肯定是找不到工作&#xff01; 我做测试工作有将近8年的时间&#xff0c;蚂蚁金服做过2年&#xff0c;因为加班太多离职了。目前在一家国企上市公司&#xff0c;一年能拿三四十个左右&#xff0c;对比头部互联…

如何获取HTTP请求时间与响应时间【附源码】

文章目录 一、问题描述二、抓包观察三、查找文档四、思考尝试五、精益求精六、源码解说 一、问题描述 今日遇到了一个问题&#xff0c;要去获取HTTP报文在请求和响应的时间&#xff0c;因为没有原生的API可以调用&#xff0c;所以需要一定的技巧~ 下面主体的框架和代码&#xf…