Comenzaré admitiendo que soy bastante nuevo en Docker y que puedo estar abordando este problema desde el conjunto incorrecto de suposiciones... avísame si ese es el caso. He visto muchas discusiones sobre cómo Docker es útil para la implementación, pero no hay ejemplos de cómo se hace realmente.
Esta es la forma en que pensamiento funcionaría:
- cree el contenedor de datos para contener algunos datos persistentes en la máquina A
- cree el contenedor de aplicaciones que utiliza volúmenes del contenedor de datos
- realice algún trabajo, posiblemente cambiando los datos en el contenedor de datos
- detener el contenedor de aplicaciones
- confirmar y etiquetar el contenedor de datos
- enviar el contenedor de datos a un repositorio (privado)
- extraiga y ejecute la imagen del paso 6 en la máquina B
- recoger donde lo dejó en la máquina B
El paso clave aquí es el paso 5, que pensé que guardaría el estado actual (incluido el contenido del sistema de archivos). Luego, puede enviar ese estado a un repositorio y extraerlo de otro lugar, lo que le brinda un nuevo contenedor que es esencialmente idéntico al original.
Pero no parece funcionar de esa manera. Lo que encuentro es que el paso 5 no hace lo que creo que hace o el paso 7 (extraer y ejecutar la imagen) "restablece" el contenedor a su estado inicial.
He reunido un conjunto de tres imágenes y contenedores de Docker para probar esto: un contenedor de datos, un escritor que escribe una cadena aleatoria en un archivo en el contenedor de datos cada 30 segundos y un lector que simplemente echo
ingresa el valor en el archivo contenedor de datos y sale.
Contenedor de datos
Creado con
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
Creado con
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 escribe una cadena aleatoria y la fecha / hora para /datafolder/data.txt
en el contenedor de datos.
Lector
Creado con
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 "-----"
Cuando construyo y ejecuto estos contenedores, funcionan bien y funcionan de la manera que espero:
Detener y amp; Iniciar en la máquina de desarrollo:
- crear el contenedor de datos
- ejecutar el escritor
- ejecute el lector de inmediato, vea el mensaje "no hay datos aquí!" mensaje
- espera un momento
- ejecute el lector, vea la cadena aleatoria
- detener al escritor
- reinicie el escritor
- ejecute el lector, vea la misma cadena aleatoria
Pero comprometerse y empujar no hacen lo que espero:
- crear el contenedor de datos
- ejecutar el escritor
- ejecute el lector de inmediato, vea el mensaje "no hay datos aquí!" mensaje
- espera un momento
- ejecute el lector, vea la cadena aleatoria
- detener al escritor
- confirmar y etiquetar el contenedor de datos con
docker commit datatest_data myrepository:5000/datatest-data:latest
- push al repositorio
- eliminar todos los contenedores y volver a crearlos
En este punto, esperaría ejecutar el lector y ver la misma cadena aleatoria, ya que el contenedor de datos se ha confirmado, se ha enviado al repositorio y luego se ha recreado a partir de la misma imagen en el repositorio. Sin embargo, lo que realmente veo es el "no hay datos aquí!" mensaje.
¿Alguien puede explicar en qué me equivoco aquí? O, alternativamente, indíqueme un ejemplo de cómo se realiza la implementación con Docker.