docker中应用部署tomcat

一、在线部署

1.1 搜索tomcat镜像

官网:https://hub.docker.com

docker search tomcat

拉取tomcat镜像
docker pull tomcat

eg:
docker pull tomcat:8.5.47-jdk8-openjdk

1.2 创建容器、设置端口映射、目录映射

1.2.1  方式一

# 方式一
# 指定net网络模式
docker run -di --net="host" --name=mytomcat -p 8080:8080 tomcat


备注:

  将war包放入到docker下的tomcat中
  首先你是需要把war包放入到centos系统中,本文中将一个test.war的项目放入centos系统的主目录,这个通过ssh工具就可以放到centos中,大家应该都很熟悉。从centos中将test.war移动到docker下tomcat镜像启动的容器中。

  docker cp test.war containerID:/usr/local/tomcat/webapps/

  说明:

  containerID 是你所启动tomcat镜像的容器ID或者容器名称也可以。

1.2.2 方式二 目录挂载(卷Volume)

目录挂载即目录映射,就是将宿主机和容器内部的文件进行关联,修改宿主机的文件,会自动修改容器内部的文件。

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
#或者
docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

查看IP和相关的安装信息和目录

docker inspect [容器名|容器ID]
> docker inspect tomcat

 

完整命令如下---Mount 以容器为主

  • 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录(我们不清楚目录在哪里,需要去官网查找)

  • 直接挂载模式:宿主机目录 ---> 容器内目录(我们自己创建的目录,自己清楚!后期好修改、维护)

1:创建一个卷

> docker volume create mytomcat-vol

2:查看卷 所有的卷都在目录/var/lib/docker/volumes下

> docker volume ls
 

3:查看卷的详细信息,是为了去得知tomcat的安装目录

> docker volume inspect mytomcat-vol

4:创建一个tomcat的目录挂载和卷的映射

# 方式一 挂载方式(默认net网络模式

  创建一个卷

  docker volume create mytomcat-vol

# 创建tomcat容器;并挂载了webapps目录 
docker run -d -it --name mytomcat --mount src=mytomcat-vol,dst=/usr/local/tomcat/webapps/ROOT -p 8080:8080 tomcat:8.5.82-jdk11-openjdk


# 方式二 挂载方式(默认net网络模式

# 创建tomcat容器;并挂载了webapps目录
使用docker创建 tomcat容器,并目录挂载与端口映射
#在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -di --name=tomcat -p 8080:8080 --restart=always -v /root/mydata/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5.82-jdk11-openjdk


# 方式三 挂载方式(默认net网络模式

  使用docker创建 tomcat容器,并目录挂载与端口映射

  #在/root目录下创建tomcat目录用于存储tomcat数据信息

mkdir ~/tomcat
cd ~/tomcat
docker run -di --name=mytomcat -p 8080:8080 -v $PWD:/root/tomcat/webapps tomcat:8.5.82-jdk11-openjdk


# 运行一个外部挂在文件的Tomcat容器
docker run -dit --name tomcat --restart=always \
-p 8080:8080 \
-e TZ=Asia/Shanghai \
--network=my-network
-v /usr/local/dockerdata/tomcat/webapps:/usr/local/tomcat/webapps \
-v /usr/local/dockerdata/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml \
-v /home/dockerdata/bjgmkdata:/home/dockerdata/bjgmkdata \
tomcat:10.0.75


参数说明:
-p 8080:8080代表端口映射,格式为宿主机映射端口:容器运行端口(将容器的8080端口映射到主机的8080端口)。
-v 目录映射(-v $PWD:/root/tomcat/webapps:将主机中当前目录挂载到容器的webapps)。
-v /etc/localtime:/etc/localtime:ro 让容器使用宿主机的时间,容器时间与宿主机时间同步。
--restart=always
 
备注:
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work. 
#执行如下操作 #
1、编辑 sysctl.conf vi /etc/sysctl.conf #
2、在上述打开的文件中后面添加 net.ipv4.ip_forward=1 #
3、重启network systemctl restart network

5:验证是否映射成功
首先进入宿主机mytomcat-vol的数据目录

> cd /var/lib/docker/volumes/mytomcat-vol/_data

创建一个文件index.html,内容为hello world

> vim index.html

然后进入mytomcat容器的挂载目录

> docker exec -it mytomcat /bin/bash
> cd webapp/ROOT
> ls

可以发现该目录下正好有文件index.html,并且内容为hello world,说明宿主机的修改可以同步到容器。
现在在容器中将index.html删除,exit退出容器。
回到宿主机后发现原来的index.html也被删除了,说明容器的修改可以同步到容器。

1.3 查看日志

docker logs -f mytomcat

1.4 报错404解决方法

查看防火墙状态
systemctl status firewalld

开启防火墙 systemctl start firewalld
查看端口信息 firewall-cmd --list-ports # 只看端口信息 开启端口和重启防火墙 开端口命令:firewall-cmd --zone=public --add-port=8080/tcp --permanent 重启防火墙:systemctl restart firewalld.service 查看安全组情况 注意:防火墙8080 端口开了并且阿里云安全组也开放了才能访问远程。


以上步骤都没问题,进入容器内部,发现两个webapps。 docker exec -it 53724a20a48c /bin/bash
其中webapps文件夹为空,而webapps.dist包含完整的tomcat文件。

将目录下webapps.dist里文件复制到webapps。然后将webapps.dist删除. cp -r webapps.dist/* ./webapps rm -rf webapps.dist

 tomcat 下面有 webapps 和 webapps.dist 两个文件夹,ls -l 发现 webapps 下面没有东西,然后 webapps.dist 有大家熟悉的几个文件夹,这样的话,问题就显而易见了。

所以只需将 webapps 和 webapps.dist 两个文件夹合并为一个名字为 webapps 的文件夹即可解决此问题。

1.4.1 永久解决方式

如下:

前面已经解决了问题,但是下次再去运行一个新的 Tomcat 的时候还是会出现同样的问题。如何永久解决呢?

可以在上面修改后的基础上使用 docker commit 提交容器副本使之成为一个新的镜像。

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

示例:
docker commit -m="修复404" -a="fairy" c7d6e86c9b8e mytomcat:8.5.82-jdk11-openjdk

 

现在我们拥有了一个新的镜像,下次直接运行这个镜像就不会报 404 了。

备注

关于服务器时间问题服务器时间问题在于容器使用的时间为0时区,将其改为东8区,即可,亲测有效

docker cp mytomcat:/etc/timezone /timezone

修改UTC为UTC
+8 docker cp /timezone mytomcat:/etc/timezone docker restart mytomcat

Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type 问题解决 在目录挂载的过程中,因为修改过时间,所以导致出现文件拷贝不成功,是因为所copy的类型是不一样的。

二、离线部署

 

posted @ 2022-09-09 11:39  O波V步  阅读(2711)  评论(0编辑  收藏  举报