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配置问题

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

### 部署包含Spring Boot、Redis、Nginx和Vue3项目的指南 #### 使用Docker部署综合项目结构 为了成功地使用Docker部署一个由Spring Boot后端、Redis缓存服务、Nginx作为反向代理以及Vue.js前端组成的复杂Web应用程序,通常需要创建多个容器来分别处理各个组件的服务。这可以通过定义`docker-compose.yml`文件实现多容器编排。 对于具体的配置细节,在`docker-compose.yml`中可以指定不同服务之间的依赖关系和服务本身的属性,比如暴露的端口号、挂载的数据卷等[^4]。 #### 构建前后端分离的应用架构 - **后端部分**:基于Spring Boot框架开发API接口,并通过Maven或Gradle工具构建可执行JAR包。在对应的Dockerfile中应指明基础镜像(如采用官方OpenJDK镜像),复制打包好的jar文件至目标位置并设置入口点命令启动Java应用;同时利用环境变量传递必要的配置项给应用程序实例,例如数据库连接字符串或者密钥等敏感信息[^3]。 如果遇到类似`ADD failed: file not found in build context or excluded by .dockerignore`这样的错误,则可能是由于`.dockerignore`文件排除了所需的资源或者是当前工作目录下的相对路径不正确所引起的。确保项目根目录存在有效的输出制品并且未被忽略规则匹配上是解决问题的关键所在[^2]。 - **前端部分**:以Vue CLI脚手架为基础建立单页面应用(SPA),经过npm run build指令产出静态网页资产放置于特定文件夹内供后续集成调优阶段引用。针对Vue Router的历史模式(History Mode)特性做适配调整时,需配合Nginx服务器设定恰当的位置路由规则以便正确解析URL地址映射到实际存在的HTML文档片段之上[^1]。 ```yaml version: '3' services: backend: image: springboot-app ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydatabase?useSSL=false&serverTimezone=UTC SPRING_REDIS_HOST: redis depends_on: - db - redis frontend: image: nginx volumes: - ./frontend/dist:/usr/share/nginx/html ports: - "80:80" db: image: mysql/mysql-server:latest environment: MYSQL_ROOT_PASSWORD: jeecg123456 volumes: - db_data:/var/lib/mysql redis: image: redis:alpine volumes: db_data: ``` 上述YAML片断展示了如何组合各独立部件形成统一的整体解决方案。其中特别强调了关于MySQL密码默认值的信息[^5]。 #### 注意事项 确保所有涉及的安全凭证都妥善保管起来,不要硬编码进源代码或是公开版本控制系统里面去。另外考虑到生产环境中可能涉及到更复杂的网络策略与安全组规则等因素的影响,建议提前做好充分测试验证再正式上线发布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值