Por que a docker-machine limpa os dados na reinicialização?

9

Estou usando o Docker Toolbox no OSX.

Criei um contêiner de volume de dados para armazenar dados persistentes: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Eu verifiquei se esses dados estão realmente armazenados na VM boot2docker (criada pela docker-machine) e não no contêiner, para que eles persistam. No entanto, o "docker-machine restart" limpa esses dados personalizados na vm.

Não consigo encontrar documentação sobre o que está acontecendo. Eu encontrei uma postagem no fórum mencionando que os dados em / var / lib / docker serão preservados, mas não consegui encontrar documentos oficiais afirmando isso e também parece estranho, considerando que o guia de armazenamento persistente acima não usa esse caminho ou até menciona que seus dados serão excluídos.

Isso é esperado e, se houver, existe alguma documentação oficial sobre o caminho correto para armazenar dados persistentes?


Edit: Adicionando exemplo de falha no senario

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory
Gerry
fonte

Respostas:

8

Definitivamente, isso deve funcionar:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Você pode elaborar mais sobre as etapas para reproduzir seu problema?

O boot2docker possui um sistema de arquivos somente leitura (será apagado na reinicialização) com a exceção de:

  1. Contêineres e seus dados (volumes) - é sobre isso que você lê /var/lib/docker
  2. Imagens do Docker
  3. Configuração do Docker (por exemplo, /var/lib/boot2docker/profileonde os sinalizadores daemon podem ser ajustados)
nathanleclaire
fonte
Olá, acabei de sugerir uma edição para sua resposta. Você quis especificar a imagem do busybox nos comandos 2º e 3º de execução? Sem isso, o docker tenta fazer o download de imagens chamadas "sh" e "cat", que eu suspeito que não sejam o que você pretendia. Vou adicionar um exemplo falho acima.
Gerry
Obrigado pela ajuda. Você e @ mc0e ajudaram com este, então eu lhe dei o tick e ele a recompensa (assim como um +1 para ambos). Espero que você considere isso justo.
Gerry
1
Ah sim, digitado incorretamente. Desculpe pelo erro de digitação.
Nathanleclaire 22/09/2015
Não é necessário desculpas. Eu estava apenas checando duas vezes para ter certeza de que não tinha entendido mal. Felicidades por toda a sua ajuda com isso.
Gerry
6

Eu não uso o boot2docker, mas se / data for apagado na reinicialização, é onde o seu volume está sendo armazenado ( docker run -v /data:/var/lib/mysql), para que seja perdido.

O que você está fazendo também está combinando dois padrões diferentes para lidar com a persistência de volume. Para obter persistência, os contêineres podem montar volumes a partir de um local especificado no sistema host (que presume-se persistente) ou podem ser associados a um contêiner de dados e montados --volumes-from. Parece que a abordagem do sistema de arquivos host não é apropriada para o boot2docker e você deve usar o padrão de volume de dados (apenas).

Presumivelmente, você deve criar seu contêiner de dados em -v /var/lib/mysqlvez de -v /data:/var/lib/mysql.

mc0e
fonte
Criar um volume usando o sinalizador -v e, em seguida, usar volumes desse contêiner em outros contêineres usando --volumes-from é exatamente o que mostra a documentação: docs.docker.com/userguide/dockervolumes/… Eu esperaria que se -v / location sabe que deve ser relativo a / var / lib / docker / volumes, então adicionar dois pontos não deve mudar isso. No mínimo, isso não é intuitivo. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Também parece que os documentos do mysql-docker devem ser atualizados: hub.docker.com/_/mysql/#caveats
Gerry
Obrigado pela ajuda. Você e o @nathanleclaire ajudaram com esse, então eu dei a você a recompensa (pois vale mais) e dei o visto a nathanleclaire (além de um +1 para ambos). Espero que você ache isso justo.
Gerry
@Gerry Certamente é recomendável criar um volume e depois usá-lo via --volumes-from. Montar os dados efêmeros / no seu contêiner não é.
Mc0e 19/09/2015
Sim, o problema é que eu não sabia / os dados eram efêmeros até reiniciar.
Gerry
0

Observe que estou usando o docker para mac beta, que está usando o xhyve vm.

O conteúdo de / var / lib / boot2docker será mantido entre as reinicializações da máquina. Portanto, se você deseja que certos arquivos estejam disponíveis no seu vm, coloque-os neste diretório.

Se você quiser que eles estejam acessíveis em um local diferente para executar contêineres de docker, adicione o seguinte a / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Se você deseja adicionar outra configuração aos arquivos do sistema que persistirão entre as reinicializações da vm, como valores extras no arquivo hosts, adicione um comando como o abaixo a / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Espero que ajude

baoluofu
fonte