Docker 中的 Logstash 没有响应

Logstash in Docker not responsive

我需要将 ElasticSearch/Logstash 进程从 Windows 迁移到 Docker。此过程在 Windows 中运行良好(Elasticsearch 和 Logstash 是 Logstash 读取 Oracle 数据库以提供给 ElasticSearch 的服务)。问题是,当我启动 Logstash 容器时,Docker 变得无响应且速度极慢,例如 docker ps 需要一分钟。杀死 logstash 容器还需要一分钟。我 运行 在 Windows 10 Pro 和 Docker 桌面上 运行 宁此,然后 these steps

我下载了两个图像(elasticsearch:7.5.1 和 logstash:7.5.1)并使用

启动了容器
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.5.1

docker run --name cont_logstash -d -e LIB=/usr/share/logstash/pipeline/ojdbc8.jar -e 
DRIVER=Java::oracle.jdbc.driver.OracleDriver -e CONN=jdbc:oracle:thin:@//172.0.0.2:51521/XE 
-e USER=userdb -e PASSWORD=xxx -v vol_logstash:/usr/share/logstash/pipeline/ logstash:7.5.1

请注意,我创建了一个卷来存储 logstash.conf 文件和 ojdbc8.jar Oracle JDBC 驱动程序。如果我在 Logstash 容器中创建一个 bash,我可以在 /usr/share/logstash/pipeline/.

中看到这些文件

不仅Docker很慢,而且Logstash根本不工作。如果我 运行 Logstash 与 -it 交互我得到这个(注意没有关于设置的警告):

C:\docker>docker run --name cont_logstash -it -e LIB=/usr/share/logstash/pipeline/ojdbc8.jar -e DRIVER=Java::oracle.jdbc.driver.OracleDriver -e CONN=jdbc:oracle:thin:@//localhost:51521/XE -e USER=userdb -e PASSWORD=xxx -v vol_logstash:/usr/share/logstash/pipeline/ logstash:7.5.1

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.8.0.jar) to field java.io.FileDescriptor.fd WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release

根据 Docker 上的文档 Logstash 在控制台登录,但我在屏幕上没有看到任何错误。有什么想法可以解决这个问题吗?

更新

我 运行 其他容器没有问题,包括 8.4 Gb Oracle 数据库。

这是我用命令 docker stats:

看到的

我取消 logstash 容器后,统计信息被填充。

可能是资源问题。 Docker 在 windows 主机上运行虚拟机。您应该检查它是否有足够的内存,以及是否有多个内核分配给 VM。

如果这不是问题,也许检查主机的 bios 中是否启用了虚拟化。

笔记本电脑可以有 32GB,但使用 Hyper-V 机器可能配置了下限(我猜默认是 2GB)。所有 Java 个容器都需要大量内存,因为您没有限制 Java 个内存(所有 -XX:*RAM* 个配置)。那么没有 logstash 的容器消耗了多少内存(您可以在 docker stats 中看到)以及为 VM 配置了多少内存(Docker 的系统托盘->设置->高级)?