当前位置: 首页 > news >正文

【docker实战】安装tomcat并连接mysql数据库

本节用docker来安装tomcat,并用这个tomcat连接我们上一节安装好的mysql数据库

一、拉取镜像

我们安装8.5.69版本
先搜索一下

[root@localhost ~]# docker search tomcat
NAME                                  DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
tomcat                                Apache Tomcat is an open source implementati…   3619      [OK]       
tomee                                 Apache TomEE is an all-Apache Java EE certif…   113       [OK]       
bitnami/tomcat                        Bitnami Tomcat Docker Image                      51                   [OK]
bitnamicharts/tomcat                                                                   0     

但是没有看到我们需要的版本,怎么查看版本列表呢
参考这里
我们用下面的版本号

[root@localhost data]# docker pull tomcat:8.5.69

二、运行tomcat

bitnami的tomcat的根目录在/opt/bitnami/tomcat/webapps下面,所以我们为了方便部署我们的war包到tomcat中,最好将这个文件挂载到宿主机上

#先在宿主机上把挂载目录建好
[root@localhost data]# mkdir -p /opt/bitnami/tomcat/webapps
[root@localhost data]# chmod 777 /opt/bitnami/tomcat/webapps

运行tomcat容器

docker run -d \
-p 80:8080 \
--name tomcat \
--restart=always \
-e TOMCAT_USERNAME=myuser123 \
-e TOMCAT_PASSWORD=123456\
-v /opt/bitnami/tomcat/webapps:/opt/bitnami/tomcat/webapps \
tomcat:8.5.69

运行好后,通过宿主机的80端口访问一下
在这里插入图片描述
能正确访问了
如果需要部署我们的项目到tomcat中,只需要把我们的war包放到宿主机的/opt/bitnami/tomcat/webapps目录下就行了。

三、重要的环境变量

TOMCAT_SHUTDOWN_PORT_NUMBER:Apache TOMCAT关闭端口。默认值:8005
TOMCAT_HTTP_PORT_NUMBER:Apache TOMCAT HTTP端口。默认值:8080
TOMCAT_AJP_PORT_NUMBER:Apache TOMCAT AJP端口。默认值:8009
TOMCAT_USERNAME:Apache TOMCAT用户。默认值:manager
TOMCAT_PASSWORD:Apache TOMCAT密码。没有默认值。
TOMCAT_ALLOW_REMOTE_MANAGEMENT:是否允许从远程地址连接到Apache TOMCAT管理器应用程序。默认值:否
TOMCAT_ENABLE_AUTH:是否为Apache TOMCAT管理器应用程序启用身份验证。默认值:是
TOMCAT_ENABLE_AJP:是否启用Apache TOMCAT AJP连接器。默认值:否
TOMCAT_EXTRA_JAVA_OPTS:Apache TOMCAT的其他JAVA设置。没有默认值。
TOMCAT_INSTALL_DEFAULT_WEBAPPS:是否添加默认的Web应用程序(ROOT、管理器、主机管理器等)进行部署。默认值:是

tomcat和mysql一起,部署我们的应用

先创建一个网络

docker network create app-tier --driver bridge

启动mysql,用上面我们创建的网络

docker run -d \-p 3306:3306 \--name mysql57 \--restart=always \--network app-tier \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATION=utf8mb4_general_ci \-e MYSQL_ENABLE_SLOW_QUERY=1 \-e MYSQL_LONG_QUERY_TIME=5.0 \-e TZ=Asia/Shanghai \-v /bitnami/mysql57/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:5.7

启动tomcat加入这个网络,并且设置网络连接到mysql,即–link参数

docker run -d \
-p 80:8080 \
--name tomcat \
--restart=always \
--network app-tier \
--link mysql57:mysql57 \
-e TOMCAT_USERNAME=myuser123 \
-e TOMCAT_PASSWORD=3rjfasd \
-v /opt/bitnami/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5.69

在tomcat应用启动的时候,我们的jdbc连接串,就可以写上mysql57:3306来连接mysql了,而不用担心ip的变化

