Después de evaluar las respuestas y estudiar el tema que me gustaría resumir.
La forma de Docker para actualizar contenedores parece ser la siguiente:
Los contenedores de aplicaciones no deben almacenar datos de la aplicación . De esta manera, puede reemplazar el contenedor de la aplicación con su versión más nueva en cualquier momento ejecutando algo como esto:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql
Puede almacenar datos en el host (en el directorio montado como volumen) o en contenedores especiales de solo datos . Leer más al respecto
La actualización de aplicaciones (p. Ej., Con yum / apt-get upgrade) dentro de los contenedores se considera un antipatrón . Se supone que los contenedores de aplicación son inmutables , lo que garantizará un comportamiento reproducible. Algunas imágenes de aplicaciones oficiales (mysql: 5.6 en particular) ni siquiera están diseñadas para autoactualizarse (apt-get upgrade no funcionará).
Me gustaría agradecer a todos los que dieron sus respuestas, para que pudiéramos ver todos los enfoques diferentes.
Yaroslav Stavnichiy
fuente
docker rename my-mysql-container trash-container
antes de crear el nuevo?No me gusta montar volúmenes como un enlace a un directorio de host, así que se me ocurrió un patrón para actualizar los contenedores acoplables con contenedores administrados por completo. La creación de un nuevo contenedor de Docker
--volumes-from <container>
le dará al nuevo contenedor con las imágenes actualizadas la propiedad compartida de los volúmenes administrados de Docker.Al no eliminar inmediatamente el original
my_mysql_container
todavía, tiene la capacidad de volver al contenedor de trabajo conocido si el contenedor actualizado no tiene los datos correctos o falla una prueba de cordura.En este punto, generalmente ejecutaré las secuencias de comandos de respaldo que tenga para que el contenedor tenga una red de seguridad en caso de que algo salga mal
Ahora tiene la oportunidad de asegurarse de que los datos que espera que estén en el nuevo contenedor estén allí y realice una verificación de integridad.
Los volúmenes de la ventana acoplable se mantendrán mientras los utilice cualquier contenedor, de modo que pueda eliminar el contenedor original de forma segura. Una vez que se retira el contenedor original, el nuevo contenedor puede asumir el mismo nombre del original para hacer que todo sea tan bonito como era para comenzar.
Existen dos ventajas principales al usar este patrón para actualizar los contenedores acoplables. En primer lugar, elimina la necesidad de montar volúmenes en directorios de host al permitir que los volúmenes se transfieran directamente a contenedores actualizados. En segundo lugar, nunca está en una posición donde no haya un contenedor acoplable que funcione; así que si la actualización falla, puede volver fácilmente a cómo funcionaba antes girando nuevamente el contenedor acoplable original.
fuente
./postgres-data/:/var/lib/postgres/data
- es decir, he montado el directorio host./postgres-data/
, dentro de mi contenedor PostgreSQL.)Solo por proporcionar una respuesta más general (no específica de MySQL) ...
Sincronice con el registro de imágenes de servicio ( https://docs.docker.com/compose/compose-file/#image ):
Recree el contenedor si la imagen o el archivo docker-compose han cambiado:
La administración de imágenes de contenedor es una de las razones para usar docker-compose (consulte https://docs.docker.com/compose/reference/up/ )
El aspecto de gestión de datos también está cubierto por docker-compose a través de "volúmenes" externos montados (consulte https://docs.docker.com/compose/compose-file/#volumes ) o contenedor de datos.
Esto deja intactos los posibles problemas de compatibilidad con versiones anteriores y migración de datos, pero estos son problemas "aplicativos", no específicos de Docker, que deben verificarse con las notas y pruebas de la versión ...
fuente
Me gustaría agregar que si desea realizar este proceso automáticamente (descargar, detener y reiniciar un nuevo contenedor con la misma configuración descrita por @Yaroslav) puede usar WatchTower. Un programa que actualiza automáticamente sus contenedores cuando se cambian https://github.com/v2tec/watchtower
fuente
Considere para estas respuestas:
app_schema
app_db
root123
Cómo actualizar MySQL al almacenar datos de la aplicación dentro del contenedor
Esto se considera una mala práctica , porque si pierde el contenedor, perderá los datos. Aunque es una mala práctica, aquí hay una posible forma de hacerlo:
1) Realice un volcado de la base de datos como SQL:
2) Actualiza la imagen:
3) Actualice el contenedor:
4) Restaurar el volcado de la base de datos:
Cómo actualizar el contenedor MySQL usando un volumen externo
Usar un volumen externo es una mejor manera de administrar los datos y facilita la actualización de MySQL. Perder el contenedor no perderá ningún dato. Puede usar docker-compose para facilitar la administración de aplicaciones Docker de contenedores múltiples en un solo host:
1) Cree el
docker-compose.yml
archivo para administrar sus aplicaciones:2) Actualice MySQL (desde la misma carpeta que el
docker-compose.yml
archivo):Nota: el último comando anterior actualizará la imagen MySQL, recreará e iniciará el contenedor con la nueva imagen.
fuente
docker-compose
, ¿funcionará esto? stackoverflow.com/a/31485685/65313volumes_from
La clave ahora está en desuso (incluso eliminada en la versión 3 del archivo de redacción) a favor de la nuevavolumes
clave.docker pull image_uri:tag && docker restart container_running_that_image
trabajó para mi. No hay necesidad dedocker-compose pull && docker-compose up -d
.Respuesta similar a la anterior
fuente
Esto es lo que parece usar
docker-compose
al crear una costumbreDockerfile
.docker build -t imagename:version .
Esto almacenará su nueva versión localmente.docker-compose down
docker-compose.yml
archivo para reflejar el nuevo nombre de imagen que configuró en el paso 1.docker-compose up -d
. Buscará localmente la imagen y usará la imagen actualizada.-EDITAR-
Mis pasos anteriores son más detallados de lo que deben ser. He optimizado mi flujo de trabajo al incluir el
build: .
parámetro en mi archivo docker-compose. Los pasos se ven esto ahora:docker-compose build
docker-compose up -d
No me di cuenta en ese momento, pero Docker-compose es lo suficientemente inteligente como para simplemente actualizar mi contenedor a la nueva imagen con el comando único, en lugar de tener que bajarlo primero.
fuente
docker-compose up -d
sin necesidad de detener todo primero.Si no desea utilizar Docker Compose, puedo recomendarle un portainer . Tiene una función de recreación que le permite recrear un contenedor mientras extrae la última imagen.
fuente
Debe reconstruir todas las imágenes y reiniciar todos los contenedores, o de alguna manera actualizar el software y reiniciar la base de datos. No hay una ruta de actualización sino que la diseñe usted mismo.
fuente
docker restart
comando, pero no estoy seguro de que recoja los cambios de imagen. ¿Y qué pasa con mis datos dentro de los contenedores?Tomado de http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
Puede actualizar todas sus imágenes existentes utilizando la siguiente tubería de comando:
fuente
Asegúrese de estar utilizando volúmenes para todos los datos persistentes (configuración, registros o datos de la aplicación) que almacena en los contenedores relacionados con el estado de los procesos dentro de ese contenedor. Actualice su Dockerfile y reconstruya la imagen con los cambios que desea, y reinicie los contenedores con sus volúmenes montados en su lugar apropiado.
fuente
Esto es algo con lo que también he estado luchando por mis propias imágenes. Tengo un entorno de servidor desde el que creo una imagen Docker. Cuando actualizo el servidor, me gustaría que todos los usuarios que ejecutan contenedores basados en mi imagen de Docker puedan actualizar al último servidor.
Idealmente, preferiría generar una nueva versión de la imagen de Docker y que todos los contenedores basados en una versión anterior de esa imagen se actualicen automáticamente a la nueva imagen "en su lugar". Pero este mecanismo no parece existir.
Entonces, el siguiente mejor diseño que he podido encontrar hasta ahora es proporcionar una forma de actualizar el contenedor en sí, de forma similar a cómo una aplicación de escritorio busca actualizaciones y luego se actualiza a sí misma. En mi caso, esto probablemente significará crear un script que involucre Git extrae de una etiqueta conocida.
La imagen / contenedor en realidad no cambia, pero las "partes internas" de ese contenedor cambian. Podrías imaginar hacer lo mismo con apt-get, yum o lo que sea apropiado para tu entorno. Junto con esto, actualizaría myserver: última imagen en el registro para que cualquier contenedor nuevo se base en la última imagen.
Me interesaría saber si existe alguna técnica anterior que aborde este escenario.
fuente
Actualizar
Esto es principalmente para consultar el contenedor para que no se actualice, ya que construir imágenes es la forma de hacerlo
Tuve el mismo problema, así que creé docker-run , una herramienta de línea de comandos muy simple que se ejecuta dentro de un contenedor de docker para actualizar paquetes en otros contenedores en ejecución.
Utiliza docker-py para comunicarse con contenedores de docker en ejecución y actualizar paquetes o ejecutar cualquier comando único arbitrario
Ejemplos:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
de forma predeterminada, esto ejecutará el
date
comando en todos los contenedores en ejecución y devolverá resultados, pero puede emitir cualquier comando, por ejemplodocker-run exec "uname -a"
Para actualizar paquetes (actualmente solo usa apt-get):
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update
Puede crear un alias y usarlo como una línea de comando normal, por ejemplo
alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'
fuente
apt update; apt upgrade
, la imagen crecerá).