我正在构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'