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

2023-11-12

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker快速部署java+nginx+mysql运行环境 的相关文章

随机推荐

  • C语言之完数、素数、回文数合集

    1 完全数 Perfect number 又称完美数或完备数 是一些特殊的自然数 它所有的真因子 即除了自身以外的约数 的和 即因子函数 恰好等于它本身 如果一个数恰好等于它的因子之和 则称该数为 完全数 第一个完全数是6 第二个完全数是2
  • MATLAB中定义数组序列,matlab怎么定义一个数组

    A n input n 数组的长度 for i 1 n fprintf a 0f i x input 分别输入各个数的值 A A x end A 就可以得到长度为n的数组了 建议在一开始就定义数组大小 这样可以减少内存的使用 同时加快计算速
  • List of default Mac OS X command-line editing bash keyboard shortcuts

    本文转载至 https maymay net blog 2007 07 18 list of default mac os x command line editing bash keyboard shortcuts More and mo
  • aspose 转pdf表格大小乱了_C#使用 aspose 从excel转成pdf,用矩阵处理其中的签章图片大小和位置...

    实例简介 C 使用 aspose 从excel转成pdf 用矩阵处理其中的签章图片大小和位置 实例截图 核心代码 public Stream ExcelToPdf Stream sm excel Stream sm Re new Memor
  • 16.网络爬虫—字体反爬(实战演示)

    网络爬虫 字体反爬 一 字体反爬原理 二 字体反爬模块Fonttools TTF文件 三 FontCreator 14 0 0 2790 FontCreatorPortable下载与安装 四 实战演示 五 后记 前言 个人简介 以山河作礼
  • LLVM查缺补漏-2

    Mailing Lists 邮件列表有两种基本形式 公告型 邮件列表 通常由一个管理者向小组中的所有成员发送信息 如电子杂志 新闻邮件等 讨论型 讨论组 所有的成员都可以向组内的其他成员发送信息 其操作过程简单来说就是发一个邮件到小组的公共
  • Java-接口

    Java 接口 1 概念 接口和类是平级的关系 举例以下 学习就是一个接口 可以飞 攻击性都是接口 2 接口的使用 接口使用interface关键词来定义 定义接口的结构 JDK1 7及以前 只能全局常量和抽象方法 全局常量 public
  • 用Groovy写Servlet

    本文参考自Servlet support 大部分代码引用了原文档 快速开始 Groovy语言提供了一个模块 可以让我们写用Groovy脚本的方式来编写Servlet 这叫做Groovlets 先看看一个简单的例子吧 下面这几个例子都来自官方
  • webpack&vite

    webpack支持多模块化 可以跑在服务端 一开始就要同一模块化代码 所以他需要把所有依赖读取一遍 并且转化为对应的代码 然后再去开启开发服务器 ast抽象语法分析工具 分析你写的文件有啥导入导出 vite只支持es module 只跑在浏
  • 五个温度带的分界线_中国划分为哪五个个温度带

    展开全部 在我国 从北到南习惯上划分为寒温带 中温带 暖温62616964757a686964616fe59b9ee7ad9431333366303732带 亚热带 热带 1 秦岭淮河线以南 主要是我国的亚热带和热带地区 一般亚热带位于温带
  • qt编写的简单日历控件lan2calendar

    使用中的一些bug可以反馈一下 项目地址 https gitee com mengtianwxs lan2calendar
  • 论文笔记:Autoregressive Tensor Factorizationfor Spatio-temporal Predictions

    0 摘要 张量因子tensor factorization分解方法在时空数据分析领域很受欢迎 因为它们能够处理多种类型的时空数据 处理缺失值 并提供计算效率高的参数估计程序 然而 现有的张量因子分解方法并没有尝试学习空间自相关 这些方法使用
  • snprintf函数和sprintf函数

    今天写代码 做字符串处理 写了以下语句 snprintf loginTime sizeof loginTime s s loginTime blankSpace 然后loginTime中的字符串老不对 记得以前用sprintf的时候 类似语
  • CISCN部分WP-ukfc

    WP ukfc 讲个笑话 华北19进不了决赛 再讲个笑话 27号黑灯 国粹过了300出头 努什么力 不如去海鲜市场 Web unzip L zip bello var www html R zip bello bello php 先传入L文
  • 51单片机在中断响应时,系统不能自动清除哪些中断请求标志?编程时应如何处理?...

    51单片机在中断响应时 系统不会自动清除中断请求标志 因此 程序员需要在编写的中断服务程序中手动清除相应的中断请求标志 这可以通过使用汇编指令或 C 语言函数来实现 在汇编语言中 可以使用 CLR bit 指令来清除某一位 在 C 语言中
  • linux中$0、$?、$*、$@、$#、$$

    0 shell脚本名 1 执行shell脚本传的第一个参数 n 第n个参数 上一条命令的执行状态 0为成功 执行shell脚本传的所有参数 同上 所在命令的PID test sh bin sh echo hello echo filenam
  • 接口测试全流程总结

    接口测试全流程扫盲 接口测试全流程扫盲 扫盲内容 1 什么是接口 2 接口都有哪些类型 3 接口的本质是什么 4 什么是接口测试 5 问什么要做接口测试 6 怎样做接口测试 7 接口测测试点是什么 8 接口测试都要掌握哪些知识 9 其他相关
  • 二进制补码的理解

    正数的原码 反码 补码 负数的原码 反码 补码关系为 原码 正数的原码符号位变为1 反码 正数的原码取反 补码 正数的原码取反加1 补码主要为了计算机进行减法运算 参考1 https www cnblogs com guanjianzhuo
  • 读QT5.7源码(七)QObjectData 和 QObjectPrivate

    在QObject中定义了一个保护权限的成员变量 d ptr protected QScopedPointer
  • docker快速部署java+nginx+mysql运行环境

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