docker快速部署java+nginx+mysql运行环境

docker快速部署java+nginx+mysql运行环境

我们在工作中会经常遇到快速部署项目的需求,如果采用纯手动搭建将会是一件非常麻烦的事情,尤其是在Linux服务器上,它牵扯到基础环境安装及配置等繁琐的步骤。
本文将介绍一种docker部署方式,将使这项工作变得非常方便快捷。

1 构建java运行容器

首先 springboot 依赖 java 环境,我们需要找一个 java8 的基础镜像来进行改造
经不断的寻找和测试,fiadlie/java8-jre符合要求
经过改造后的 dockerfile 如下:

# 1. 从java8-jre镜像来构建新镜像
FROM fiadliel/java8-jre
MAINTAINER chrischen "chrischen083@126.com"
  
# 2. 设置项目路径,也就是SpringBoot Jar包路径
ENV DOCKER_PORJECT_PATH /project

# 3. 修改jvm配置,解决Linux下服务启动慢问题
ADD java.security /usr/lib/jvm/default-jvm/jre/lib/security/java.security

WORKDIR $DOCKER_PORJECT_PATH

# 4. 对外开放8001端口
EXPOSE 8001

# 5. 校正容器时区问题,改为中国时间
RUN apk add -U tzdata
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

# 6. 这里将默认启动 /project 目录下的第一个jar包,用于外部挂载目录,确保该目录下只有一个jar文件
ENTRYPOINT java -jar $DOCKER_PORJECT_PATH/$(ls | grep .jar -m 1) --server.port=8001 --spring.profiles.active=prod

java.security 文件改动如下

securerandom.source=file:/dev/./urandom

将文件保存为如下目录

docker_base
├── Dockerfile
└── java.security

执行镜像构建命令

cd docker_base
sudo docker build -t java/springboot:1.0 .

将打包好的jar包和yml文件放入挂载目录下,然后启动容器

sudo docker run --name my_service -v /my_project:/project -p 8001:8001 -d java/springboot:1.0

通过docker日志检查服务启动状态

sudo docker logs my_service -f

2 构建MySQL容器

直接使用dockerhub mysql官方镜像即可轻松构建
创建空的挂载路径例如 mkdir /mysql_path

sudo docker run --name mysql57 \ 
  -v /mysql_path:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -d -p 3306:3306 \
  mysql:5.7.26

注意 -e MYSQL_ROOT_PASSWORD=root 设置 root 密码为 root

3 构建Nginx容器

直接使用dockerhub nginx官方镜像即可轻松构建

docker run --name nginx \
  -v /my_nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /my_nginx/html:/etc/nginx/html -d -p 8080:8080 \
  nginx:1.17.0

可以打开浏览器进行验证,http://server_ip:8080

4 docker compose容器整合

上述步骤讲述了SpringBoot、MySQL、Nginx容器独立运行的方式,接下来将进行整合,目标是实现3个容器整体打包启动,并内部组网

首先我们规划一下工程目录结构

my_project                      # 项目部署根目录
├── docker-compose              # docker-compose目录
│   └── docker-compose.yml      # docker-compose.yml配置文件
├── mysql                       # mysql数据保存目录
├── nginx                       # nginx前端程序运行目录
│   ├── dist                    # 前端dist打包文件目录
│   └── nginx.conf              # nginx配置文件
└── service                     # 后端服务目录
    ├── application-prod.yml    # springboot配置文件
    └── my_service.jar          # springboot打包jar文件

docker-compose.yml 配置

version: "3"

  services:
    nginx:
      image: nginx:1.17.0
      ports:
        - "8080:8080"
      volumes:
        - "/my_project/nginx/dist:/etc/nginx/html"
        - "/my_project/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
      links:
        - springboot
  
    springboot:
      image: java/springboot:1.0
      ports:
        - "8001:8001"
      volumes:
        - "/my_project/service:/project"
      links:
        - mysql57
    
    mysql57:
      image: mysql:5.7.26
      ports:
        - "3306:3306"
      volumes:
        - "/my_project/mysql:/var/lib/mysql"
      environment:
        MYSQL_ROOT_PASSWORD: root

可以看出,其实是将前3步配置进行了整合,然后增加links,让3个容器内部组网

services下描述的内容全部都是各个容器的构建和启动方式

nginxspringbootmysql57,分别是3个容器的别名

links中直接填写别名,让容器自动建立网络通信,那么在对应的配置文件的网络部分也要做相应的调整

application-prod.yml 中连接数据库字符串,我们将

jdbc:log4jdbc:mysql://127.0.0.1/dbname

改为 links 中的别名,也就是 mysql57

jdbc:log4jdbc:mysql://mysql57/dbname

