Ayrıcalıklı Docker Kabı ile Çekirdek Ayarlama


10

Bir yük dengeleyici için çekirdek ayarlarını ayarlamak için bir kap yapıyorum. Bu değişiklikleri ana bilgisayara tek bir ayrıcalıklı kapsayıcı kullanarak bir görüntüde dağıtmayı tercih ederim. Örneğin:

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

Testlerde değişiklikler sadece o kap için geçerli olur. Tamamen ayrıcalıklı bir kapsayıcıyla / proc'ta yapılan değişikliklerin temeldeki işletim sistemini değiştireceği izlenimi altındaydım.

$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

Ayrıcalıklı konteynerlerin bu şekilde çalışması mı gerekiyor?

Sadece aptalca bir şey mi yapıyorum?

Kalıcı değişiklikler yapmanın en iyi yolu nedir?

Sürüm Bilgisi:

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

Monte / proc ile örnek komut:

$ 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

Birim olarak mount / proc gibi saçma bir şey yapmam gerekir mi?
allingeek

Denenmiş montaj / proc: / proc şanssız. Sonraki sysctl -a çağrıları orijinal değerleri döndürür.
allingeek

Görünüşe göre Docker 18.09
Jairo Andres Velasco Romero

Yanıtlar:


8

Bu ayar, docker'ın içinde çalıştığı ağ ad alanının etkisi altına girer.

Genel bir kural olarak /proc, sistem genelinde ilgili olan ayarları değiştirir, teknik olarak konuşursak, ancak /proc/netsonuçları ağ başına ad alanı temelinde döndüren ayarları değiştirirsiniz .

Not /proc/netaslında sembolik köprü ise /proc/self/netbu gerçekten iş yaptığını ad ayarlarını yansıtır yaptığı gibi.


Bu nedenle, / proc monte edilmiş ve --net ana bilgisayarına sahip bir kapta bu değişiklikleri yaparsam, ana bilgisayarda değişiklikler yapabilirim. Ancak cevabınızı anlarsam, sonraki kapsayıcılar eski değerleri (ana bilgisayarın kalıcı ayarlarından önyükleme) kendi ad alanında tutar. Yük dengeleyici kapsayıcısında çalışma zamanında aynı değişiklikleri yapmak için bu kapsayıcıyı CAP_NET_ADMIN gibi bir şeyle çalıştırmam gerekir. Kulağa doğru geliyor mu?
allingeek

Evet, CAP_NET_ADMIN ile çalıştırmak, bunun için bir ad alanı başlattığınız bir sorun oluşturmamalıdır.
Matthew Ife

Matthew_Ife Bu durumda kapsayıcının ayrıcalıklı olması beklenmiyor. Bana öyle geliyor ki CAP_NET_ADMIN, liman işçiliğinden kaçmaya izin verebilir (en azından kap, arayüzünü başka bir kapsayıcıyı taklit edecek şekilde yeniden yapılandırabilir)
Ángel

@Angel Bu, docker'ın içinde hangi bağlantıların kurulduğuna bağlıdır. Genel olarak, trafiğin ana ad alanına uygulanması zorunludur. Bunun için CAP_SYS_ADMIN'e ihtiyacınız olduğundan ad alanlarını başka bir yere değiştirmek mümkün olmaz.
Matthew Ife

SO - net = ana kullanarak çalışacak?
Jairo Andres Velasco Romero

7

Docker 1.12+, kapların içindeki sysctl değerlerini ayarlamak için yerel desteğe sahiptir. İşte belgelerden bir alıntı :

Çalışma zamanında ad boşluklu çekirdek parametrelerini (sysctls) yapılandırma

--Sysctl, kapta ad boşluklu çekirdek parametrelerini (sysctls) ayarlar. Örneğin, kapsayıcılar ağ ad alanında IP iletmeyi açmak için şu komutu çalıştırın:

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

Örneğinizi kullanmak, doğru bir şekilde yükseltmenin yolu net.core.somaxconnolacaktır:

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

3

Ayrıcalıklı kapsayıcı için hala kendi işlem ad alanını kullanıyor /proc. Yapabileceğiniz gerçek olanı /prockabın içine monte etmek :

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

Sadece bunu denedim ve işe yaramıyor.
allingeek

Liman işçisini tanıdığım küçüklerden; FreeBSD'deki bir hapishane gibi müstakil bir örnek olması gerekiyordu, bu yüzden kolayca hareket ettirilebilir, yeniden konuşlandırılabilir, vb ... Docklet'i ana işletim sistemi ile karıştırmamalısınız.
DutchUncle

2
Ayrıcalıklı kapları kullanmak için birkaç geçerli durum vardır ve bu mükemmel bir durum gibi görünmektedir. Tüm kaplar aynı temel çekirdeği kullanır. Standart kaplar salt okunur şekilde monte edilir.
allingeek

@allingeek CAP_NET_ADMIN gerçekten eksik bit olabilir.
Ángel

1
NET_ADMIN ile denendi ve hala çalışmıyor - 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

2

Bu benim için Docker 1.5.0 ile çalışır:

docker run --privileged --net=host --rm ubuntu:latest /bin/sh -c \
   'echo 65535 > /proc/sys/net/core/somaxconn'   
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.