docker-compose安装

docker-compose的安装命令如下,如果安装好了,请跳过此步骤

# intel x86_64
sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 \-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#安装完后,查看一下版本号,验证一下安装结果
docker-compose version

这个链接是从github上下载,你知道国内的镜像加速链接吗?
目前get.daocloud.io这个站已经没法用了。还有其它链接吗,没有找到。
一个可以快速一点的方法
用下载工具,如迅雷,通过上面的那个github链接下载,可以快点。然后将文件拷到/usr/local/bin目录下
在这里插入图片描述

记得将docker-compose-linux-x86_64重命名为docker-compose

用docker-compose发布我们的应用

接下来就要写yml配置文件了,将上面的docker命令翻译成yml如下

version: '2'
networks:app-tier:driver: bridge
services:mysql57:container_name: mysql57image: 'bitnami/mysql:5.7'restart: alwaysenvironment:ALLOW_EMPTY_PASSWORD: yesMYSQL_ROOT_PASSWORD: 123456MYSQL_CHARACTER_SET: utf8mb4MYSQL_COLLATION: utf8mb4_general_ciMYSQL_ENABLE_SLOW_QUERY: 1MYSQL_LONG_QUERY_TIME: 5.0TZ: Asia/Shanghainetworks:- app-tierports:- 3306:3306volumes:- /bitnami/mysql57/data:/bitnami/mysql/data- /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:rotomcat:container_name: tomcatimage: 'tomcat:8.5.69'restart: alwaysports:- 80:8080environment:TOMCAT_USERNAME: myuser123TOMCAT_PASSWORD: 123456DB_HOST: mysql57links:- mysql57networks:- app-tiervolumes:- /opt/bitnami/tomcat/webapps:/usr/local/tomcat/webappsdepends_on:- mysql57

此文件命名为myapp.yml
接着我们执行一下docker-compose,将我们的应用启动起来

docker-compose -f myapp.yml up

如果要停止程序,则用下面的命令

docker-compose -f myapp.yml down

思考:如何开启MySQL备份?

参考文档: https://www.cnblogs.com/hgmyz/p/12351734.html
创建一个备份目录,此目录其实也在宿主机的挂载/bitnami/mysql57/data上。

mkdir /bitnami/mysql/data/backup
chmod 777 /bitnami/mysql/data/backup

进入容器执行以下命令

mysqldump -uroot -p123456 yourdbname > /bitnami/mysql/data/backup/yourdbname_$(date +%Y%m%d_%H%M%S).sql

将这个文件编辑保存在/bitnami/mysql/data/backup/mybackup.sh文件中
手动执行一下 mysqlbackup.sh,就可以保存SQL文件了
mybackup.sh文件如下

[root@localhost backup]# cat mybackup.sh 
mysqldump -uroot -p123456 yourdbname > /bitnami/mysql/data/backup/yourdbname_$(date +%Y%m%d_%H%M%S).sql
chmod 777 /bitnami/mysql/data/backup/mybackup.sh

那如何每天开启备份呢?
由于在容器内部没有安装crontab工具,所以我们可以在宿主机上的crontab来执行我们的定时备份脚本。
在宿主机执行容器中的脚本是这样的
下面表示执行容器中的脚本/bitnami/mysql/data/backup/mybackup.sh

docker exec -d mysql57 /bin/bash /bitnami/mysql/data/backup/mybackup.sh

在宿主机上生成一个dockerback.sh文件,

cd /bitnami/mysql57/data/backupdockerback.sh
docker exec -d mysql57 /bin/bash /bitnami/mysql/data/backup/mybackup.sh

命令文件查看一下

[root@localhost backup]#  cat dockerback.sh
docker exec -d mysql57 /bin/bash /bitnami/mysql/data/backup/mybackup.sh

并设置好权限

 chmod u+x /bitnami/mysql57/data/backup/dockerback.sh

定时任务定义

 crontab -e ##输入以下的内容*/1 * * * * /bitnami/mysql57/data/backup/dockerback.sh

