Вот замечательное введение в то, чем на самом деле является контейнер: https://www.slideshare.net/jpetazzo/anatomy-of-a-container-namespaces-cgroups-some-filesystem-magic-linuxcon
Контейнеры - это процессы linux, работающие в одном и том же ядре, разделенные пространствами имен и ограниченные cgroups.
Процесс внутри контейнера имеет идентификатор пользователя (UID) и идентификатор группы (GID), связанный с ним: по умолчанию UID равен 0 (что соответствует корню).
ЕслиПроцесс внутри контейнера может взаимодействовать с ресурсами вне контейнера (такими как файловая система базового хоста), тогда он будет делать это с правами доступа, связанными с UID / GID этого процесса.Таким образом, в примере, где он работает с UID 0 (root), этот процесс может получить доступ и изменить все файлы на базовом хосте, что, как правило, плохо.(Если вы используете SELinux, тогда это не так просто, но давайте не будем усложнять ситуацию).
Так что, если вы можете гарантировать, что ваш контейнерный процесс не коснется файловой системы базового хоста и что это невозможноугнан внешней системой, тогда вы вероятно ок.Но что, если ваш контейнерный процесс может вести себя странно?Может быть, это надуманный пример, но, возможно, он обращается к внешней службе, которая была подделана и которая приводит к сбою вашего процесса или изменению его поведения, так что он записывает данные в файловую систему основного хоста или порождает процесс, который прослушивает соединенияиз удаленной системы?
Кроме того, вы единственный, кто создает эти образы контейнеров?Очевидно, вы доверяете себе, но если другим разрешено создавать подобные контейнеры, доверяете ли вы им?Как, на самом деле, действительно им доверять?Ваши контейнеры могут быть в порядке, но как насчет их?Можете ли вы гарантировать, что они (злонамеренно или по ошибке) не позволят своим контейнерам получать доступ к файловой системе или ресурсам основного хоста?
Рекомендуется, чтобы ваш контейнер никогда не работал с UID 0. Естьв некоторых случаях, когда это абсолютно необходимо, а в корпоративных средах это огромный красный флаг для контейнера, который будет настроен таким образом, и очень часто ваш контейнер не будет запускаться системами безопасности компании.Если вы должны запустить контейнерный процесс с UID 0, то рассмотрите возможность использования переназначения пространства имен пользователя (описано здесь и здесь и в других местах), что является способом, которым контейнер выполняет процесс с UID0 внутри контейнера (так что процесс контейнера считает его корневым), вне контейнера процессу присваивается совершенно другой (непривилегированный) UID.