目录
一、安装tomcat
1. tomcat镜像的获取
2. docker创建容器实列
3. 访问测试 404错误
4. 解决方案
5. 使用免修改版容器镜像
5.1. 运行实列的创建
5.2. 出现问题及解决:
6. 验证 OK
一、安装tomcat
1. tomcat镜像的获取
docker search tomcat #docker hub搜索镜像
docker pull tomcat #拉取镜像
docker images #查看是否拉取成功
2. docker创建容器实列
[root@rockylinux ~]# docker run -d --name install_tomcat -p 8080:8080 tomcat
877e614c238979960a211196f368caa034cf9f5c6b4ac5c02b1470e442e45db1
[root@rockylinux ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
877e614c2389 tomcat "catalina.sh run" 5 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp install_tomcat
[root@rockylinux ~]# docker exec -it 877e614c2389 /bin/bash
root@877e614c2389:/usr/local/tomcat#
3. 访问测试 404错误
4. 解决方案
把webapps.dist目录换成webapps
root@877e614c2389:/usr/local/tomcat# ls -l
total 132
…………………………………………………………………………………………………………………………
drwxr-xr-x. 2 root root 6 Dec 22 2021 webapps
drwxr-xr-x. 7 root root 81 Dec 2 2021 webapps.dist
drwxrwxrwx. 2 root root 6 Dec 2 2021 work
root@877e614c2389:/usr/local/tomcat# rm -rf webapps
root@877e614c2389:/usr/local/tomcat# mv webapps.dist webapps
将 webapps.dist 目录重命名为 webapps 的目的是恢复 Tomcat 的默认应用和配置,这些默认应用和配置通常包含一个管理界面或欢迎页面,能够确认 Tomcat 正常工作
5. 使用免修改版容器镜像
5.1. 运行实列的创建
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
5.2. 出现问题及解决:
问题:docker run -d 之后docker ps 查看不掉运行的容器实列,直接退出
解决流程:直接 -it 进入容器手动运行服务脚本
root@4f06e97e71c8:/usr/local/tomcat# ./bin/catalina.sh run
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/lib/jvm/java-8-openjdk-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
library initialization failed - unable to allocate file descriptor table - out of memoryAborted (core dumped)
root@4f06e97e71c8:/usr/local/tomcat#
问题的核心是 "library initialization failed - unable to allocate file descriptor table - out of memory"。这表明在尝试初始化库时,由于内存不足,无法分配文件描述符表。
宿主机查看内存充足 ,内存OK
free -m
如果内存不足,,可以手动给容器分配
docker run -d -p 8080:8080 --name mytomcat8 --memory="2g" billygoo/tomcat8-jdk8
查看系统文件描述符
[root@rockylinux ~]# ulimit -n
1024
当前的文件描述符限制为 1024,这对于运行 Tomcat 这样的应用程序可能不足。需要增加这个限制
宿主机配置:
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536vim /etc/sysctl.conf
fs.file-max = 2097152sysctl -p 应用配置重新登录系统或重启系统后,检查文件描述符限制是否已经生效:
ulimit -n
文件描述符限制:
文件描述符是操作系统用来管理对文件、网络连接等资源的引用。每个进程都有一个文件描述符限制,即它可以同时打开的文件、网络连接等资源的数量
- *: 这表示配置适用于所有用户。
- soft nofile 65536: 设置软限制,表示单个用户进程可以打开的最大文件描述符数量为 65536。软限制可以在会话期间临时增加,但不能超过硬限制。
- hard nofile 65536: 设置硬限制,表示单个用户进程可以打开的最大文件描述符数量的上限为 65536。硬限制只能由超级用户增加。
这些修改确保系统允许用户进程(包括 Docker 容器中的进程)打开足够多的文件描述符,以防止因为文件描述符数量不足而导致的服务中断或性能问题。Tomcat 服务器在处理大量连接时,可能需要大量文件描述符,因此增加这个限制是必要的
系统内核参数配置
- fs.file-max: 这个参数设置系统范围内的最大文件描述符数量。2097152 表示系统最多可以同时打开 2097152 个文件描述符
- 增加 fs.file-max 参数的值确保系统内核允许足够多的文件描述符供所有用户和进程使用。这对高负载服务器尤为重要,能够防止系统因为文件描述符耗尽而发生崩溃。
Docker Daemon 配置
vim /etc/docker/daemon.json
{"default-ulimits": {"nofile": {"Name": "nofile","Hard": 65536,"Soft": 65536}}
}重启docker daemon
systemctl daemon-reload
systemctl restart docker
注意:此处 " , ”不要忘掉,因为是json文件,我的完整配置如下:
Docker Daemon 配置
- default-ulimits: 配置 Docker 守护进程的默认资源限制。
- nofile: 配置容器的文件描述符限制。
- Name: 资源类型(这里是文件描述符)。
- Hard: 硬限制,65536。
- Soft: 软限制,65536。
确保 Docker 容器在启动时继承适当的文件描述符限制,避免容器内应用因为文件描述符不足而发生错误。
为了确保系统和 Docker 容器内的应用程序能够稳定运行,建议同时进行以下调整:
上述操作做完之后,重新doker run即可