Tuu*_*nen 18 linux sysctl docker amazon-elastic-beanstalk
我正在尝试更改net.core.somaxconndocker容器,以便能够为我的Web应用程序提供更大的请求队列.
在OS上,在docker之外,我首先成功修改了属性:
$ cat /proc/sys/net/core/somaxconn
128
$ sudo sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
$ cat /proc/sys/net/core/somaxconn
1024
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何将这种变化传播到docker中.我试过了:
/etc/sysctl.conf(希望docker在容器启动时读取该文件)sudo docker stop和sudo docker run再次sudo service docker restart但在容器内,cat /proc/sys/net/core/somaxconn总是显示128.
我正在运行docker 1.2(所以我不能,默认情况下,不能修改/proc容器内的属性)和Elastic Beanstalk(所以没有--privileged模式,这将允许我修改/proc).
如何将sysctl更改传播到docker?
zli*_*uva 35
每个网络名称空间注册 "net/core"子区.并且somaxconn的初始值设置为128.
当您在主机系统上执行sysctl时,它会为其网络命名空间设置核心参数,该命名空间由init拥有.(基本上这是默认命名空间).这不会影响其他网络命名空间.
启动Docker容器时,该容器的虚拟网络接口(在主机上显示为vethXXX)将附加到其自己的命名空间,该命名空间的初始somaxconn值仍为128.从技术上讲,您无法将此值传播到容器,因为两个网络命名空间不共享它.
但是,除了以特权模式运行容器外,还有两种方法可以调整此值.
在运行容器时使用"--net host",因此它使用主机的网络接口,因此共享相同的网络命名空间.
您可以使用Docker的卷映射支持将proc文件系统挂载为读写.诀窍是将它映射到一个名为"/ proc"的卷,因为Docker会将/ proc/sys等重新安装为非特权容器的只读.这需要主机以rw的形式挂载/ proc,大多数系统就是这种情况.
docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash
root@edbee3de0761:/# echo 1024 > /writable-proc/sys/net/core/somaxconn
root@edbee3de0761:/# sysctl net.core.somaxconn
net.core.somaxconn = 1024
Run Code Online (Sandbox Code Playgroud)方法2应该通过Dockerrun.aws.json中的卷映射支持在Elastic Beanstalk上运行.此外,它应该适用于每个命名空间的/ proc下的其他可调参数.但这很可能是对Docker的疏忽,因此他们可能会在卷映射上添加额外的验证,然后这个技巧将无效.
docker 1.12添加了对使用--sysctl设置sysctls的支持.
docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis
Run Code Online (Sandbox Code Playgroud)
docs:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime
刚刚弄清楚如何解决这个问题,现在Elastic Beanstalk 支持运行特权容器,您只需将以下示例添加"privileged": "true"到您的容器中Dockerrun.aws.json(请查看container-1):
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [{
"name": "container-0",
"essential": "false",
"image": "ubuntu",
"memory": "512"
}, {
"name": "container-1",
"essential": "false",
"image": "ubuntu",
"memory": "512",
"privileged": "true"
}]
}
Run Code Online (Sandbox Code Playgroud)
请注意,我从另一个线程复制了这个答案。