Comenzaré admitiendo que soy bastante nuevo en Docker y que podría estar abordando este problema desde un conjunto equivocado de suposiciones ... avíseme si ese es el caso. He visto mucha discusión 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 pensé que funcionaría:
- cree el contenedor de datos para contener algunos datos persistentes en la máquina A
- crear el contenedor de la aplicación que usa volúmenes del contenedor de datos
- hacer algo de trabajo, potencialmente cambiando los datos en el contenedor de datos
- detener el contenedor de la aplicación
- confirmar y etiquetar el contenedor de datos
- empujar el contenedor de datos a un repositorio (privado)
- tire y ejecute la imagen del paso 6 en la máquina B
- retomar donde lo dejó en la máquina B
El paso clave aquí es el paso 5, que pensé que salvaría el estado actual (incluidos los contenidos del sistema de archivos). Luego, podría llevar ese estado a un repositorio y extraerlo de otro lugar, lo que le dará 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 (al tirar 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 s, y un lector que simplemente echo
es el valor en los datos archivo contenedor y salidas.
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.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 escribe una cadena aleatoria y la fecha / hora /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 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 "-----"
Cuando construyo y ejecuto estos contenedores, funcionan bien y funcionan de la manera que espero:
Stop & Start en la máquina de desarrollo:
- crear el contenedor de datos
- corre el escritor
- ejecute el lector de inmediato, vea el mensaje "¡no hay datos aquí!" mensaje
- espera un momento
- ejecuta el lector, mira la cadena aleatoria
- detener al escritor
- reiniciar el escritor
- ejecuta el lector, ve la misma cadena aleatoria
Pero comprometerse y empujar no hacen lo que espero:
- crear el contenedor de datos
- corre el escritor
- ejecute el lector de inmediato, vea el mensaje "¡no hay datos aquí!" mensaje
- espera un momento
- ejecuta el lector, mira la cadena aleatoria
- detener al escritor
- confirmar y etiquetar el contenedor de datos con
docker commit datatest_data myrepository:5000/datatest-data:latest
- empujar al repositorio
- eliminar todos los contenedores y recrearlos
En este punto, esperaría ejecutar el lector y ver la misma cadena aleatoria, ya que el contenedor de datos se ha confirmado, enviado al repositorio y luego 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 dónde me estoy equivocando aquí? ¿O, alternativamente, señalarme un ejemplo de cómo se realiza la implementación con Docker?
/bin/true
binario (o cualquier otro) de todos modosdocker rm -v
comando en el último contenedor para eliminar también un volumen)También podría usar un contenedor de datos de Docker para implementar código
No sé si es una buena práctica, pero lo hago así:
Ahora puede empujar su imagen y usar volúmenes de, etc.
fuente
COPY
oADD
y crear el volumen usandoVOLUME
el Dockerfile.