用Docker在云服务器上快速安装tomcat,部署SSM项目

前言

SpringBoot内嵌有tomcat,一条命令就可以迅速启动服务。最近上课在老老实实学SSM,SSM项目部署上线,需要打成war包,放到服务器的tomcat上。安装配置tomcat当然最好借助docker啦,下载、安装、卸载都非常方便,哪天tomcat玩坏了,说删就删,配置还能全部保留。

快速入门Docker:https://blog.csdn.net/qq_43290318/article/details/107743188

安装运行tomcat

1、拉取最新镜像

docker pull tomcat

2、运行一个tomcat容器用于测试

# 随便运行一个tomcat容器
docker run --name tomcat01 -p 8080:8080 -d tomcat

# 进入容器内部
docker exec -it tomcat01 /bin/bash

为什么要随便运行一个tomcat容器(之后可删除)呢? 因为我们需要知道tomcat容器里面的目录结构是什么样的,以便下次正式运行容器时将容器内的关键目录挂载到的宿主机。那么以后修改配置、拷贝项目war包,无序进入容器内部,直接在宿主机的目录就可以操作,甚至不需要重启容器就可生效!!!

 进入容器tomcat01内部,看到的目录结构如上,这里我们只需要关注4个目录:

1、conf:配置相关,进行项目部署时我们需要修改该目录下的配置文件server.xml

2、logs:存储项目产生的日志文件

3、webapps.dist:默认界面等

4、webapps:注意,在启动该容器之后,你访问 ip:8080 会报404,并没有看到Tomcat的Logo兼吉祥物,那只黄色的小公猫。原因是因为,在tomcat9中,虽然默认的8080端口指向了webapps目录下,但是webapps是空的。它实际的资源放在了webapps.dist目录。所以我们只需要将 webapps.dist 的内容全额拷贝到 webapps 里,访问  ip:8080 就可以看到默认页面了。这个下面详细说。 

3、复制容器内 /usr/local/tomcat 的所有内容到宿主机

在上面我们也看到了,我们部署项目需要关注访问2中的4个目录。为了方便,我们打算,索性直接将 /usr/local/tomcat 挂载到宿主机的 /data/tomcat (可随意)。而挂载是以宿主机为基准的!!!换言之,假如 宿主机的 /data/tomcat 下是空的,那么将 /usr/local/tomcat 挂载到 宿主机的 /data/tomcat,那么容器内部的 /usr/local/tomcat 会全部清空,因为它以宿主机为基准,宿主机对应得目录是怎样得,它就是怎样得。

所以在正式运行tomcat容器进行挂载前,我们需要将测试容器内 /usr/local/tomcat 下的全部内容 拷贝到 /data/tomcat 下。

docker cp tomcat01:/usr/local/tomcat /data/tomcat

4、正式运行tomcat容器

# 停止测试容器
docker stop tomcat01
# 删除测试容器
docker rm tomcat01

# 正式运行我们的tomcat容器
docker run --privileged=true -v /data/tomcat:/usr/local/tomcat -p 8080:8080 -p 8688:8688 -p 80:80 --name tomcat01 -d tomcat

docker run的命令参数,我不多介绍了,看前言中的博客。为什么,我们要进行多个端口映射呢?因为在一个tomcat下部署多个项目时,有两种方案:

1、多个项目用不同的端口来区分

2、多个项目共用80端口,但通过域名来区分

所以为了防止之后我们部署多个项目,我这里除了映射默认的8080端口,还映射了80端口。当然,你可以映射其他一些端口,万一以后需要用到。如果你以后要用到,但容器运行时没有进行相应的端口映射,那该怎么办?直接删了这个容器,重新 通过 docker run 运行一个新容器呗。由于之前我们进行了目录挂载,被删容器的项目资源和配置,是不会丢失的!!!

配置tomcat

1、配置tomcat默认页面

tomcat的默认端口是8080,访问8080端口可访问默认页面。在启动容器之后,访问 ip:8080 会报404,并没有看到Tomcat的Logo兼吉祥物,那只黄色的小公猫。原因是因为,在tomcat9中,虽然默认的8080端口指向了webapps目录下,但是webapps是空的。它实际的资源放在了webapps.dist目录。所以我们只需要将 webapps.dist 的内容全额拷贝到 webapps 里,访问  ip:8080 就可以看到默认页面了。