可以看到,每分钟生成了一个数据库sql脚本
在这里插入图片描述
更优的备份脚本,其实是每天备份一个,并压缩一下保存,同时把上一天的删除,脚本如下。

dockerback.sh优化后的脚本如下

# 删除旧数据库
rm -f yourdb_*.sql
# 删除旧的压缩包文件
rm -f yourdb_*.tar.gz
# 备份新脚本
docker exec -d mysql57 /bin/bash /bitnami/mysql/data/backup/mybackup.sh
#休眠30s
sleep 30s
# 复制到新的目录
rm -rf /bitnami/mysql/data/backup/packages && mkdir /bitnami/mysql/data/backup/packages && mv yourdb_*.sql /bitnami/mysql/data/backup/packages
# 用新的SQL文件生成新的压缩包
tar -zcvf ./yourdb_$(date +%Y%m%d_%H%M%S).tar.gz /bitnami/mysql/data/backup/packages
#删除packages目录
rm -rf /bitnami/mysql/data/backup/packages

参考链接:

官网
github
加速的gitcode

关于安装的说明,可以看官方原说明文档

相关文章:

【docker实战】安装tomcat并连接mysql数据库

本节用docker来安装tomcat,并用这个tomcat连接我们上一节安装好的mysql数据库 一、拉取镜像 我们安装8.5.69版本 先搜索一下 [rootlocalhost ~]# docker search tomcat NAME DESCRIPTION …...

LeetCode 每日一题 Day 32 ||递归单调栈

2487. 从链表中移除节点 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1: 输入:head [5,2,13,3,8] 输出:[13,8] 解释:需要移除的节点是 5 ,2 和 3 。…...

【mars3d】FixedRoute的circle没有跟polyline贴着模型的解决方案

