docker之tomcat8.5容器中如何部署war包
作者:qx09
使用docker-compose部署war项目到tomcat8.5容器
使用docker-compose 创建、启动容器
1.创建docker-compose.yml文件
version: '3' services: tomcat8: restart: always image: tomcat:8.5 container_name: tomcat8.5 ports: - 8080:8080 volumes: - E://Docker/tomcat/webapps:/usr/local/tomcat/webapps - E://Docker/tomcat/logs:/usr/local/tomcat/logs environment: TZ: Asia/Shanghai links: - db networks: - mynetwork db: image: mysql:8.0.15 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: testdocker0901 MYSQL_USER: root MYSQL_PASSWORD: 123456 volumes: - E://Docker/mysql/data:/var/lib/mysql container_name: mysql8.0 ports: - 4306:3306 networks: - mynetwork networks: mynetwork: driver: bridge
volumes
是 docker-compose.yml
文件中用于指定容器和本地文件系统之间共享数据的部分。
示例中,我们有两个卷配置:
volumes: - E://Docker/tomcat/webapps:/usr/local/tomcat/webapps - E://Docker/tomcat/logs:/usr/local/tomcat/logs
这两个卷配置将本地文件系统中的两个目录挂载到Tomcat容器中的相应位置。
- E://Docker/tomcat/webapps:/usr/local/tomcat/webapps
:这个卷配置将本地文件系统中的E://Docker/tomcat/webapps
目录挂载到Tomcat容器中的/usr/local/tomcat/webapps
目录。这意味着Tomcat容器中的/usr/local/tomcat/webapps
目录与本地文件系统中的E://Docker/tomcat/webapps
目录是同步的。任何对这两个目录中的文件的更改都将在容器和本地之间同步。这可以用来将应用程序部署到Tomcat容器中。- E://Docker/tomcat/logs:/usr/local/tomcat/logs
:这个卷配置将本地文件系统中的E://Docker/tomcat/logs
目录挂载到Tomcat容器中的/usr/local/tomcat/logs
目录。这意味着Tomcat容器的日志将保存在本地文件系统的E://Docker/tomcat/logs
目录中。您可以在本地文件系统中查看和分析Tomcat容器的日志文件。
通过使用卷,您可以轻松地在主机和容器之间共享数据,并在不影响容器的情况下进行文件更改。
请注意:
路径分隔符在Windows上是反斜杠(\),但在Docker中需要使用正斜杠(/)。因此,在您的实际配置中,可能需要将路径改为 E:/Docker/tomcat/webapps
和 E:/Docker/tomcat/logs
。
这是一个使用Docker Compose编排Tomcat和MySQL容器的docker-compose.yml
文件。
version: '3'
指定了Docker Compose文件格式的版本号。services
定义了您要运行的服务(容器)。tomcat8
是Tomcat容器的服务名称。restart: always
表示容器在出现问题或重新启动时,会自动重新启动。image: tomcat:8.5
指定了Tomcat容器使用的镜像版本。container_name: tomcat8.5
指定了Tomcat容器的名称。ports
将Tomcat容器的8080端口映射到宿主机的8080端口。volumes
将宿主机的目录与Tomcat容器的目录进行挂载,用于存储Tomcat的webapps和logs文件。environment
指定了Tomcat容器的环境变量,这里设置了时区为Asia/Shanghai。links
指定了Tomcat容器与MySQL容器的链接,使用MySQL容器的别名db
。db
是MySQL容器的服务名称。image: mysql:8.0.15
指定了MySQL容器使用的镜像版本。restart: always
表示容器在出现问题或重新启动时,会自动重新启动。environment
指定了MySQL容器的环境变量,包括MySQL的根密码、数据库名称以及用户名和密码。volumes
将宿主机的目录与MySQL容器的目录进行挂载,用于持久化存储MySQL的数据。ports
将MySQL容器的3306端口映射到宿主机的4306端口。networks
指定了容器使用的网络,这里都使用了名为mynetwork
的自定义网络。mynetwork
是自定义网络的名称,driver: bridge
指定了网络的驱动程序为桥接模式。
这样,您可以通过运行docker-compose up
命令来启动这些容器。
2.使用docker-compose创建并启动项目所需要的容器
::进入docker-compose.yml文件所在的目录 ::命令启动 docker-compose up -d
可以看到容器已启动:
3.使用SQLyog连接docker里的mysql容器
MySQL容器的3306端口映射到宿主机的4306端口,所以这里的端口号填写4306
出现错误2058表明在使用sqlyog连接MySQL时,发生了caching_sha2_password插件无法加载的问题。
这是由于MySQL 8.0版本开始默认使用caching_sha2_password作为身份验证插件,而较旧的MySQL客户端(如sqlyog)可能不支持该插件。
在MySQL容器中重新创建用户:
- 新建cmd窗口
::在正在运行的容器中 查找到mysql容器的名称或id docker ps :: 在mysql容器中打开交互式终端 docker exec -it mysql8.0 sh #登录mysql mysql -h localhost -u root -p 123456 -- 设置root用户密码过期规则为从不过期 (Set the root user password expiration rule to never expire) ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; -- 为root用户设置密码,并使用mysql_native_password插件进行验证 (Set a password for the root user and verify it using the mysql_native_password plug-in) ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; -- 刷新权限,使修改后的权限生效 (Refresh permissions to make the new permissions take effect) FLUSH PRIVILEGES;
docker exec -it mysql:8.0 sh
是一个Docker命令,用于在名为 mysql
的8.0版本镜像的容器中打开一个交互式的shell终端。
docker exec
是用于在正在运行的容器中执行命令的Docker命令。-it
是两个选项的组合。-i
表示保持标准输入打开,以便在终端中输入命令,-t
表示分配伪终端,从而允许我们与终端进行交互。mysql:8.0
是指要操作的容器的名称(或容器ID)。这里通过指定镜像名称和版本来创建一个新的容器并启动交互式Shell。sh
是要在容器中执行的shell命令。也可以使用bash
,取决于镜像的配置。
使用以上命令,我们可以进入正在运行的mysql:8.0容器的shell终端,以便执行其他命令或与容器进行交互。
请注意,您需要确保已经使用正确的镜像名称和版本以及已经运行了名为 mysql8.0
的容器。
再次使用SQLyog连接数据库
完成一个springboot项目,打包war
1.导入项目的mysql数据库
导入项目中使用的mysql数据库
/* testDocker.sql */ CREATE DATABASE /*!32312 IF NOT EXISTS*/`testdocker0901` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `testdocker0901`; /*Table structure for table `student` */ DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(10) NOT NULL COMMENT '学生姓名', `sex` tinyint(1) NOT NULL COMMENT '1男0女', `age` int(3) NOT NULL COMMENT '年龄', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `student` */ insert into `student`(`id`,`name`,`sex`,`age`) values (1,'张三',0,23),(2,'李四',1,20),(3,'王五',1,22);
2.配置项目数据库的连接
在你的Spring Boot项目中,你可以通过配置文件或者代码来配置连接到MySQL容器的数据库连接。
配置文件方式:
1.打开你的Spring Boot项目中的application.properties
或application.yml
文件。
2.在配置文件中,设置以下属性来配置MySQL连接:
spring.datasource.url=jdbc:mysql://db:3306/testdocker0901?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
这里的 db
是你在Docker Compose文件中命名的MySQL容器的别名,testdocker0901
是你在MySQL容器中的数据库名称。
- 正确的连接参数是
useUnicode=true&characterEncoding=utf8mb4
。 - 另外,MySQL 8.0默认启用了SSL,因此需要将
useSSL
设置为true
。 - 最后,还需要设置
serverTimezone
为适当的时区,以确保日期和时间的正确性。
3.使用命令mvn package 打包
4.将war包部署到tomcat容器中
在将war包重命名为testTomcatDocker.war
并放置到E://Docker/tomcat/webapps
目录的过程中,您可以通过以下步骤完成:
- 将您的war包命名为
testTomcatDocker.war
。 - 将重命名的
testTomcatDocker.war
文件放置到您的本地文件系统上的E://Docker/tomcat/webapps
目录中。
确保您已按照上述路径创建了E://Docker/tomcat/webapps
目录。这样一来,Tomcat容器启动时将会将该目录挂载到容器内部,从而使war包可供Tomcat服务器加载和运行。
请确保您的Docker Compose文件已正确配置将您的本地目录E://Docker/tomcat/webapps
挂载到Tomcat容器的/usr/local/tomcat/webapps
目录。这样可以确保应用程序能够在容器中正确访问war包。
浏览器中访问 http://localhost:8080/testTomcatDocker
将war包重命名为ROOT.war ,重新部署
浏览器访问 http://localhost:8080 ,点击按钮请求数据,能正常访问,问题解决!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。