09 docker 安装tomcat 详解

目录

一、安装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 65536

vim /etc/sysctl.conf 
fs.file-max = 2097152

sysctl -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即可

6. 验证 OK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最灵活且易用的C++开源串口通信调试软件

这款C开源串口调试软件,集成了丰富的功能,为用户提供高效、便捷的串口通信调试体验。以下是其核心功能亮点: 基础功能: 数据交互自如:支持串口数据的轻松读取与发送,让数据交换变得简单直接。 灵活配置参…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)

拆分大文档 很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档 大文档对MongoDB的性能影响还是很大的,就我个人经验而言&…

【TB作品】基于ATmega48的开机登录程序设计

使用Proteus仿真软件设计一个开机登录程序,单片机选用ATmegga48. 基础要求: 1.程序启动后在LCD1602液晶屏上提示用户通过独立按键输入密码(6位)。 2.密码输入错误则在屏幕上提示密码错误,密码输入正确则在屏幕上提示密 码正确后等待约3秒后进入主界面,在屏幕中央显示HelloWorld…

基于RK3588的8路摄像头实时全景拼接

基于RK3588的8路摄像头实时全景拼接 输入:2路csi转8路mpi的ahd摄像头,分辨率1920 * 1080 8路拼接结果: 6路拼接结果: UI界面: UI节目设计原理

数字时代如果你的企业还未上线B端系统助力则后果很严重

**数字时代如果你的企业还未上线B端系统助力则后果很严重** 数字化浪潮席卷全球,企业对于数字化转型的重视程度日益提高。B端系统,作为企业数字化转型的核心组成部分,其重要性不言而喻。如果你的企业还未上线B端系统助力,那么后果…

异步主从复制

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术,通过将一个数据库服务器(主服务器)上的数据变更自动同步到一个或多个数据库服务器(从服务器)上,以此来实现数据的冗余备份、读…

2024年6月后2周重要的大语言模型论文总结:LLM进展、微调、推理和对齐

本文总结了2024年6月后两周发表的一些最重要的大语言模型论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。 LLM进展与基准 1、 BigCodeBench: Benchmarking Code Generation with Diverse Function Calls and Com…

图文识别0难度上手~基于飞浆对pdf简易ocr并转txt

前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意: 本项目pdf的ocr对于表格、画图文字,水印等干扰没做任何处理,因此希望各位使用该功能的pdf尽量不要含有这些干扰项,以免影响翻译效果。 流程 1.构建…

收银系统源码-收银台副屏广告

1. 功能描述 门店广告:双屏收银机,副屏广告,主屏和副屏同步,总部可统一控制广告位,也可以给门店开放权限,门店独立上传广告位; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…

Nginx实战:nginx性能压测(ab)

在nginx的生产实践中,不管是服务上线,还是性能优化,都会遇到需要对nginx的性能压测,本文介绍一个简单的压测工具:ab命令 ab(Apache Bench)是一个常用的HTTP压力测试工具,可以用来测试Nginx的性能和压力。ab命令可以指定并发请求数、请求数、请求类型等参数,并输出测试…

SpringBoot 启动流程四

SpringBoot启动流程四 前面这个创建对象是初始化SpringApplication对象 是加载了SpringBoot程序的所有相关配置 我们接下来要将这个run方法 run过程是一个运行 初始化容器 我们看我们的运行结果是得到一个ConfigurableApplicationContext对象 package com.bigdata1421.star…

MySQL 集群

MySQL 集群有多种类型,每种类型都有其特定的用途和优势。以下是一些常见的 MySQL 集群解决方案: 1. MySQL Replication 描述:MySQL 复制是一种异步复制机制,允许将一个 MySQL 数据库的数据复制到一个或多个从服务器。 用途&…

医疗器械企业CRM系统推荐清单(2024版)

近年来,我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下,得到了快速发展,正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而,行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

mac 安装nvm的教程

在macOS上切换Node.js版本,可以使用nvm(Node Version Manager)。以下是安装nvm和切换Node.js版本的步骤: 安装nvm 下载方式 终端复制输入: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.…

Odoo14使用hiPrint实现打印功能

使用hiPrint代替odoo原生的打印功能 可以实现快速自定义修改打印模板,无需每次都调整打印模板 无论是表单分页还是各种需求,都能满足 目录 1 使用命令创建新的模块,无用的demo文件可以删除掉 2 新建“打印模板”,用于保存打印…

MySQL表的增删改查(CRUD)

MySQL表的增删改查(CRUD) 文章目录 MySQL表的增删改查(CRUD)1. Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2. Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式…

嵌入式系统中状态机实现详解

嵌入式开发中系统经常处于某种状态,如何处理呢?接下来分析一下,状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事? 现在系统处在什么状态? 在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法…

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

spark on k8s两种方式的原理与对比

spark on k8s两种方式的原理与对比 1、spark on k8s 方式 spark-submit可以直接用来向 Kubernetes 集群提交 Spark 应用,提交机制如下: 1、Spark 创建一个在Kubernetes pod中运行的 Spark 驱动程序。 2、驱动程序创建在 Kubernetes Pod 中运行的执行器…