[server] 권한이있는 Docker 컨테이너를 사용한 커널 튜닝

로드 밸런서의 커널 설정을 조정하기위한 컨테이너를 만들고 있습니다. 단일 권한 컨테이너를 사용하여 이미지의 변경 사항을 호스트에 배포하고 싶습니다. 예를 들면 다음과 같습니다.

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

테스트에서 변경 사항은 해당 컨테이너에만 적용됩니다. 전적으로 권한이있는 컨테이너를 / proc로 변경하면 기본 OS가 실제로 변경 될 것이라는 인상을 받았습니다.

$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



답변

이 특정 설정은도 커가 실행되는 네트워크 네임 스페이스의 영향을받습니다.

일반적으로 /proc시스템 전체에 관련된 설정을 변경하지만 기술적으로 말하면 /proc/net네트워크 네임 스페이스별로 결과를 반환하는 설정을 변경 하고 있습니다.

/proc/net사실에 심볼릭 링크 /proc/self/net정말 당신이 일을하고 있다는 네임 스페이스의 설정을 반영처럼.


답변

Docker 1.12+는 컨테이너 내부에서 sysctl 값을 조정할 수 있도록 기본 지원됩니다. 다음은 문서 에서 발췌 한 것입니다 .

런타임시 네임 스페이스 커널 매개 변수 (sysctls) 구성

–sysctl은 컨테이너에 네임 스페이스 커널 매개 변수 (sysctls)를 설정합니다. 예를 들어, 컨테이너 네트워크 네임 스페이스에서 IP 전달을 켜려면 다음 명령을 실행하십시오.

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

귀하의 예를 사용하면 올바른 인상 방법 net.core.somaxconn은 다음과 같습니다.

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


답변

권한있는 컨테이너는 여전히 고유 한 프로세스 네임 스페이스를 사용하고 있습니다 /proc. /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'


답변