Vou começar admitindo que sou muito novo no Docker e posso estar abordando esse problema a partir do conjunto errado de suposições... deixe-me saber se é esse o caso. Eu vi muita discussão sobre como o Docker é útil para implantação, mas nenhum exemplo de como isso realmente é feito.
Aqui está a maneira que eu pensamento isso funcionaria:
- crie o contêiner de dados para armazenar alguns dados persistentes na máquina A
- crie o contêiner do aplicativo que usa volumes do contêiner de dados
- faça algum trabalho, potencialmente alterando os dados no contêiner de dados
- pare o recipiente de Aplicação
- commit & amp; marcar o recipiente de dados
- empurre o contêiner de dados para um repositório (privado)
- puxe & amp; executar a imagem do Passo 6 na máquina B
- pegue onde você parou na máquina B
A etapa principal aqui é a Etapa 5, que eu pensei que salvaria o estado atual (incluindo o conteúdo do sistema de arquivos). Você poderia então empurrar esse estado para um repositório & amp; puxá-lo de outro lugar, dando-lhe um novo recipiente que é essencialmente idêntico ao original.
Mas não parece funcionar assim. O que eu acho é que a Etapa 5 não faz o que eu acho que faz ou a Etapa 7 (puxando & executando a imagem) "redefine" o contêiner para seu estado inicial.
Eu montei um conjunto de três imagens e contêineres do Docker para testar isso: um contêiner de dados, um gravador que grava uma string aleatória em um arquivo no contêiner de dados a cada 30 s e um leitor que simplesmente echo
es o valor no arquivo do contêiner de dados e sai.
Recipiente de dados
Criado com
docker run \ --name datatest_data \ -v /datafolder \ myrepository:5000/datatest-data:latest
Dockerfile:
FROM ubuntu:trusty# make the data folder#RUN mkdir /datafolder# write something to the data file#RUN echo "no data here!" > /datafolder/data.txt# expose the data folder#VOLUME /datafolder
Escritor
Criado com
docker run \ --rm \ --name datatest_write \ --volumes-from datatest_data \ myrepository:5000/datatest-write:latest
Dockerfile:
FROM ubuntu:trusty# Add script#ADD run.sh /usr/local/sbin/run.shRUN chmod 755 /usr/local/sbin/*.shCMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bashwhile :do sleep 30s NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) echo "$NEW_STRING" >> /datafolder/data.txt date >> /datafolder/data.txt echo "wrote '$NEW_STRING' to file"done
Este script grava uma string aleatória e a data/hora para /datafolder/data.txt
no contêiner de dados.
Leitor
Criado com
docker run \ --rm \ --name datatest_read \ --volumes-from datatest_data \ myrepository:5000/datatest-read:latest
Dockerfile:
FROM ubuntu:trusty# Add scriptsADD run.sh /run.shRUN chmod 0777 /run.shCMD ["/run.sh"]
run.sh:
#!/bin/bashecho "reading..."echo "-----"cat /datafolder/data.txtecho "-----"
Quando eu construir & amp; executar esses contêineres, eles funcionam bem e funcionam da maneira que eu espero:
Parar & amp; Iniciar na máquina de desenvolvimento:
- criar o contêiner de dados
- executar o escritor
- execute o leitor imediatamente, veja o " sem dados aqui!" mensagem
- espere um pouco
- execute o leitor, veja a string aleatória
- pare o escritor
- reinicie o escritor
- execute o leitor, veja a mesma string aleatória
Mas cometer & amp; empurrando não fazer o que eu espero:
- criar o contêiner de dados
- executar o escritor
- execute o leitor imediatamente, veja o " sem dados aqui!" mensagem
- espere um pouco
- execute o leitor, veja a string aleatória
- pare o escritor
- commit & amp; marcar o recipiente de dados com
docker commit datatest_data myrepository:5000/datatest-data:latest
- empurre para o repositório
- excluir todos os recipientes & amp; recriá-los
Neste ponto, eu esperaria executar o leitor & amp; ver a mesma string aleatória, uma vez que o contêiner de dados foi comprometido, empurrado para o repositório e, em seguida, recriado a partir da mesma imagem no repositório. No entanto, o que eu realmente vejo é o "sem dados aqui!" mensagem.
Alguém pode explicar onde eu estou errado aqui? Ou, alternativamente, Aponte-me para um exemplo de como a implantação é feita com o Docker?