【docker-compose】【nginx】动态配置

需求:部署前端镜像时需要动态修改nginx反向代理的后端服务的ip地址

  1. 原.conf配置调整,改为嵌入变量的文件模版
  2. Dockerfile 修改,通过envsubst将换将变量注入模版后再运行nginx
  3. docker-compose配置,通过environment动态修改变量

default.conf.tmplate(原default.conf)

动态变量:${MY_IP}

bash 复制代码
server {
    listen       80;
    server_name  localhost;

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

    location /api{
      proxy_pass http://${MY_IP}:18892;
    }
    
}

Dockerfile

如果有多个变量可用逗号隔开,envsubst '$MY_IP,$MY_PORT'

bash 复制代码
FROM nginx:1.20.2-alpine

COPY dist /usr/share/nginx/html

COPY nginx.conf /etc/nginx/nginx.conf
# 拷贝模板
COPY default.conf.tmplate  /etc/nginx/conf.d
# 切换目录
WORKDIR /etc/nginx/conf.d
# 将环境变量注入模版
ENTRYPOINT envsubst '$MY_IP'  < default.conf.tmplate > default.conf && cat default.conf && nginx -g 'daemon off;'

EXPOSE 80

docker-compose.yml

注意environment下的变量名称MY_IP要与上述对应

yaml 复制代码
environment:
      - MY_IP=server2

yml完整配置示例:

通过同一套镜像部署两个web项目,后端对应不同的数据库,前端对应不同的后端

yaml 复制代码
version: '2'
networks:
  myapp:
    driver: bridge
services:
  server1:
    image: [ip]:5000/server
    container_name: server1
    restart: always
    environment:
      - spring.datasource.url=jdbc:mysql://[ip]:3306/dbs1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTT
      - JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true
    networks:
      - myapp
  front1:
    image: [ip]:5000/front
    container_name: front1
    restart: always
    environment:
      - MY_IP=server1
    depends_on:
      - server1
    links:
      - server1
    ports:
      - "8095:80"
    networks:
      - myapp
  server2:
    image: [ip]:5000/server
    container_name: server2
    restart: always
    environment:
      - spring.datasource.url=jdbc:mysql://[ip]:3306/dbs2?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTT
      - JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true
    networks:
      - myapp
  front2:
    image: 10.1.58.6:5000/front
    container_name: front2
    restart: always
    environment:
      - MY_IP=server2
    depends_on:
      - server2
    links:
      - server2
    ports:
      - "8096:80"
    networks:
      - myapp
相关推荐
lichenyang4531 天前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang4531 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4531 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4531 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy6 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩7 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
Avan_菜菜8 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程