Soru Ayrıcalıklı Docker Konteyneri ile Çekirdek Ayarlama


Yük dengeleyici için çekirdek ayarlarını ayarlamak için bir kap yapıyorum. Tek bir ayrıcalıklı konteynır kullanarak bu değişiklikleri ana bilgisayara 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 bu konteyner için geçerli olur. Tamamen ayrıcalıklı bir kapsayıcı / proc değişiminin altta yatan işletim sistemini değiştireceği izleniminin 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

Bu ayrıcalıklı konteynırların çalışması nasıl?

Sadece aptalca bir şey 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 edilmiş / 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

9
2018-02-03 11:57


Menşei


Bir birim olarak mount / proc gibi aptalca bir şey yapmam gerekiyor mu? - allingeek
Şanssız montaj / proc: / proc. Sonraki çağrılar sysctl -a özgün değerleri döndürür. - allingeek


Cevaplar:


Bu özel ayar, docker'ın çalıştığı ağ ad alanının etkisine girer.

Genel bir kural olarak /proc sistem genelinde uygun olan ayarları değiştirir, ancak teknik olarak /proc/net Bu, her ağ ad alanı temelinde sonuçları döndürür.

Bunu not et /proc/net aslında bir sembolik /proc/self/net Gerçekten de, işi yaptığınız ad alanının ayarlarını yansıtıyor.


8
2018-02-03 12:20



Yani, eğer / proc mounted ve --net host ile bir kapta bu değişiklikleri yaparsam, hostta değişiklikler yapabilirim. Fakat cevabınızı anlarsam, sonraki konteynerler kendi ad alanında eski değerleri (ana bilgisayarın kalıcı ayarlarından önyüklenen) koruyacaklardır. 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. Doğru ses mi? - allingeek
Evet, CAP_NET_ADMIN ile koşmak, bunun için bir ad alanı oluşturduğunuz bir sorun oluşturmamalıdır. - Matthew Ife
Matthew_Ife Bu durumda bir sorun konteyner ayrıcalıklı olması bekleniyor. Bana öyle geliyor ki, CAP_NET_ADMIN docker konfıgürasyonundan kaçışa izin verebilir (en azından kapsayıcı, başka bir kapsayıcının kimliğine bürünmek için arabirimini yeniden yapılandırabilir) - Ángel
@Angel Bu, docker'ın içinde hangi bağlantı noktasının kurulduğuna bağlı olacaktır. Genel olarak, üst alan adında trafiğin yürürlüğe konması gerekir. Bunun için CAP_SYS_ADMIN'e ihtiyaç duyduğunuzdan, ad alanlarını başka bir yere çevirmek mümkün olmaz. - Matthew Ife


Docker 1.12+, kapsayıcıların içindeki sysctl değerleri için yerel desteğe sahiptir. İşte bir alıntı belgeleme:

Çalışma zamanında adlandırılmış çekirdek parametrelerini (sysctls) yapılandırın

--Sysctl, kaptaki adlandırılmış çekirdek parametrelerini (sysctls) ayarlar. Örneğin, kapsayıcı 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ğini kullanarak, yükseltmenin doğru yolu net.core.somaxconn olabilir:

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

6
2017-07-26 13:40





Ayrıcalıklı konteyner, şu an için kendi işlem adı alanını kullanıyor. /proc. Yapabilecekleriniz gerçeği monte etmek. /proc kabın içinde:

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

3
2018-02-03 12:04



Sadece bunu denedim ve işe yaramıyor. - allingeek
Docker hakkında bildiğim kadarıyla; FreeBSD'de bir hapishane gibi kendi kendini barındıran bir örnek olması gerekiyordu, bu yüzden etrafta kolayca dolaşabiliyor, yeniden dağıtılabiliyordu, vs. ... Ana bilgisayar işletim sistemi ile dockleti karıştırmamalısınız. - DutchUncle
Ayrıcalıklı kapların kullanımı için birkaç geçerli örnek var ve bu mükemmel bir durum gibi görünüyor. Tüm kaplar aynı temeldeki çekirdeği kullanır. Standart kaplar, salt okunur olarak monte edilir. - allingeek
@allingeek CAP_NET_ADMIN gerçekten eksik bit olabilir. - Ángel
NET_ADMIN ile çalıştı 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


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

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

2
2017-08-05 22:00