一、前期准备
1、在服务端下载镜像时,国外的镜像比较慢,可以访问dev.aliyun.com/search.html,使用阿里云的镜像安装tomcat。
(1)因为我使用了shipyard来管理容器,8080端口,所以tomcat默认的8080端口就无法使用了,需要使用其他端口映射到8080端口,这个很实用,因为我们服务器上可能部署很多项目,不同的项目可以使用不同的端口映射到8080端口。
docker run -d -p 9999:8080 --name mytomcat80 registry.cn-hangzhou.aliyuncs.com/youdao/tomcat
2、因为项目中用的了mysql数据库,用相同的方法安装mysql镜像,同时配置mysql,可以通过本机的Navicat进行远程连接。
3、因为我使用的是阿里云服务器,需要把配置安全组,把我们进行远程登陆的端口都暴露出来。
二、开始部署
1、打包war包传输到阿里云服务器上
(1)我使用的是eclipse,在本地进行调试后,右击项目>Export>Web>WAR file,打包到桌面。
(2)使用xftp6连接我们的服务器传输到服务端。
2、将项目部署到docker中tomcat的wepapp中。
(1)在shipyard上查看自己tomcat容器中webapps的地址。
(2)到达上传war的路径,然后执行把war包传到webapps下。
docker cp medicinesystem.war tomcat_hospital:/usr/local/tomcat/
3、修改我们的项目server.xml,使得访问时直接地址访问,不需要加项目名前缀。
(1)进入tomcat容器。
docker exec -it 容器名称 /bin/bash
(2)到达conf目录下的修改我们的项目server.xml,使得访问时直接地址访问,不需要加项目名前缀。在中添加后保存:
<Context docBase="medicinesystem" path="" reloadable="true" source="org.eclipse.jst.jee.server:medicinesystem
4、重启tomcat容器,然后进行访问。
(1)重启后,页面是正常显示了,可是登陆时,报错了,我又需要查看错误日志
docker logs tomcat_hospital
报了这样的错,最终确定我用的是jndi数据库连接池,在本地开发时,把其配置在了tomcat中的context.xml中,而服务器上的镜像没有。
Caused by: java.sql.SQLException: No suitable driver at java.sql.DriverManager.getDriver(DriverManager.java:315) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2144)
(2)进入容器在tomcat的context.xml中最下面,添加
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" initialSize="6" maxActive="100" maxIdle="10" maxTotal="12" maxWait="5000" name="jdbc/test" password="123456" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/doctersystem" username="root"/>
(3)再次重启tomcat容器,然后访问,这里有一个启动所有容器的命令,重启阿里云服务器时,有助于快速启动所有容器。
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
5、再次重启发现tomcat无法启动。
(1)怎么重启都打开不了,可能是配置tomcat时配置错了,这时候进入容器命令不能使用,无法在容器内部进行。可以将无法开启的容器的文件复制到当前目录,进行修改,后面的点不要忘啦。
docker cp mytomcatbeida:/usr/local/tomcat/conf/server.xml .
(2)修改好后把正确的配置文件传回容器
docker cp server.xml mytomcatbeida:/usr/local/tomcat/conf/server.xml
三、结果展示
通过以上步骤,最终访问我们部署的网址就可以看到了。