由于前面启动容器时我们进行了目录挂载,所以我们只需要在宿主机的 /data/tomcat 下操作就行了,而且操作完成后不需要重启容器就可以生效了。刷新 ip:8080,就可以看见默认页面了。

# 此时处于宿主机的 /data/tomcat 
cp -r webapps.dist/* webapps/

2、配置Tomcat Web管理界面

(1)管理页面的访问url是:ip:8080/manager/html,但默认情况下管理界面是无法远程访问,你需要关闭相关限制。打开webapps/manager/META-INF/context.xml,注释下面内容:

<Context antiResourceLocking="false" privileged="true" >
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
</Context>

(2)配置管理员用户名和密码。打开 conf/tomcat-users.xml,修改以下配置:

<tomcat-users>
<!--
    Comments
-->
   <role rolename="admin-gui"/>
   <role rolename="manager-gui"/>
   <user username="自定义的用户名" password="自定义的密码" roles="admin-gui,manager-gui"/>

</tomcat-users>

(3)访问管理页面

部署SSM项目

1、项目配置

最简单的项目部署方式,就是利用tomcat的默认端口8080,将 war 包 命名为 ROOT.war ,然后直接放到 webapps 下,把项目代码替换当前默认的管理界面。那么访问8080端口就可以访问到自己的项目了。这种方式简单,但是侵入性太大,不建议使用,因为可能以后你还需要再次使用到管理页面。

在一个tomcat下部署多个项目时,有两种方案:

1、多个项目用不同的端口来区分

2、多个项目共用80端口,但通过域名来区分

Apache的虚拟主机也是同样的原理。在没有购买域名的情况下,采用不同端口号的方式来区分。如果你已经买有域名了,如果还用不同端口号的方式不同项目,通过 "域名:端口号" 访问不同项目时,域名后面跟个端口号,看着也比较违和。

所以这次我们采用第2种方式,这就是前面在运行容器时,我额外了添加了 80 端口的映射的原因。为什么共用 80端口,而不是其他端口呢?我就不解释了。

打开 conf/server.xml ,在 <Server> 标签之间,添加如下配置:

<Service name="Catalina-项目名">
    <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8689" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="域名">
        <Realm className="org.apache.catalina.realm.LockOutRealm">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
        </Realm>
        <Host name="域名" appBase="webapps-项目名" unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/项目名" prefix="access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        </Host>
    </Engine>
</Service>
  • 根结点中的 Catalina-项目名 是咱们的一个命名,似乎需要Catalina开头,只要不重复即可,在配置文件中可以添加多个如上的配置。
  • Connector HTTP/1.1:HTTP链接的配置,这我们的端口就是在这里配置的,我们配置为:80
  • Connector AJP/1.3:用于给其他服务器做转发的配置,端口配置为:8689;一般用于apache和tomcat之间的通讯。
  • Service 中的端口配置,如果是多个不同的 Service 节点,我们的端口可以配置为一样,只要域名不同即可。
  • Engine-defaultHost:这里就是配置域名的地方,对于配置同样端口的 Service 可以通过不同的域名解决跳转问题;但是都配置为 localhost 或相同域名时请使用不同端口。
  • Engine-Realm:该节点无须管。
  • Engine-Host-name:这里我们也配置了 自己已经购买的域名,上面配置了域名则和域名一样即可。
  • Engine-Host-appBase:这里是重点,我们配置一个文件夹用于我们的项目配置;默认管理界面文件夹为 webapps ,这里我们配置为 webapps-项目名 用于区分不同项目。
  • Engine-Host-Valve:该节点中我们主要配置了生成日志的目录,以及其他相关配置

2、项目打成war包,推送到服务器

不同ide的打包方式不同,百度就可以了。推送war包到服务器,可以使用 xftp 或者 winscp。

值得注意的是,在打war包之前,由于服务器的环境和本地环境不一样,要修改相应配置,比如说:数据库的相关配置,数据库驱动包的版本 等等。这些坑我都踩过。。。。

3、将 war 包重命名为 ROOT.war,放到 "webapps-项目名" 下

通过域名访问项目时,ROOT.war 会被自动解压成文件夹 ROOT。如果访问,报500错误,或者 发现 war 包无法自动解压,可通过 linux 命令自行解压试试。我曾经遇到过这个问题。

https://blog.csdn.net/qq_43290318/article/details/104769757

 

猜你喜欢

转载自blog.csdn.net/qq_43290318/article/details/109792232