刷新docker容器的net.core.somaxcomm(或任何sysctl属性)

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 stopsudo docker run再次
  • 重新启动整个docker服务 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.从技术上讲,您无法将此值传播到容器,因为两个网络命名空间不共享它.

但是,除了以特权模式运行容器外,还有两种方法可以调整此值.

  1. 在运行容器时使用"--net host",因此它使用主机的网络接口,因此共享相同的网络命名空间.

  2. 您可以使用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的疏忽,因此他们可能会在卷映射上添加额外的验证,然后这个技巧将无效.

  • 好吧,正如你所建议的那样,第二种解决方法在EB上完美运行,所以我们现在就会坚持这样做.我不确定我是否完全理解如何从容器内部修改`/ proc`(通过`/ writable-proc`)实际上修改了容器的命名空间而不是父安装程序接口的命名空间,但是你已经保存了它我十几个小时,非常感谢.我还在关于使用特权模式的Beanstalk论坛上打开了一个问题:https://forums.aws.amazon.com/thread.jspa?threadID = 162290 (2认同)

esh*_*han 7

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


sir*_*ael 2

刚刚弄清楚如何解决这个问题,现在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)

请注意,我从另一个线程复制了这个答案