Я запускаю некоторые сервисы внутри контейнеров Docker LXC на моем сервере, и я начинаю делать с ними серьезные вещи.
Одна вещь, которая мне не ясна - это то, как пользовательские разрешения работают внутри и снаружи контейнера. Если, например, я запускаю MySQL в контейнере и для его каталога данных установлено значение /data
, то есть том Docker, как разрешения внутри и снаружи контейнера влияют на политики доступа?
Очевидно, что идея состоит в том, чтобы запустить MySQL как своего собственного пользователя в контейнере (т.е. mysql:mysql
) и дать ему права на чтение и запись в этот каталог. Я предполагаю, что это было бы довольно просто, просто с chmod
помощью каталога и т. Д. Но как это работает вне контейнера? Теперь, когда у меня есть общий том Docker под названием «данные», как мне управлять доступом к нему?
Я специально ищу возможность запустить непривилегированного пользователя вне контейнера Docker, который будет периодически получать доступ к общему объему MySQL и делать резервные копии данных.
Как настроить разрешения, пользователей и группы, чтобы конкретный пользователь на хосте мог читать / записывать файлы и папки на общем томе Docker?
источник
docker
поддерживается) контейнер LXC можно запускать как непривилегированный пользователь. В противном случаеroot
пользователь внутри контейнера может вырваться наружу, если контейнер неправильно настроен. Т.е.root
на хосте находитсяroot
в контейнере в привилегированном контейнере LXC.root
Кстати, можно также запускать непривилегированные контейнеры . Важно то, что сопоставление для пользователей определено.Ответы:
С момента выхода 0.9 Docker прекратил работу
LXC
и использует собственную среду исполненияlibcontainer
. Ваш вопрос немного устарел, но я думаю, что мой ответ по-прежнему относится к версии, которую вы используетеБыстрый ответ: Чтобы понять разрешения томов, вы можете взять аналогию
mount --bind Host-Dir Container-Dir
. Таким образом, для выполнения ваших требований вы можете использовать любые традиционные методы управления разрешениями. Я думаю, ACL - это то, что вам нужно .Длинный ответ: Как и в вашем примере, у нас есть контейнер с именем dock и томом
/data
.Внутри контейнера наш сервер MySQL был настроен для использования в
/data
качестве своего каталога данных. Таким образом, у нас есть наши базы данных/data
внутри контейнера. За пределами контейнера в ОС хоста мы смонтировали этот/data
том с/usr/container/Databases/
и назначаем обычного пользователя bob для создания резервных копий баз данных. С хост-машины мы настроим ACL для пользователя bob .Чтобы проверить это, давайте сделаем резервную копию с пользователем bob .
И tar выдаст список, и вы увидите, что наш пользователь смог получить доступ ко всем файлам.
Теперь изнутри контейнера, если вы проверите с ним,
getfacl
вы заметите, что вместо bob он показывает 3000. Это потому, что UID bob равен 3000 и такого пользователя в контейнере нет, поэтому он просто отображает UID, который он получает из метаданных , Теперь, если вы создадите пользователя в своем контейнере,useradd -u 3000 bob
вы заметите, что теперьgetfacl
отображается имя bob вместо 3000.Сводка . Таким образом, пользовательские разрешения, которые вы назначаете изнутри или снаружи контейнера, отражают обе среды. Поэтому для управления разрешениями томов идентификаторы UID на хост-компьютере должны отличаться от идентификаторов UID в контейнере .
источник
lxc-docker
, означает ли это, что он не использует LXC? Вышесказанное все еще применимо в этом случае?apt-get info
может иметь детали), потому что в Ubuntu есть еще один пакет,docker.io
который я использовал. Я долго не работал с Ubuntu, так как Docker и RedHat теперь взялись за руки. Поэтому лучше использовать RHEL или CentOS в качестве базовой ОС, иначе вы можете просто использовать LXC.lxc-docker
этом, кажется, работает как запланировано. Я создал пользователя с uid 3000, прикоснулся к файлу на общем томе и смог увидеть из операционной системы хоста, что файл существует и принадлежит пользователю с идентификатором 3000.