Pull to refresh

Comments 7

А я namespaces юзаю «as is», из баша. Для локальных нужд хватает за глаза и за уши. Тем паче, что чаще всего нужно всего лишь mount namespace и network namespace, а всякие изоляции pid'ов и пользователей — постольку-поскольку.
А что именно дергаете, если не секрет?
Чаще всего нужно изолировать приложение по сети.

ip net create foo
ip link set netns foo dev eth3
ip net exec foo ip link set up dev eth3
ip net exec foo ip a a 192.168.2.2/24
ip net exec foo ip route add default via 192.168.2.1

Ну и вариации по вкусу.

Mount/user/pid namespaces нужны много реже, потому что большинство приложений отлично вкурсе, что не их собачье дело, под каким пользователем их запустили и какие mountpoint'ы в системе.

Так что следующее:

ip net exec foo sudo -u APP_USER /usr/bin/app

и приложение работает.

Если надо залогиниться:

ip net exec foo login -f APP_USER
А если нужна изоляция не только сети, то:
unshare — run program with some namespaces unshared from parent
nsenter — run program with namespaces of other processes
И просто мой любимый firejail
Реализация на интерпретируемом языке в любом случае проиграет скомпилированной в производительности, что, как мне кажется, довольно критично для контейнеров.
Производительность самого контейнера весьма слабо зависит от обертки. Будь она на питоне, на си или другом языке.
Если бы вы знали, как медленно современные ядра работают на большом числе интерфейсов/адресов в системе… Любой питон по сравнению со скоростью соответствующего кода на Си, работающего с правами ядра, будет просто летать.

Не верите?

for a in {{1..255}};do for b in {{1..255}}; do time ip a a 172.16.$b.$a/32 dev eth0;done;done

и любуйтесь цифрами через пол-часика. Одинокое «повесить IP на интерфейс» до 30 с доходить будет.
Sign up to leave a comment.