问题:【mars3d】官网的贴模型示例中,参考api文档增加了circle的配置,但是FixedRoute的circle没有跟polyline贴着模型 circle: { radius: 10, materialType: mars3d.MaterialType.CircleWave, materialOptions: { color: "#ffff00"…...

Day7 vitest 之 vitest配置第三版

项目目录 runner Type: VitestRunnerConstructor Default: node, 当运行test的时候 benchmark,当运行bench测试的时候 功能 自定义测试运行程序的路径。 要求 应与自定义库运行程序一起使用。 如果您只是运行测试,则可能不需要这个。它主要由library作者使用 …...

git补充上次提交

1.首先&#xff0c;确保你还没有执行 git push 操作。如果尚未推送到远程仓库&#xff0c;那么可以在本地进行修正。 2.添加遗漏的文件&#xff1a; git add <遗漏的文件路径>3.提交新修改或新增的文件&#xff0c;并将它与上一次提交合并&#xff08;如果希望保持提交历…...

计算机网络名词解释

1.ICMP 网际控制报文 允许主机或路由器报告差错情况和提供有关异常情况的报告 2.RIP路由信息协议 是一种分布式的&#xff0c;基于距离向量的路由选择协议 3.BGP 外部网关协议 是不同自治系统的路由器之间交换路由信息的协议 4.IGMP 网际管理协议 使用多播路由器知道多播…...

flink table view datastream互转

case class outer(f1:String,f2:Inner) case class outerV1(f1:String,f2:Inner,f3:Int) case class Inner(f3:String,f4:Int) 测试代码 package com.yy.table.convertimport org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.tabl…...

redis重启后数据丢失问题解决(亲测好用)

redis修改密码重启后发现redis中的数据丢失了 解决办法&#xff1a; 首先在redis的安装目录下查找重启之前的dump.rdb文件&#xff0c;发现只有当天的一个dump.rdb文件&#xff0c;确认不是重启备份的文件 然后我就全盘找一下dump.rdb的备份文件&#xff0c;找到前一天的备份…...

敬请期待……

敬请期待…… 《Python百宝箱》 序号文章目录直达链接表白系列1无法拒绝的表白界面https://want595.blog.csdn.net/article/details/1347448942满屏飘字表白代码https://want595.blog.csdn.net/article/details/1350373883无限弹窗表白代码...

3.10 Android eBPF HelloWorld调试(四)

一,读取eBPF map的android应用程序示例 1.1 C++源码及源码解读 /system/memory/bpfmapparsed/hello_world_map_parser.cpp //基于aosp android12#define LOG_TAG "BPF_MAP_PARSER"#include <log/log.h> #include <stdlib.h> #include <unistd.h&g…...

PyTorch常用工具(1)数据处理

文章目录 前言1 数据处理1.1 Dataset1.2 DataLoader 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&am…...

docker-简单说说cgroup

前面我们简单说了下namespace&#xff0c; 现在我们来接着简单说说cgroup。通过docker-简单说说namespace文章我们知道&#xff1a; namespace 是为了隔离进程组之间的资源&#xff0c;那cgroup就是为了对进程组的监控和限制资源。Cgroup 可以限制进程组使用的资源数量和分配&a…...

印象笔记04: 如何将印象笔记超级会员价值最大化利用?

印象笔记04&#xff1a; 如何将印象笔记超级会员价值最大化利用&#xff1f; 为什么有这个问题 我不知道有没有人一开始接触印象笔记觉得非常好。奈何只能两个设备同步&#xff0c;局限太多。而会员活动比较优惠——就开了会员。而且我开了十年……。只能开发一下看看怎么最大…...

我的JDK动态代理流程

我的JDK动态代理流程 我梳理的动态代理流程大约是&#xff1a; 如果每一个框架都有自己的BPP&#xff0c;且自己的BPP中都有自己的wrapIfNecessory&#xff0c;那样可能就是一个BPP一个代理类。但通常应该都是各自的框架以提供 Advisior&#xff08;切面&#xff09;的方式&am…...

uniapp Vue3 面包屑导航 带动态样式

上干货 <template><view class"bei"><view class"container"><view class"indicator"></view><!-- 遍历路由列表 --><view v-for"(item, index) in routes" :key"index" :class&quo…...

openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作

文章目录 openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作174.1 事务隔离说明174.2 写入和读写操作174.3 并发写入事务的潜在死锁情况 openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作 174.1 事务隔离说…...

数据分析可被划分为4个重要的类别

1、描述型&#xff1a;发生了什么&#xff1f; 全面、准确、实时的数据有效的可视化 2、诊断型&#xff1a;为什么会发生&#xff1f; 能够深入了解问题的根本原因隔离所有混淆信息的能力 3、预测型&#xff1a;可能发生什么&#xff1f; 通过历史数据来预测特定的结果通过…...

爆火小游戏敲木鱼流量主小程序源码系统+完整的代码包以及安装搭建教程

随着移动互联网的快速发展&#xff0c;小程序已成为一种新的应用形态&#xff0c;深入到人们生活的方方面面。其中&#xff0c;小游戏由于其简单、有趣的特点&#xff0c;吸引了大量用户&#xff0c;也成为了许多开发者的首选。敲木鱼小游戏&#xff0c;以其独特的玩法和轻松的…...

Invoke和BeginInvoke的区别

Invoke和BeginInvoke的区别 本文导读&#xff1a;BeginInvoke() 调用时&#xff0c;当前线程会启用线程池中的某个线程来执行此方法&#xff0c;当前线程不被阻塞&#xff0c;继续运行后面的代码&#xff0c; Invoke() 调用时&#xff0c;会阻塞当前线程&#xff0c;等到 Invo…...

3 分钟为英语学习神器 Anki 部署一个专属同步服务器

Anki 介绍 Anki 是一款基于间隔重复&#xff08;Spaced Repetition&#xff09;原理的学习软件&#xff0c;想象一下&#xff0c;你的大脑就像是一个需要定期维护的精密仪器。间隔重复就好比是一种精准的维护计划&#xff0c;它通过在最佳时刻复习信息&#xff0c;来确保知识在…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...