Estou executando alguns serviços dentro dos contêineres do Docker LXC no meu servidor e estou começando a realmente fazer coisas sérias com eles.
Uma coisa que não estou claro é como as permissões de usuário funcionam dentro e fora do contêiner. Se, por exemplo, estou executando o MySQL em um contêiner e tiver seu diretório de dados definido /data
como volume do Docker, como as permissões dentro e fora do contêiner afetam as políticas de acesso?
Obviamente, a idéia é executar o MySQL como seu próprio usuário no container (ie mysql:mysql
) e conceder direitos de leitura e gravação a esse diretório. Suponho que isso seria bastante simples, apenas chmod
no diretório etc. Mas como isso funciona fora do contêiner? Agora que tenho esse volume compartilhado do Docker chamado 'dados', como faço para gerenciar o controle de acesso a ele?
Estou procurando especificamente executar um usuário sem privilégios fora do contêiner do Docker, que acessará periodicamente o volume compartilhado do MySQL e fará backup dos dados.
Como posso configurar permissões, usuários e grupos para que um usuário específico no host possa ler / gravar arquivos e pastas no volume compartilhado do Docker?
fonte
docker
suporte para isso), o contêiner LXC pode ser executado como usuário não privilegiado. Caso contrário, oroot
usuário dentro do contêiner poderá se romper se o contêiner estiver configurado inadequadamente. Ou seja, oroot
host estároot
no contêiner em um contêiner LXC privilegiado.root
A propósito, também pode executar contêineres sem privilégios . Importante é que seja definido um mapeamento para os usuários .Respostas:
Desde o lançamento do 0.9, o Docker caiu
LXC
e usa seu próprio ambiente de execuçãolibcontainer
,. Sua pergunta é um pouco antiga, mas acho que minha resposta ainda se aplica à versão que você está usando.Resposta rápida: Para entender as permissões de volumes, você pode usar a analogia de
mount --bind Host-Dir Container-Dir
. Portanto, para atender aos seus requisitos, você pode usar qualquer método tradicional para gerenciar permissões. Eu acho que o ACL é o que você precisa .Resposta longa: Assim como no seu exemplo, temos um contêiner chamado dock com um volume
/data
.Dentro do contêiner, nosso servidor MySQL foi configurado para usar o
/data
como seu diretório de dados. Portanto, temos nossos bancos de dados/data
dentro do contêiner. E fora do recipiente no sistema operacional hospedeiro, temos montado esse/data
volume a partir/usr/container/Databases/
e nós atribuir um usuário normal bob para fazer backups dos bancos de dados. Na máquina host, configuraremos as ACLs para o usuário bob .Para testá-lo, vamos fazer um backup com o usuário bob .
E o tar será listado e você poderá ver que nosso usuário conseguiu acessar todos os arquivos.
Agora, de dentro do contêiner, se você verificar
getfacl
, notará que, em vez de bob, ele mostra 3000. Isso ocorre porque o UID do bob é 3000 e não existe esse usuário no contêiner, então ele simplesmente exibe o UID que recebe dos metadados . Agora, se você criar um usuário em seu contêineruseradd -u 3000 bob
, notará que agoragetfacl
o nome é bob em vez de 3000.Resumo : Portanto, as permissões de usuário atribuídas dentro ou fora do contêiner refletem nos dois ambientes. Portanto, para gerenciar as permissões de volumes, os UIDs na máquina host devem ser diferentes dos UIDs no contêiner .
fonte
lxc-docker
, isso significa que não está usando LXC? O que precede ainda se aplica neste caso?apt-get info
pode ter os detalhes) porque no ubuntu há outro pacotedocker.io
que eu usei. Eu não uso o Ubuntu por muito tempo, já que Docker e RedHat estão de mãos dadas agora. Portanto, é melhor usar o RHEL ou o CentOS como sistema operacional base, ou você pode simplesmente usar o LXC.lxc-docker
nisso parece funcionar como planejado. Eu criei um usuário com uid de 3000, tocou em um arquivo em um volume compartilhado, e foi capaz de ver a partir do sistema operacional hospedeiro que o arquivo existia e era de propriedade de um usuário com id 3000.