【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.首先,确保你还没有执行 git push 操作。如果尚未推送到远程仓库,那么可以在本地进行修正。 2.添加遗漏的文件: git add <遗漏的文件路径>3.提交新修改或新增的文件,并将它与上一次提交合并(如果希望保持提交历…...
计算机网络名词解释
1.ICMP 网际控制报文 允许主机或路由器报告差错情况和提供有关异常情况的报告 2.RIP路由信息协议 是一种分布式的,基于距离向量的路由选择协议 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中的数据丢失了 解决办法: 首先在redis的安装目录下查找重启之前的dump.rdb文件,发现只有当天的一个dump.rdb文件,确认不是重启备份的文件 然后我就全盘找一下dump.rdb的备份文件,找到前一天的备份…...
敬请期待……
敬请期待…… 《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 前言 在训练神经网络的过程中需要用到很多的工具,最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块,合理使用这些工具可以极大地提高编程效率。 由于内容较多&am…...
docker-简单说说cgroup
前面我们简单说了下namespace, 现在我们来接着简单说说cgroup。通过docker-简单说说namespace文章我们知道: namespace 是为了隔离进程组之间的资源,那cgroup就是为了对进程组的监控和限制资源。Cgroup 可以限制进程组使用的资源数量和分配&a…...
印象笔记04: 如何将印象笔记超级会员价值最大化利用?
印象笔记04: 如何将印象笔记超级会员价值最大化利用? 为什么有这个问题 我不知道有没有人一开始接触印象笔记觉得非常好。奈何只能两个设备同步,局限太多。而会员活动比较优惠——就开了会员。而且我开了十年……。只能开发一下看看怎么最大…...
我的JDK动态代理流程
我的JDK动态代理流程 我梳理的动态代理流程大约是: 如果每一个框架都有自己的BPP,且自己的BPP中都有自己的wrapIfNecessory,那样可能就是一个BPP一个代理类。但通常应该都是各自的框架以提供 Advisior(切面)的方式&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、描述型:发生了什么? 全面、准确、实时的数据有效的可视化 2、诊断型:为什么会发生? 能够深入了解问题的根本原因隔离所有混淆信息的能力 3、预测型:可能发生什么? 通过历史数据来预测特定的结果通过…...
爆火小游戏敲木鱼流量主小程序源码系统+完整的代码包以及安装搭建教程
随着移动互联网的快速发展,小程序已成为一种新的应用形态,深入到人们生活的方方面面。其中,小游戏由于其简单、有趣的特点,吸引了大量用户,也成为了许多开发者的首选。敲木鱼小游戏,以其独特的玩法和轻松的…...
Invoke和BeginInvoke的区别
Invoke和BeginInvoke的区别 本文导读:BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码, Invoke() 调用时,会阻塞当前线程,等到 Invo…...
3 分钟为英语学习神器 Anki 部署一个专属同步服务器
Anki 介绍 Anki 是一款基于间隔重复(Spaced Repetition)原理的学习软件,想象一下,你的大脑就像是一个需要定期维护的精密仪器。间隔重复就好比是一种精准的维护计划,它通过在最佳时刻复习信息,来确保知识在…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 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 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
全面解析各类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? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