nginx.conf 中的转发地址也要调整为对应容器的网络别名

location /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:8001;
    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;
}

改为

location /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://springboot:8001;
    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;
}

这样容器启动时会根据内部网络地址自动组网联通,如果单独部署就会遇到serverip变化导致请求失败问题

最后,启动整合容器

cd /my_project/docker-compose
docker-compose up -d

也可以指定配置文件路径执行

docker-compose -f "/my_project/docker-compose/docker-compose.yml" up -d

停止容器

cd /my_project/docker-compose
docker-compose down

5 总结

我们日常工作中经常会遇到项目部署需求,使用docker部署是一种非常高效便捷的方式,由于其特殊的隔离机制,它不会原系统产生影响

需要注意的点在于

  1. java8在Linux下启动时需要修改随机数生成方式,不然会导致启动慢问题
  2. 注意容器内部的时区问题,容器时区往往默认为0,我们要改为 +8Asia/Shanghai
  3. 利用 Links 自动组网机制,解决繁琐的IP配置问题

服务器环境的部署需提前规划好工程目录,并做好对应记录,在后续更新维护时方便查阅

部署一个包含 **Java + MySQL 5.7 + Vue** 的项目,是一个典型的 **前后端分离 + 数据库** 的架构。我们可以使用 **Docker Compose** 来编排这三个服务,实现一键部署。 --- ## ✅ 架构概览 ``` [浏览器] | ↓ [Nginx] → Vue 前端静态资源 | ├───────→ [Java 后端服务](Spring Boot) └───────→ [MySQL 5.7](数据库) ``` --- ## ✅ 部署流程概览 1. 构建 Vue 项目并打包成 Docker 镜像 2. 构建 Java 项目并打包成 Docker 镜像 3. 使用 Docker Compose 编排 MySQLJava、Vue 服务 4. 使用 Nginx 反向代理 Vue 前端和 Java 后端 API 5. 启动所有服务 --- ## ✅ 步骤 1:构建 Vue 项目 ```bash cd your-vue-project npm run build ``` 生成的静态资源在 `dist/` 目录下。 --- ## ✅ 步骤 2:构建 Java 项目 ```bash cd your-java-project mvn clean package ``` 生成的 jar 包在 `target/your-app.jar` --- ## ✅ 步骤 3:编写 Dockerfile ### 1. Java 后端 Dockerfile(`Dockerfile.java`) ```Dockerfile FROM eclipse-temurin:8-jdk WORKDIR /app COPY target/your-app.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"] ``` ### 2. Vue 前端 Dockerfile(`Dockerfile.vue`) ```Dockerfile FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf COPY vue.conf /etc/nginx/conf.d COPY dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` ### 3. Vue 的 Nginx 配置文件 `vue.conf` ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ =404; } # 代理后端 API 请求 location /api/ { proxy_pass http://java-app:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` --- ## ✅ 步骤 4:编写 `docker-compose.yml` ```yaml version: '3' services: mysql: image: mysql:5.7 container_name: mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql restart: always java-app: build: context: . dockerfile: Dockerfile.java container_name: java-app ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb?useSSL=false&serverTimezone=UTC SPRING_DATASOURCE_USERNAME: user SPRING_DATASOURCE_PASSWORD: password depends_on: - mysql restart: on-failure vue-app: build: context: . dockerfile: Dockerfile.vue container_name: vue-app ports: - "80:80" depends_on: - java-app restart: on-failure volumes: mysql_data: ``` --- ## ✅ 步骤 5:启动服务 ```bash docker-compose up -d --build ``` --- ## ✅ 验证服务是否运行成功 ```bash docker ps ``` 你应该看到以下容器在运行: - `mysql` - `java-app` - `vue-app` 访问: - Vue 前端:`http://localhost` - Java 后端 API:`http://localhost/api/xxx` - MySQL:`localhost:3306`(可使用客户端连接) --- ## ✅ 补充说明 ### 1. Java 项目连接 MySQL 确保你的 `application.properties` 或 `application.yml` 中配置了正确的数据库连接: ```properties spring.datasource.url=jdbc:mysql://mysql:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=user spring.datasource.password=password ``` ### 2. Vue 项目请求后端 API 在 Vue 项目中,请求接口使用 `/api/xxx` 路径,Nginx 会自动代理到 `http://java-app:8080/xxx`。 --- ## ✅ 总结:部署流程 | 步骤 | 操作 | |------|------| | 构建 Vue 项目 | `npm run build` | | 构建 Java 项目 | `mvn clean package` | | 编写 Dockerfile | Java、Vue、Nginx 配置 | | 编写 docker-compose.yml | 编排 MySQLJava、Vue | | 启动服务 | `docker-compose up -d --build` | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值