情况
所以我读到一个最佳的redis配置会对主机这样做(具体细节并不重要,这只是一个例子,见下文):
1.增加连接数
1.允许过量使用内存
1.停用透明巨型表
通常在shell中的主机系统上,我会简单地这样做:
sudo sysctl net.core.somaxconn=1024
sudo sysctl vm.overcommit_memory=1
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled # includes workaround as sudo echo doen't work
字符串
然后,您将有不同的命令来确保这些设置在重新启动等情况下仍然存在。
问题
我想确保当我docker-compose时,所有这些设置都是在主机上进行的。我希望在docker compose文件中有这些设置,所以我不必开始管理主机(直到现在)。
我一直在努力
我尝试将设置添加到docker-compose-file中,如下所示:
redis:
image: redis:latest
sysctls:
- net.core.somaxconn=1024
- sysctl vm.overcommit_memory=1
command: bash -c "redis-server --appendonly yes"
型
这适用于第一个设置,但对于第二个设置,我得到了错误
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: sysctl "vm.overcommit_memory" is not in a separate kernel namespace: unknown
型
我见过提升docker容器权限的解决方案,但对我来说,这会破坏你通过docker所拥有的安全性。
有没有人有一个安全和智能的解决方案?也许以某种方式做一个单独的容器,只执行一个bash脚本作为sudo?提前谢谢你。
1条答案
按热度按时间lymgl2op1#
根据这里的文档:
并不是所有的sysctl都是命名空间的。Docker不支持在容器内修改sysctl,这也会修改主机系统。随着内核的发展,我们希望看到更多的sysctl成为命名空间。
当前支持的sysctls
IPC运行空间:
kernel.msgmax
、kernel.msgmnb
、kernel.msgmni
、kernel.sem
、kernel.shmall
、kernel.shmmax
、kernel.shmmni
、kernel.shm_rmid_forced
。网络带宽:
net.*
开头的系统--network=host
选项,则不允许使用这些sysctl。一个可能的解决方案是创建一个脚本,将其合并到您的映像或容器中,并在启动时运行它,仅此而已。