Рекомендація випливає з мети та розробки віртуалізації на рівні Операційної системи
Контейнери були розроблені для того, щоб ізолювати процес для інших, надаючи йому власний простір користувачів та файлову систему.
Це логічна еволюція, chroot
яка передбачала надання ізольованої файлової системи, наступним кроком було виділення процесів від інших, щоб уникнути перезапису пам'яті та дозволяти використовувати один і той же ресурс (наприклад, порт 8080 TCP) з декількох процесів без конфліктів.
Основний інтерес контейнера - це упакувати необхідну бібліотеку для процесу, не турбуючись про конфлікти версій. Якщо ви запускаєте декілька процесів, які потребують двох версій однієї бібліотеки в одній і тій же просторі користувачів і файлової системи, вам доведеться налаштувати принаймні LDPATH для кожного процесу, щоб спочатку була знайдена належна бібліотека, і деякі бібліотеки не можна підкоригувати таким чином, оскільки їх шлях важко закодований у виконуваному файлі під час компіляції, дивіться це запитання щодо більш детальної інформації.
На рівні мережі вам доведеться налаштувати кожен процес, щоб уникнути використання одних і тих же портів.
Запуск декількох процесів в одному контейнері вимагає серйозних налаштувань і в кінці дня перемогти мету ізоляції, якщо ви добре запускаєте кілька процесів в одному і тому ж просторі користувачів, обмінюючись одним файлом та мережевими ресурсами, то чому б не запустити їх на самого господаря?
Ось не вичерпний список важких налаштувань / підводних каменів, про які я можу придумати:
Обробка колод
Будь то з встановленим томом або переплетеним на stdout це приносить деяке управління. Якщо ви використовуєте змонтований об'єм, ваш контейнер повинен мати власне "місце" на хості або два ж контейнери будуть боротися за один і той же ресурс. Якщо переплутати stdout, щоб скористатися ним, docker logs
це може стати кошмаром для аналізу, якщо джерела неможливо легко визначити.
Остерігайтеся зомбі-процесів
Якщо один із ваших процесів в результаті аварії контейнера, контрольний орган може не мати змоги очистити дітей у стані зомбі, і хост init ніколи їх не успадкує. Після того, як ви вичерпали кількість доступних підручників (2 ^ 22, тобто приблизно 4 мільйони), купу речей не вдасться.
Розділення проблем
Якщо ви запускаєте дві окремі речі, наприклад, сервер apache та logstash в одному контейнері, це може полегшити обробку журналу, але вам доведеться вимкнути apache, щоб оновити logstash. (Насправді вам слід скористатися драйвером реєстрації Docker) Чи буде це витончена зупинка очікування завершення поточних сеансів чи ні? Якщо це витончена зупинка, може знадобитися колись і довго запустити нову версію. Якщо ви робите вбивство, ви впливатимете на користувачів вантажовідправника, чого слід уникати IMHO.
Нарешті, коли у вас є кілька процесів, ви відтворюєте ОС, і в цьому випадку використання апаратної віртуалізації звучить більше відповідно до цієї потреби.