elasticsearch 为Docker企业预览版分配更多内存

kpbpu008  于 2023-01-04  发布在  ElasticSearch
关注(0)|答案(2)|浏览(138)

我正在Windows Server 2019上运行Docker Enterprise Preview Edition,并成功拉取并运行了下面的docker-compose. yml文件。但是,不久之后,容器关闭,当我运行命令docker-compose logs时,它显示我内存不足的问题如下:
停靠器合成文件

version: '3.7'

services:

  elasticsearch:
   container_name: elasticsearch
  #  image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
   image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1
   deploy:
       resources:
          limits:
            cpus: 0.25
            memory: 4096m
   ports:
    - 9200:9200
   volumes:
    - C:\DockerContainers\Elasticsearch\data:/usr/share/elasticsearch/data
    - C:\DockerContainers\Elasticsearch\config\certs:/usr/share/elasticsearch/config/certs
   environment:
    - xpack.monitoring.enabled=true
    - xpack.watcher.enabled=true
    - ES_JAVA_OPTS=-Xms512m -Xmx512m
    - discovery.type=single-node
  #  networks:
  #   - elastic


  kibana:
   container_name: kibana
  #  image: docker.elastic.co/kibana/kibana:7.9.2
   image: docker.elastic.co/kibana/kibana:7.17.1
   deploy:
       resources:
          limits:
            cpus: 0.25
            memory: 4096m   
   ports:
    - 5601:5601
   volumes:
    - C:\DockerContainers\Elasticsearch\Kibana\config\certs:/usr/share/kibana/config/certs    
   depends_on:
    - elasticsearch
  #  networks:
  #   - elastic

# networks:
#   elastic:
#     driver: nat

Docker日志

elasticsearch    | # There is insufficient memory for the Java Runtime Environment to continue.
elasticsearch    | # Native memory allocation (mmap) failed to map 65536 bytes for committing reserved memory.
elasticsearch    | # An error report file with more information is saved as:
elasticsearch    | # logs/hs_err_pid7.log

我在elasticsearch Docker指南上读到它至少需要4GB RAM。我已经在Docker compose yml文件中包含了RAM限制,但似乎没有生效。有人知道如何设置运行在Windows Server 2019上的Docker的内存使用吗?

v6ylcynt

v6ylcynt1#

我在尝试使用与您几乎完全相同的配置启动Docker时遇到了同样的问题,但从Windows 10而不是Windows Server 2019启动Docker。我怀疑问题不在于弹性容器的内存配置,而在于Docker主机本身需要调整。
我不知道在运行Docker Enterprise Preview Edition时如何增加Docker主机的内存,但对于Docker Desktop这样的主机,可以通过调整设置-〉高级-〉内存滑块来更改内存限制。Docker Desktop可能需要重新启动才能使更改生效。
类似地,如果您像我一样正在运行Docker机器,则可能需要重新创建它,但分配给新Docker机器示例的空间要大于默认的1GB。

docker-machine create -d vmwareworkstation --vmwareworkstation-memory-size 8192 default

换入任何对您有意义的虚拟机类型(例如,VirtualBox),并记住您需要在您打算运行Docker命令的每个控制台窗口中运行docker-machine env | Invoke-Expression
在给Docker主机更多的喘息空间后,我看到了明显的改善,因为与内存相关的错误消失了。但是,由于以下错误,container仍然无法启动:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

这是一个已知的问题(请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_set_vm_max_map_count_to_at_least_262144)。同样,如果您使用的是安装了WSL 2的Docker桌面,您可以运行以下命令:

wsl -d docker-desktop sysctl -w vm.max_map_count=262144
sysctl -w vm.max_map_count=262144

对于Docker机器,您需要使用ssh命令,并直接设置vm.max_map_count:

docker-machine env | Invoke-Expression
docker-machine ssh default
sudo sysctl -w vm.max_map_count=262144

以上对Docker计算机的更改将在当前会话期间持续,但在重新启动后将丢失。您可以通过以下方法使其保持不变:
1.正在将sysctl -w vm.max_map_count=262144添加到/var/lib/boot2docker/bootlocal.sh文件中。请注意,在您更改之前,此文件可能不存在。
1.运行chmod +x /var/lib/boot2docker/bootlocal.sh
1.退出ssh并通过docker-machine restart default重新启动Docker机器。
1.要确认更改,请运行docker-machine ssh default sudo sysctl vm.max_map_count。您应该看到它被设置为262144。
在这些修改之后,我能够调出弹性容器。您可以通过在Postman或curl中发出对http://localhost:9200的GET请求来测试这一点。如果您使用的是Docker机器,则您设置的端口可供机器访问,但无法供Windows机器访问。为了能够连接到端口9200,您需要通过docker-machine ssh -f -N -L 9200:localhost:9200命令设置端口转发。
此外,请考虑将以下内容添加到Docker合成文件中:

environment:
  - bootstrap.memory_lock=true
ulimits:
  memlock:
    soft: -1
    hard: -1

希望这有帮助!

lf3rwulv

lf3rwulv2#

这是一个迟来的React,但仍然如果它是有用的任何人在那里。
事实上在windows服务器中,Docker桌面是运行Docker的最佳选择。如果您在windows服务器2019中使用Docker企业版,如果您没有购买许可证密钥来操作,它会在内存(RAM)分配给容器方面有一些限制。最大到最大它会分配9.7Mb的内存给容器。您可以使用以下命令确认这一点

Docker stats <container id>

在这里,您在输出中根本看不到MEM_USAGE/LIMIT列,如Docker桌面。
因此,当您的容器请求超过9.7Mb的内存时,它将关闭。此外,在Windows Server 2019企业版的情况下,您不能使用组合文件中的部署选项为特定容器保留内存。它将抛出错误“内存保留不受支持”。然而,mem_limit将被组合文件接受,但同样不会分配提到的内存。
注意-Docker企业版的优点是即使用户注销服务器,它也会一直在后台运行。但对于Docker桌面版,它会在用户注销后停止运行。

相关问题