一文搞定,使用yaml文件实现多环境配置与Maven打包,Nginx反向代理,Docker部署功能


前言

   在日常开发工作中通常会根据不同的项目运行环境,添加不同的配置文件,例如 开发环境,测试环境,生产环境等,每次手工的修改配置文件太过于繁琐,所以,可以在通过maven打包时确定需要使用的配置文件可以很好的解决这个问题。


一、Spring 配置

在application.yml中添加配置

# Spring配置
spring:
  profiles: 
    active:
      - "@activated.profile@"

二、Maven 配置

   Spring 配置文件也可以通过 Maven 配置文件激活,通过指定activated.profile 配置属性。
在每个 Maven 配置文件(父pom.xml)中,我们可以设置一个activated.profile属性,代码如下(示例)::

    <profiles>
        <profile>
            <id>druid</id>
            <activation>
                <!-- 不显式指定环境时, 会取 activeByDefault true 的环境变量,
                     需要注意的是: 没指定 activeByDefault true 的其他相同 profile id 的 properties 是不会生效的-->
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <activated.profile>druid</activated.profile>
            </properties>
            <build>
                <resources>
                    <resource>
                        <!--不加载docker.* 配置文件-->
                        <filtering>false</filtering>
                        <directory>src/main/resources</directory>
                        <excludes>
                            <exclude>application-docker.*</exclude>
                        </excludes>
                    </resource>
                    <resource>
                        <!--加载.* , druid.* 配置文件-->
                        <filtering>true</filtering>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>application.*</include>
                            <include>application-druid.*</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>docker</id>
            <properties>

                <activated.profile>docker</activated.profile>
                <!-- redis连接配置,与application-docker.yml配置文件中属性绑定 -->
                <redis.host>ruoyi-redis</redis.host>
                <redis.port>6379</redis.port>

                <!-- mysql连接配置,与application-docker.yml配置文件中属性绑定 -->
                <datasource.url><![CDATA[jdbc:mysql://172.16.10.132:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8]]></datasource.url>
                <datasource.username>root</datasource.username>
                <datasource.password>root</datasource.password>
            </properties>
            <build>
                <resources>
                    <resource>
                        <!--不加载druid.* 配置文件-->
                        <filtering>false</filtering>
                        <directory>src/main/resources</directory>
                        <excludes>
                            <exclude>application-druid.*</exclude>
                        </excludes>
                    </resource>
                    <resource>
                        <!--加载.* , docker.* 配置文件-->
                        <filtering>true</filtering>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>application.*</include>
                            <include>application-docker.*</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>

<activated.profile>docker</activated.profile>它的值将用于替换 application.yml中的@activated.profile@ 占位符:
因此,项目就会加载application-docker.yml 的配置

在这里插入图片描述

同理,当需要配置数据库信息时,也可用此方法,标签名一致即可,替换application-docker.yml中的数据。

在这里插入图片描述

三、Nginx 配置

   使用Nginx进行反向代理,创建nginx.conf文件,代码如下(示例):

#允许生成的进程数,默认为1
worker_processes 1;

events {
    #每个进程的最大连接数,默认为512
    worker_connections 1024;
    }

http {
    #文件扩展名与文件类型映射表
    include    /etc/nginx/mime.types;
    #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile   on;

    # 代理缓冲区
    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;

    client_max_body_size   100m;

    # keepalive_timeout  65;

    server {
        listen       80;
#       server_name  localhost;
# 		charset utf-8;

		location / { # 请求的url过滤
		    # 对应docker-compose.yml文件中的配置(nginx:volumes)
            root   /home/www/ruoyi-frontend;
        }

		location /prod-api/ {
		    resolver 127.0.0.11 ipv6=off;
		    # 对应docker-compose.yml文件中的配置(ruoyi-system 容器名可代表IP)8080代表后端模块端口
			set $upstream ruoyi-system:8080;
            proxy_pass         http://$upstream;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
		}

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

四、Docker部署

Dockerfile 定制镜像

  创建Dockerfile文件,代码如下(示例):

FROM openjdk:8-jre
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
WORKDIR /
ENTRYPOINT ["java","-jar","/app.jar"]

Docker Compose 定义和运行多个 Docker 容器

  创建docker-compose.yaml文件,代码如下(示例):

version: "3.7"
services:
  # 对于不是自定义镜像,可直接从线上(dockerhub)拉取
  redis:
    image: redis:latest # 镜像名:版本
    container_name: ruoyi-redis # 容器中的镜像名
    ports:  # 映射端口-->对外暴露端口:容器内部占用端口
      - 6379:6379
    networks:  # 网关
      - backend
    environment:
      - TZ=Asia/Shanghai
    # 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
    restart: unless-stopped

  ruoyi:
    build: ./ruoyi-admin  # 指定同级目录的eureka文件中构建的镜像(Dockerfile文件)
    image: ruoyi/system:latest
    container_name: ruoyi-system
    volumes:
      # D:\logs\ruoyi  部署成功后,日志文件的位置
      # /logs  对应模块下application-docker.yml中配置的日志路径
      - D:\logs\ruoyi:/logs
    networks:
      - backend
#    ports:
#      - 8080:8080
    depends_on:
      - redis # 当前容器依赖于这个项目启动之后才能启动
    environment:
      - TZ=Asia/Shanghai

  # nginx 配置
  nginx:
    image: nginx:latest
    container_name: ruoyi-nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./frontend:/home/www/ruoyi-frontend  # 静态资源路径(打包后的资源文件夹名) : nginx.cong中配置的路由跳转路径
    ports:
      - 31002:80  # 对外暴露端口:容器内部占用端口(即nginx监听端口)
    restart: unless-stopped
    networks:
      - backend

# 配置网关
networks:
  backend:
    name: ruoyi # 随便取

在这里插入图片描述

五、打包部署命令

前端

  在前端Vue项目的package.json,的 "scripts"中添加

"build:prod": "vue-cli-service build",

直接运行该指令,或npm run bulid:prod,生成静态资源文件,复制至后端项目中

后端

###帮助文件

### maven commands
/**
 -P xxx ,激活id为xxx的profile(如有多个,用逗号隔开)
 -DskipTests 打包时,跳过src->test 测试文件夹
 */
mvn clean package -P docker -DskipTests 
mvn clean package -P docker -DskipTests -Ddatasource.url=<your db url> -Ddatasource.username=<your db username> -Ddatasource.password=<your db password> -Djwt.secret=<your jwt secret>
### 移动打包好后的文件

修改、运行 gatherWarPackages.bat

### docker compose

##### 全部启动

docker compose up // -d --no-start --no-recreate --no-build  (-d是在后台运行)
docker compose up --build service1 service2  (部分启动)

##### build

docker compose build [service1, service2...]
举例说明:docker compose build service1 service2  (服务之间用空格隔开)

##### start

docker compose start [service1, service2...]

##### restart

docker compose restart [service1, service2...]

注意事项 1

  当定制镜像时,如果使用openjdk:8-jre-alpine 有可能会出现NullPointerException错误,如下所示:

java.lang.NullPointerException
	at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
	at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
	at sun.awt.FontConfiguration.init(FontConfiguration.java:107)

这是由于alpine缺少FontConfiguration导致的。
所以,建议此时,使用openjdk:8-jre,即可解决问题。

注意事项 2

  当使用Nginx进行反向代理的时候,如果nginx.conf配置文件写在了项目里,则说明部署的时候会将Nginx也部署在Docker中,docker-compose.yml中的ports可选择性注释掉,因为Nginx与项目部署在一起,所以两者的端口其实是一致的,映射端口无意义。

  当不使用Nginx而使用Gateway进行代理时,也可选择性注释部分ports,因为Gateway帮我们映射了

注意事项 3

当你部署完成后,如果需要通过idea启动项目,则必须重新编译原有项目
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DockerNginx可以一起使用实现反向代理。你可以按照以下步骤进行操作: 1. 首先,确保你已经正确安装了DockerDocker Compose。 2. 创建一个Docker Compose文件(比如:docker-compose.yml),并添加以下内容: ```yaml version: '3' services: nginx: image: nginx ports: - 80:80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./certs:/etc/nginx/certs depends_on: - app app: image: your_app_image ``` 上述配置中,我们定义了两个服务:`nginx`和`app`。`nginx`使用了官方的Nginx镜像,并将宿主机的80端口映射到容器的80端口。`app`是你要代理的应用。 3. 创建一个名为`nginx.conf`的Nginx配置文件,并将其放在与`docker-compose.yml`相同的目录下。以下是一个简单的示例配置: ```nginx events {} http { server { listen 80; location / { proxy_pass http://app:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } ``` 上述配置中,我们定义了一个监听80端口的Nginx服务器块,并将所有请求代理到名为`app`的服务的8000端口。你可以根据自己的需求进行调整。 4. 确保你的应用容器在Docker Compose文件中正确配置,并且可以通过`app`服务的名称进行访问。如果你的应用容器暴露了其他端口,你需要相应地调整Nginx配置文件中的`proxy_pass`指令。 5. 在终端中,导航到包含`docker-compose.yml`和`nginx.conf`文件的目录,并运行以下命令启动容器: ``` docker-compose up -d ``` 这将启动Nginx和你的应用容器,并将它们连接到同一个Docker网络中。 现在,当你访问宿主机的80端口时,Nginx将会将请求转发给你的应用容器,实现反向代理。记得根据你的具体需求对配置进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值