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运行环境 的相关文章

  • Spring Data:限制自定义查询的结果

    在我的 Spring 数据存储库中 我 必须 使用自定义查询 Query注解 我知道我可以限制这样的命名查询中的结果数量 Iterable
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • java.lang.UnsupportedOperationException:无法解析索引 13 处的属性:TypedValue{t=0x2/d=0x7f010046 a=-1}

    我在 android attrs xml 文件中添加了一个用于不同色调的属性 在 styles xml 文件中 我为这些属性指定了颜色 因此每种样式的它们都不同 Attrs xml
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • 驱动程序信息:driver.version:未知,使用 ChromeDriver v78.0.3904.70 和 Chrome 浏览器 v78.0.3904.97

    我使用的是java 1 8和chrome浏览器版本78 0 3904 97 我正在尝试使用 chrome 驱动程序版本执行我的 selenium 脚本代码78 0 3904 70 但在执行时我面临以下问题并且 chrome 立即崩溃 Pic
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • 使用链接列表插入优先级队列的方法

    首先 我觉得我应该提到这是一项作业 我并不是在寻找直接的代码答案 只是为了指出正确的方向 我们被要求在链表中实现优先级队列 我正在努力编写 insert 函数的第一部分 在代码中我尝试检查是否head包含任何内容 如果没有则设置为head
  • 如何使用 Nimbus LookAndFeel 更改 JToolTip 的背景颜色?

    在使用 Nimbus LookAndFeel 的基于 Swing 的 Java 应用程序中 我尝试设置工具提示的背景颜色 因此 我创建了 JToolTip 的子类 并通过重写 createToolTip 在我的组件中使用它 到目前为止一切正
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • 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