निजीकृत डॉकटर कंटेनर के साथ कर्नेल ट्यूनिंग


10

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

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

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

$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

क्या मुझे वॉल्यूम के रूप में माउंट / प्रॉप की तरह मूर्खतापूर्ण कुछ करने की आवश्यकता है?
Allingeek

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

ऐसा लगता है कि अब यह डॉकटर 18.09 पर काम करता है
जाइरो एंड्रेस वेलसको रोमेरो

जवाबों:


8

यह विशेष सेटिंग नेटवर्क नेमस्पेस के प्रभाव में आती है जो डॉक में चलती है।

जैसा कि एक सामान्य नियम /procसेटिंग को बदल देता है जो सिस्टमली रीलेवेंट होता है, तकनीकी रूप से बोलते हुए भी आप सेटिंग्स बदल रहे हैं /proc/netजिसमें प्रति नेटवर्क नाम स्थान के आधार पर परिणाम मिलते हैं।

ध्यान दें कि /proc/netवास्तव में एक सिम्लिंक है /proc/self/netक्योंकि यह वास्तव में उस नामस्थान की सेटिंग्स को दर्शाता है जो आप काम कर रहे हैं।


इसलिए, यदि मैं एक कंटेनर में / proc घुड़सवार और --net होस्ट के साथ यह परिवर्तन करता हूं, तो मैं होस्ट में परिवर्तन कर सकता हूं। लेकिन अगर मैं आपके उत्तर को समझता हूं, तो बाद के कंटेनर पुराने मानों (मेजबान की स्थायी सेटिंग से बूटस्ट्रैप्ड) को अपने नाम पर बनाए रखेंगे। मुझे लोड बैलेंसर के कंटेनर में रनटाइम में समान परिवर्तन करने के लिए CAP_NET_ADMIN जैसी किसी चीज़ से उस कंटेनर को चलाने की आवश्यकता होगी। सही लग रहा है?
Allingeek

हां, CAP_NET_ADMIN के साथ चलने से कोई समस्या नहीं होनी चाहिए जहां आपने इसके लिए एक नामस्थान को तत्काल तैयार किया है।
मैथ्यू इफ

मैथ्यू_ इफ इस मामले में कोई मुद्दा नहीं है कि कंटेनर को विशेषाधिकार प्राप्त होने की उम्मीद है। यह मुझे लगता है कि CAP_NET_ADMIN डॉक्यू कन्फेशन से बचने की अनुमति दे सकता है (कम से कम कंटेनर दूसरे कंटेनर को लगाने के लिए अपने इंटरफेस को फिर से कॉन्फ़िगर कर सकता है)
3ngel

@Angel कि क्या लिंक पर निर्भर करेगा स्थापना कर्ता के अंदर है। आम तौर पर किसी को मूल नाम स्थान में यातायात का प्रवर्तन करना चाहिए। आपके लिए CAP_SYS_ADMIN की आवश्यकता के बाद से नामस्थानों को कहीं और स्विच करना संभव नहीं होगा।
मैथ्यू इफ

SO का उपयोग कर - नेट = होस्ट काम करेगा?
जेरो एंड्रेस वेलास्को रोमेरो

7

डॉकटर १.१२+ में कंटेनरों के अंदर sysctl मान को ट्विक करने के लिए मूल समर्थन है। यहाँ प्रलेखन से एक अंश है :

रनटाइम पर नामांकित कर्नेल पैरामीटर (sysctls) कॉन्फ़िगर करें

--Sysctl कंटेनर में नामांकित कर्नेल पैरामीटर (sysctls) सेट करता है। उदाहरण के लिए, कंटेनर नेटवर्क नामस्थान में IP अग्रेषण चालू करने के लिए, यह कमांड चलाएँ:

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

अपने उदाहरण का उपयोग, उठाने का सही तरीका net.core.somaxconnहोगा:

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

3

विशेषाधिकार प्राप्त कंटेनर अभी भी अपनी प्रक्रिया नामस्थान का उपयोग कर रहा है /proc/procकंटेनर के अंदर असली को माउंट करने के लिए आप क्या कर सकते हैं :

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

बस यह कोशिश की और यह काम नहीं करता है।
Allingeek

छोटे से मुझे डॉकटर के बारे में पता है; यह एक आत्म-निहित उदाहरण माना जाता है, FreeBSD पर जेल की तरह, इसलिए इसे आसानी से चारों ओर ले जाया जा सकता है, फिर से तैयार किया जा सकता है, आदि ... आपको होस्ट ओएस के साथ डॉकलेट को मिश्रण नहीं करना चाहिए।
डचयूनल अंक

2
-प्राइवेट किए गए कंटेनरों का उपयोग करने के लिए कई वैध मामले हैं और यह बिल्कुल सही केस की तरह लगता है। सभी कंटेनर एक ही अंतर्निहित कर्नेल का उपयोग करते हैं। मानक कंटेनर केवल पढ़ने के लिए माउंट / खरीद करते हैं।
allingeek

@allingeek CAP_NET_ADMIN वास्तव में लापता बिट हो सकता है।
Ángel

1
NET_ADMIN के साथ प्रयास किया गया है और यह अभी भी काम नहीं करता है - docker run --cap-add NET_ADMIN --net = host -v / proc: / proc_host ubuntu: 14.04 bash -c 'echo 1> / proc -host / sys / net / ipv4 / ip_forward '&& sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
tomdee

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.