Começarei admitindo que sou muito novato no Docker e posso estar abordando esse problema com o conjunto errado de suposições ... deixe-me saber se esse é o caso. Eu já vi muitas discussões sobre como o Docker é útil para implantação, mas não há exemplos de como isso é realmente feito.
Aqui está a maneira que eu pensei que iria funcionar:
- 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
- fazer algum trabalho, potencialmente alterando os dados no contêiner de dados
- parar o contêiner do aplicativo
- confirmar e marcar o contêiner de dados
- envie o contêiner de dados para um repositório (privado)
- puxe e execute a imagem da etapa 6 na máquina B
- retome de onde 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ê pode enviar esse estado para um repositório e retirá-lo de outro lugar, fornecendo um novo contêiner que é essencialmente idêntico ao original.
Mas isso não parece funcionar dessa maneira. O que eu acho é que a etapa 5 não faz o que eu acho que faz ou a etapa 7 (puxar e executar a imagem) "redefine" o contêiner para seu estado inicial.
Reuni um conjunto de três imagens e contêineres do Docker para testar isso: um contêiner de dados, um gravador que grava uma sequência aleatória em um arquivo no contêiner de dados a cada 30 s e um leitor que simplesmente echo
es valoriza os dados arquivo contêiner e sai.
Contêiner 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.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
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 sequência aleatória e a data / hora /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 scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
Quando crio e executo esses contêineres, eles funcionam bem e funcionam da maneira que eu espero:
Pare e inicie na máquina de desenvolvimento:
- crie o contêiner de dados
- executar o escritor
- execute o leitor imediatamente, consulte a seção "sem dados aqui!" mensagem
- espere um pouco
- execute o leitor, veja a sequência aleatória
- pare o escritor
- reinicie o escritor
- execute o leitor, veja a mesma sequência aleatória
Mas cometer e pressionar não fazem o que eu espero:
- crie o contêiner de dados
- executar o escritor
- execute o leitor imediatamente, consulte a seção "sem dados aqui!" mensagem
- espere um pouco
- execute o leitor, veja a sequência aleatória
- pare o escritor
- confirmar e marcar o contêiner de dados com
docker commit datatest_data myrepository:5000/datatest-data:latest
- enviar para o repositório
- excluir todos os contêineres e recriá-los
Nesse ponto, eu esperaria executar o leitor e ver a mesma sequência aleatória, já que o contêiner de dados foi confirmado, enviado ao repositório e depois recriado a partir da mesma imagem no repositório. No entanto, o que realmente vejo é o "sem dados aqui!" mensagem.
Alguém pode explicar onde estou errado aqui? Ou, como alternativa, aponte-me para um exemplo de como a implantação é feita com o Docker?
/bin/true
binário (ou qualquer outro) de qualquer maneiradocker rm -v
comando contra o último recipiente para também eliminar um volume)Você também pode usar um contêiner de dados da janela de encaixe para implantar código
Não sei se é uma boa prática, mas faço assim:
Agora você pode enviar sua imagem e usar volumes de, etc ...
fonte
COPY
ouADD
e criando o volume usandoVOLUME
no Dockerfile.