docker 内存 limit 与 swap 限制

结论

主机层没有开启 swap ,容器运行时无论怎么设置 --memory-swap,都不会使用到 swap,容器最大能使用的内存等于设置的内存限制;

主机层开启了 swap 如下表:

memorymemory-swap效果
M正数 S容器最大可用内存为S,其中 ram 为 M,swap 为(S-M),若 S=M 则无可用 swap 资源
M0相当于未设置 memory-swap
M-1容器最大可用内存为 M+主机可用swap
M未设置容器最大可用内存为 2M,其中 ram 为 M,swap 为 M

主机开启 swap

不设置 --memory-swap 参数

容器最大可以使用 2 倍的 --memory 内存 (可使用的 swap 大小跟内存限制的大小一样)

限制内存 100M,不设置 --memory-swap,容器申请使用 2X90M=180M,程序可以正常运行;docker stats 显示使用的内存量等于限制的内存量;查看 cgroup 里的 memory.stat 可以看到,swap 使用了大概 80M
image
限制内存 100M,不设置 --memory-swap,容器申请使用 2X150M=300M,由于最大允许使用内存 200M,容器启动失败;
image

设置 --memory-swap 100M

限制内存 100M,设置 --memory-swap=100M,容器申请使用 2X51M=102M,由于最大允许使用内存 100M,容器启动失败;
image

设置 --memory-swap -1

限制内存 100M,设置 --memory-swap=-1,容器申请使用 2X150M=300M,由于最大允许使用内存为 100M + 系统 swap 大小,所以容器运行正常;docker stats 显示使用的内存量等于限制的内存量;查看 cgroup 里的 memory.stat 可以看到,swap 使用了大概 200M
image
限制内存 100M,设置 --memory-swap=-1,容器申请使用 2X200M=400M,由于最大允许使用内存为 100M + 系统 swap 大小,所以容器运行正常;docker stats 显示使用的内存量等于限制的内存量;查看 cgroup 里的 memory.stat 可以看到,swap 使用了大概 300M
image

主机关闭 swap

不设置 --memory-swap 参数

限制内存 100M,未设置 --memory-swap(表示可以使用与内存限制一样的swap),容器申请使用 2X51M=102M,由于最大允许使用内存 100M,主机没有 swap 可用,容器启动失败;
image

设置 --memory-swap 100M

限制内存 100M,设置 --memory-swap=200M,容器申请使用 2X51M=102M,由于最大允许使用内存 100M,主机没有 swap 可用,容器启动失败;
image

设置 --memory-swap -1

限制内存 100M,设置 --memory-swap=-1(表示使用主机的所有 swap),容器申请使用 2X51M=102M,由于最大允许使用内存 100M,主机没有 swap 可用,容器启动失败;
image
文章来源:李斯文的笔记本

<think>好的,我现在需要回答用户关于如何在Docker中为MongoDB容器设置内存限制的问题。首先,我需要回忆一下Docker限制容器内存的方法。Docker通常使用`docker run`命令的参数来设置资源限制,比如内存和CPU。 用户的问题明确指向内存限制,所以我要找到相关的参数。记得Docker内存限制的参数是`--memory`或者`-m`,后面跟上内存大小,比如`-m 2g`表示限制为2GB。此外,可能还需要设置内存交换空间,用`--memory-swap`参数。不过要注意,交换空间参数的行为可能有些复杂,需要正确解释。 接下来,我需要考虑如何将这些参数应用到MongoDB容器上。用户可能是在运行MongoDB官方镜像,所以需要给出具体的命令示例。例如,使用`docker run`命令启动MongoDB容器时,添加内存限制参数。 另外,用户可能使用Docker Compose来管理容器,所以也要提供在docker-compose.yml文件中配置内存限制的方法。在Compose文件中,可以通过`deploy.resources.limits.memory`来设置,或者在旧版本中使用`mem_limit`。需要确认不同Docker版本的语法差异,避免给出错误的信息。 还要考虑到MongoDB本身的内存使用情况。MongoDB的内存管理可能对容器内的限制敏感,尤其是当容器内存不足时,可能会被系统终止。这时候可能需要调整MongoDB的配置,比如`wiredTigerCacheSizeGB`,确保它不超过容器内存的一定比例,比如50%。这样可以避免MongoDB占用过多内存导致容器被OOM Killer终止。 然后,我需要检查提供的引用内容,看看是否有相关信息可以利用。引用[1]提到Docker中MongoDB的内存管理配置,可能涉及内存限制的设置。引用[4]讨论了资源不足导致容器重启的情况,这也和内存限制有关,如果内存设置过低,可能导致容器被终止并重启。 在撰写回答时,需要分步骤说明不同的方法:命令行参数、Docker Compose配置,以及MongoDB自身的调整。每个步骤都要给出具体的示例代码,比如`docker run`命令和docker-compose.yml的片段。同时,注意事项部分要提醒用户关于交换空间的设置和MongoDB配置的调整。 最后,生成相关问题,可能包括监控内存使用、处理OOM错误、调整交换空间等,这些都能帮助用户进一步理解和解决问题。 现在需要确保所有的命令和配置都正确,符合Docker的最新文档,并且语法正确。同时,回答要使用中文,结构清晰,分点说明,并引用相关的引用内容作为支持。</think>### 如何在Docker中为MongoDB容器设置内存限制? #### 1. 使用 `docker run` 命令行参数 通过 `-m` 或 `--memory` 参数直接限制容器内存,例如: ```bash docker run -d --name mongo-container \ -m 2g \ # 限制内存为2GB --memory-swap 3g \ # 内存+交换空间总量为3GB(交换空间为1GB) -e MONGO_INITDB_ROOT_PASSWORD=your_password \ mongo:latest ``` - **`-m 2g`**:限制容器最大物理内存为2GB[^1]。 - **`--memory-swap 3g`**:总内存(物理内存+交换空间)为3GB。若未指定,默认交换空间物理内存相等[^4]。 #### 2. 在 Docker Compose 中配置 在 `docker-compose.yml` 中通过 `deploy.resources` 设置(Docker Swarm/Kubernetes环境适用): ```yaml services: mongodb: image: mongo:latest environment: MONGO_INITDB_ROOT_PASSWORD: your_password deploy: resources: limits: memory: 2g memory-swap: 3g ``` 或使用传统 `mem_limit`(适用于旧版本Docker Compose): ```yaml services: mongodb: image: mongo:latest mem_limit: 2g memswap_limit: 3g ``` #### 3. 调整MongoDB内部配置 MongoDB的 `wiredTiger` 存储引擎默认占用系统内存的50%。在容器中需手动限制其缓存大小以避免超出容器限制: ```yaml # 启动容器时添加配置参数 docker run -d --name mongo-container \ -m 4g \ -e MONGO_INITDB_ROOT_PASSWORD=your_password \ mongo:latest --wiredTigerCacheSizeGB 1.5 # 限制缓存为1.5GB ``` #### 注意事项 1. **交换空间(Swap)**:若未设置 `--memory-swap`,默认物理内存相同。设置为 `-1` 允许无限制交换(需主机支持)。 2. **OOM Killer**:内存超限时容器可能被终止,可通过 `docker logs` 查看日志[^2]。 3. **重启策略**:建议设置容器重启策略为 `on-failure`,避免因内存问题频繁重启。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值