我正在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的内存使用吗?
2条答案
按热度按时间v6ylcynt1#
我在尝试使用与您几乎完全相同的配置启动Docker时遇到了同样的问题,但从Windows 10而不是Windows Server 2019启动Docker。我怀疑问题不在于弹性容器的内存配置,而在于Docker主机本身需要调整。
我不知道在运行Docker Enterprise Preview Edition时如何增加Docker主机的内存,但对于Docker Desktop这样的主机,可以通过调整设置-〉高级-〉内存滑块来更改内存限制。Docker Desktop可能需要重新启动才能使更改生效。
类似地,如果您像我一样正在运行Docker机器,则可能需要重新创建它,但分配给新Docker机器示例的空间要大于默认的1GB。
换入任何对您有意义的虚拟机类型(例如,VirtualBox),并记住您需要在您打算运行Docker命令的每个控制台窗口中运行
docker-machine env | Invoke-Expression
。在给Docker主机更多的喘息空间后,我看到了明显的改善,因为与内存相关的错误消失了。但是,由于以下错误,container仍然无法启动:
这是一个已知的问题(请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_set_vm_max_map_count_to_at_least_262144)。同样,如果您使用的是安装了WSL 2的Docker桌面,您可以运行以下命令:
对于Docker机器,您需要使用ssh命令,并直接设置vm.max_map_count:
以上对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合成文件中:
希望这有帮助!
lf3rwulv2#
这是一个迟来的React,但仍然如果它是有用的任何人在那里。
事实上在windows服务器中,Docker桌面是运行Docker的最佳选择。如果您在windows服务器2019中使用Docker企业版,如果您没有购买许可证密钥来操作,它会在内存(RAM)分配给容器方面有一些限制。最大到最大它会分配9.7Mb的内存给容器。您可以使用以下命令确认这一点
在这里,您在输出中根本看不到MEM_USAGE/LIMIT列,如Docker桌面。
因此,当您的容器请求超过9.7Mb的内存时,它将关闭。此外,在Windows Server 2019企业版的情况下,您不能使用组合文件中的部署选项为特定容器保留内存。它将抛出错误“内存保留不受支持”。然而,mem_limit将被组合文件接受,但同样不会分配提到的内存。
注意-Docker企业版的优点是即使用户注销服务器,它也会一直在后台运行。但对于Docker桌面版,它会在用户注销后停止运行。