使用特权Docker容器进行内核调优

我正在构build一个容器来调整负载平衡器的内核设置。 我更愿意使用单个特权容器将这些更改部署到映像中的主机上。 例如:

docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535 

在testing中,更改只对那个容器起作用。 我的印象是,一个完全特权的容器改变/ proc实际上会改变底层操作系统。

 $docker run --rm --privileged ubuntu:latest \ sysctl -w net.core.somaxconn=65535 net.core.somaxconn = 65535 $ docker run --rm --privileged ubuntu:latest \ /bin/bash -c "sysctl -a | grep somaxconn" net.core.somaxconn = 128 

这是多么特权容器应该工作?

我只是在做一些愚蠢的事情?

什么是做出持久改变的最好方法?

版本信息:

 Client version: 1.4.1 Client API version: 1.16 Go version (client): go1.3.3 Git commit (client): 5bc2ff8 OS/Arch (client): linux/amd64 Server version: 1.4.1 Server API version: 1.16 Go version (server): go1.3.3 Git commit (server): 5bc2ff8 

挂载/ proc的示例命令:

 $ docker run -v /proc:/proc ubuntu:latest \ /bin/bash -c "sysctl -a | grep local_port" net.ipv4.ip_local_port_range = 32768 61000 $ docker run -v /proc:/proc --privileged ubuntu:latest \ /bin/bash -c "sysctl -p /updates/sysctl.conf" net.ipv4.ip_local_port_range = 2000 65000 $ docker run -v /proc:/proc ubuntu:latest \ /bin/bash -c "sysctl -a | grep local_port" net.ipv4.ip_local_port_range = 32768 61000 $ docker run -v /proc:/proc --privileged ubuntu:latest \ /bin/bash -c "sysctl -a | grep local_port" net.ipv4.ip_local_port_range = 32768 61000 

这个特定的设置属于docker运行的networking名字空间的影响。

一般来说, /proc确实会改变系统范围内相关的设置,但是从技术上来说,您正在改变/proc/net设置,这会在每个networking命名空间的基础上返回结果。

请注意, /proc/net实际上是/proc/self/net的符号链接,因为它确实反映了您正在执行的命名空间的设置。

Docker 1.12+本地支持调整容器内的sysctl值。 以下是文档摘录:

在运行时configuration名称空间内核参数(sysctl)

–sysctl在容器中设置名称空间的内核参数(sysctl)。 例如,要打开容器networking名称空间中的IP转发,请运行以下命令:

docker run --sysctl net.ipv4.ip_forward=1 someimage

使用你的例子,提高net.core.somaxconn的正确方法是:

 docker run ... --sysctl net.core.somaxconn=65535 ... 

特权容器仍然为/proc使用自己的进程名称空间。 你可以做的是在容器中挂载real /proc

 docker run --rm --privileged -v /proc:/host-proc ubuntu:latest \ 'echo 65535 > /host-proc/sys/net/core/somaxconn' 

这对Docker 1.5.0有效:

 docker run --privileged --net=host --rm ubuntu:latest /bin/sh -c \ 'echo 65535 > /proc/sys/net/core/somaxconn'