विशेषाधिकार प्राप्त डॉकर कंटेनर के साथ कर्नेल ट्यूनिंग

मैं लोड बैलेंसर के लिए कर्नेल सेटिंग्स को ट्यून करने के लिए एक कंटेनर बना रहा हूं । मैं एक विशेषाधिकार प्राप्त कंटेनर का उपयोग करके एक छवि में मेजबान में उन परिवर्तनों को तैनात करना पसंद करूंगा । उदाहरण के लिए:

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

परीक्षण में परिवर्तन प्रभावी होते हैं लेकिन केवल उस कंटेनर के लिए । मैं इस धारणा के तहत था कि पूरी तरह से विशेषाधिकार प्राप्त कंटेनर में परिवर्तन /खरीद वास्तव में अंतर्निहित ओएस को बदल देगा ।

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

क्या यह विशेषाधिकार प्राप्त कंटेनरों को कैसे काम करना चाहिए?

क्या मैं सिर्फ कुछ मूर्खतापूर्ण कर रहा हूँ?

स्थायी परिवर्तन करने का सबसे अच्छा तरीका क्या है?

संस्करण जानकारी:

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

घुड़सवार /खरीद के साथ उदाहरण कमांड:

$ 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 जैसा कि यह वास्तव में उस नामस्थान की सेटिंग्स को दर्शाता है जिसमें आप काम कर रहे हैं ।

डॉकर 1.12+ को कंटेनरों के अंदर एसआईएससीटीएल मूल्यों को ट्विक करने के लिए मूल समर्थन है । यहाँ से एक अंश है प्रलेखन:

रनटाइम पर नेमस्पेस कर्नेल पैरामीटर (एसआईएससीटीएलएस) कॉन्फ़िगर करें

--एसआईएससीटीएल कंटेनर में नेमस्पेस कर्नेल पैरामीटर (एसआईएससीटीएल) सेट करता है । उदाहरण के लिए, कंटेनर नेटवर्क नेमस्पेस में आईपी अग्रेषण चालू करने के लिए, इस कमांड को चलाएं:

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'

यह मेरे लिए डॉकर 1.5.0 के साथ काम करता है:

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

क्या मुझे वॉल्यूम के रूप में माउंट /प्रोक जैसे मूर्खतापूर्ण कुछ करने की ज़रूरत है?

बिना किसी भाग्य के बढ़ते /खरीद:/खरीद की कोशिश की । इसके बाद के कॉल एसआईएससीटीएल-ए को मूल मान लौटाते हैं ।

ऐसा लगता है कि अब यह डॉकर 18.09 पर काम करता है