GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo usar Docker Commit para cambiar imágenes de contenedores

Un sello distintivo de los contenedores Docker es la inmutabilidad. En cualquier momento, puede destruir y volver a crear contenedores para restablecer el estado inicial. Usando el docker commit comando, puede realizar nuevos cambios en una imagen de contenedor, pero no es tan sencillo como cabría esperar.

Exploremos cómo confirmar cambios en una nueva imagen de contenedor con docker commit ¡comando!

Cuándo confirmar cambios en una nueva imagen de contenedor

Los contenedores están diseñados para ser inmutables (no modificados), entonces, ¿por qué querría realizar cambios en un contenedor? Hay algunas razones.

  • Durante el desarrollo de un nuevo servicio en contenedores para probar rápidamente los cambios.
  • Realice una corrección rápida de errores de un servicio de producción sin necesidad de corregir primero la imagen de origen.
  • Usar commit para capturar una imagen y exportar la imagen a un nuevo servidor.

Aunque es posible que estos no cubran todos los escenarios potenciales, estos son algunos que hacen que usar docker commit un caso de uso perfecto.

Enviar cambios a una imagen simple

Para un comando aparentemente simple, este comando hace mucho.

A continuación se muestra un ejemplo simple commit dominio. Usando una ID de contenedor en ejecución, d3fdd3517e0a en este ejemplo, se crea una nueva imagen en un repositorio llamado myrepository y llamado changedimage .

La imagen original está etiquetada como version2 , que no es necesario, pero es útil para realizar un seguimiento de los cambios entre imágenes con nombres similares.

Ambos myrepository y changedimage se eligen arbitrariamente, pero normalmente reflejan recursos etiquetados correctamente, como customimages/alpine-linux .

docker commit d3fdd3517e0a myrepository/changedimage:version2

Los contenedores Docker son una serie de imágenes de solo lectura con una capa de lectura y escritura en la parte superior. En el ejemplo anterior, Docker detiene el contenedor en ejecución. Esta pausa es para evitar la corrupción accidental de datos mientras Docker crea la imagen

Dado que esta pausa podría causar interrupciones en el servicio, puede usar --pause=false . Esto podría dañar los datos, ya que es posible que las escrituras no se completen correctamente.

Además, el commit La operación omite los datos contenidos en los volúmenes montados dentro del contenedor. Dado que los volúmenes no forman parte del sistema de archivos en sí del contenedor, Docker los ignora.

Una vez que se completa la operación de confirmación, Docker crea una nueva capa con los cambios de la imagen original bajo el nuevo nombre de la imagen del contenedor.

Requisitos

El único requisito previo en este tutorial es el propio Docker. Esto se puede instalar a través del software Docker Desktop en Windows o se puede instalar a través de un paquete en Linux.

Relacionado:Implementación de su primer contenedor Docker en Windows

Commiting Changes to a New Docker Container Image

Veamos ahora algunos escenarios comunes en los que docker commit el comando puede ser útil para.

Primero, extraiga una imagen de contenedor Alpine Linux del repositorio público de Docker. Alpine es conocido por sus contenedores delgados, como lo indica el tamaño de ~5 MB.

# Pull the latest Alpine Linux image
docker pull alpine
# List all Docker images
docker images

Desarrollo y pruebas de contenedores

El caso de uso principal para docker commit es el desarrollo de una nueva imagen de contenedor. Esta imagen se puede utilizar en última instancia como base para otras imágenes o como el propio contenedor de producción.

En el siguiente fragmento de código, Docker es:

  • Ejecutar el alpine extraído anteriormente imagen
  • Abrir un shell interactivo para instalar un paquete
  • Instalación del paquete htop
# Open an interactive shell to the Docker Alpine Linux container
docker run -it a24bb4013296 bin/sh
# Install the HTOP package
apk add htop

Puede ver a continuación que el paquete está correctamente instalado en el contenedor ejecutando htop comando.

Una vez que haya instalado el paquete en la nueva "capa", ahora debe confirmar ese cambio en la imagen base original. Para hacer eso:

  • Ejecute docker ps -a para localizar el ID del contenedor.
  • Usando el ID del contenedor, confirme el contenido de la capa actual en una nueva imagen base.

En el siguiente ejemplo, la nueva imagen se llama alpine-htop y etiquetada version1 . La imagen está etiquetada para facilitar el seguimiento de las versiones de imágenes de la ventana acoplable que tienen nombres similares.

# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the layer to a new image named alpine-htop and tagged version1
docker commit b57e066d5bfa alpine-htop:version1
# List all images available
docker images

Corrección de errores en imágenes de producción

A menudo puede tener un servicio de producción que tiene algún error. Puede haber una solución conocida y podría aplicar una solución más rápido que modificar las configuraciones existentes y volver a implementar. Usando docker commit , puede aplicar rápidamente la corrección y luego trabajar en segundo plano para actualizar los demás componentes necesarios.

Este fragmento de código de ejemplo a continuación demuestra la instalación de NGINX en una imagen de Alpine Linux Docker.

# First List the available images
docker images
# Run an interactive session for the alpine-htop image
docker run -it a24bb4013296 bin/sh
# Install the NGINX package
apk add nginx
# Create the location for the NGINX PID file
mkdir /run/nginx
# Verify that NGINX is installed
nginx -v
# Run NGINX
/usr/sbin/nginx
# Verify that NGINX is properly running
ps | grep nginx
# Kill the NGINX process
kill 18
# Verify that the NGINX process is no longer active
ps | grep nginx

Confirme el nuevo contenedor NGINX creado anteriormente en una nueva imagen llamada alpine-nginx y con la etiqueta, version1 . Etiquetar la imagen es una práctica recomendada para ayudar a diferenciar las diferentes versiones de la misma imagen.

# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the changes to a new image named alpine-nginx
docker commit 37043139525c alpine-nginx:version1
# Verify that the new image was created
docker images

No todos los ejecutables podrán ejecutarse en segundo plano, y NGINX no es diferente. Para ejecutar correctamente este contenedor, con NGINX ejecutándose en segundo plano, pase -g 'daemon off;' opción a NGINX.

# Run the NGINX container in the background
docker run -d f6b46a3b76be /usr/sbin/nginx -g 'daemon off;'
# Verify that the container is running
docker ps -a

Finalmente, use el --change cambiar para exponer el puerto 80. Al utilizar el --change parámetro, el EXPOSE 80 El comando se escribirá en el DockerFile del contenedor. Una vez realizado este cambio, inicie el nuevo contenedor. Una vez que se haya iniciado el nuevo contenedor, proceda a detener el contenedor anterior que se ejecutó incorrectamente sin el puerto expuesto. Esto ayudará a hacer una transición elegante del contenedor que no funciona al contenedor que funciona.

# List all running containers
docker ps -a
# Commit the changes to a new image with an exposed port 80
docker commit --change "EXPOSE 80" c649c813d985 alpine-nginx:version2
# List the running containres
docker ps -a
# List all Docker images
docker images
# Run the newly created image
docker run -d c71f0f9cef7b /usr/sbin/nginx -g 'daemon off;'
# List running containers
docker ps -a
# Stop the prior container without the exposed port 80
docker stop c649c813d985
# List running containers
docker ps -a

Captura de una imagen de Docker

Finalmente, ¿qué pasa con un escenario en el que puede necesitar una instantánea, una imagen de un momento dado, de un contenedor en ejecución para mover el contenedor a un nuevo servidor? El docker commit El comando funciona bien para hacer eso, como puede ver a continuación.

Los siguientes comandos crean un contenedor en ejecución que detendremos y confirmaremos con un nuevo alpine-nginx versión.

# List running Docker containers
docker ps -a
# Create a new running Docker NGINX container
docker run -d c71f0f9cef7b
# List running Docker containers
docker ps -a
# Stop the Docker container
docker stop 7ff99f2bcf6b
# Create a new alpine-nginx version to export
docker commit 7ff99f2bcf6b alpine-nginx:version3
# List the Docker images available
docker images

Exporte la imagen de Docker a un archivo. En este ejemplo, el archivo de exportación se llama export.tar , pero asigne un nombre al archivo según sus necesidades. Finalmente, importe el export.tar archivo de nuevo en Docker, lo que demuestra el proceso de extremo a extremo.

Asegúrese de exportar usando el formato repo:tag si desea que se mantengan esas etiquetas al volver a importar la imagen.

# Save the image to a file on the local disk
docker save -o export.tar alpine-nginx:version3
# Verify that the image exists
ls
# Remove the just exported Docker image
docker rmi 39ca9e64828a
# List Docker images and verify that the image is removed
docker images
# Load the Docker image back in
docker load -i export.tar
# List Docker images and show that the image has been loaded back in
docker images

Opciones adicionales para el comando de confirmación de Docker

Aprovechando las opciones adicionales disponibles para el commit comando, se admiten muchos escenarios diferentes.

Pausa del Contenedor

Para no pausar el contenedor mientras se está ejecutando, puede pasar --pause=false Comando para deshabilitar la función de pausa. Esto se usa a menudo cuando se realiza una copia de seguridad de un servicio de producción y pausar ese servicio sería perjudicial.

El comando de pausa también tiene una abreviatura de -p que puede ser más rápido de usar. Sin embargo, tenga en cuenta que al omitir la pausa del contenedor, corre el riesgo de dañar los datos, si se produce una escritura en el sistema de archivos, lo que podría causar que se escriban datos incompletos o corruptos.

Dejar un mensaje de confirmación

Familiar para muchos desarrolladores es el de proporcionar un mensaje de compromiso correcto. Al igual que al usar el control de código fuente, lo ideal es enviar un mensaje útil que explique por qué se comprometió una nueva versión del contenedor.

Esto se puede hacer usando --message="message to commit" dominio. Como antes, hay una versión abreviada de este comando, -m . Para ver la lista de mensajes de confirmación de Docker, use el docker history comando.

Definición del autor

Para indicar correctamente quién está creando el cambio, puede proporcionar un valor de autor que proporcione un contexto adicional sobre quién está realizando el cambio. Esto se puede usar a través de --author="Jane Author ([email protected])" . Este comando también se puede usar a través de la abreviatura de -a . Usando docker inspect podrá recuperar una lista JSON de información del contenedor, incluidas etiquetas como autor.

Aplicación de cambios de DockerFile en paralelo

Finalmente, el comando más complicado que se puede usar en el docker commit el comando es change parámetro. Este parámetro aplica cambios en el contenedor al DockerFile al mismo tiempo que la confirmación.

Puedes usar el change parámetro pasando instrucciones al Dockerfile así, --change="ENV TEST true" . Este comando pone el texto, ENV TEST true en el DockerFile. Ahora, cuando el contenedor comience de nuevo, los cambios que designe aquí ya estarán aplicados.

En lugar de --change nombre, puede tomar un atajo y usar -c alias.

Con este comando, también puede encadenar múltiples --change parámetros juntos. Esto le permite agregar fácilmente múltiples cambios a un DockerFile en un comando de confirmación.

Opciones de cambio de parámetro

Solo puede usar algunos comandos con el change parámetro como se muestra a continuación.

  • CMD – La instrucción CMD toma la forma de CMD ["executable","parameter1","parameter2"] . Este es el método preferido, pero tenga en cuenta que solo un CMD puede existir en un DockerFile a la vez. El último CMD será la que surta efecto. El propósito principal de CMD es proporcionar comandos de ejecución predeterminados para un contenedor en el momento de la creación.
  • ENTRYPOINT – Similar al comando CMD, ENTRYPOINT usa la sintaxis de ENTRYPOINT ["executable","parameter1","parameter2"] . Esta sintaxis plantea la pregunta de por qué usar ENTRYPOINT sobre CMD.

    El comando ENTRYPOINT ejecuta un ejecutable como el proceso principal de PID 1 . Esta acción le permite cerrar el proceso usando docker stop graciosamente. Además, puede usar CMD con esto dejando fuera el executable porción que pasa esos parámetros al ENTRYPOINT ejecutable.
  • ENV – Dado que la mayoría de las aplicaciones consumen variables ambientales, el comando ENV le permite configurarlas simplemente en el formato clave-valor de ENV key=value . Acceda a estas variables clave=valor como variables ambientales estándar de Linux.
  • EXPOSE – El comando EXPOSE expone un puerto y un protocolo opcional fuera del contenedor. Este comando asigna puertos dentro del contenedor al exterior del contenedor y permite que los contenedores interactúen con recursos externos, como un servidor web que sirve contenido.
  • LABEL – El comando LABEL agrega metadatos a un contenedor. Puede agregar metadatos usando el formato, LABEL version="2.0" para ver los metadatos adicionales, use el comando de inspección de imagen acoplable.
  • ONBUILD – El comando ONBUILD agrega una instrucción para ejecutar más tarde cuando la imagen se usa como base para la construcción de otro contenedor. Este parámetro usa los comandos ADD y RUN para agregar contenido con el comando ADD o RUN un ejecutable.
  • USER -El comando USER establece el nombre de usuario (o UID) y, opcionalmente, el grupo de usuarios (o GID) que se utilizará al ejecutar la imagen. Esto se parece a USER myuser:mygroup en la práctica.
  • VOLUMEN:con la mayoría de los contenedores, es necesario acceder a los datos de alguna manera. El comando VOLUMEN creará un punto de montaje con un nombre específico que marca que contiene un volumen montado externamente. Esto se usa comúnmente así, VOLUME ["/data"] .
  • WORKDIR – Finalmente, el comando WORKDIR establece el directorio de trabajo de los comandos CMD o ENTRYPOINT. Esto se usa así, WORKDIR /path/to/directory . WORKDIR es útil cuando necesita iniciar un ejecutable pero la ubicación no está en la variable ambiental predeterminada PATH.

Conclusión

El docker commit comando es sorprendentemente complejo. Aunque hay una sintaxis simple, con la capacidad de agregar cambios de DockerFile mientras usa el comando de confirmación, puede realizar cambios rápidamente que persisten en la próxima creación del contenedor a través de DockerFile.

Es posible que este comando no sea necesario para todas las situaciones, pero para una resolución rápida de problemas y para capturar contenedores que se pueden mover fácilmente entre servidores, ¡el comando commit se vuelve muy útil rápidamente!


Docker
  1. Cómo mover imágenes de Docker entre hosts

  2. Cómo usar un Dockerfile para crear una imagen de Docker

  3. Cómo compartir imágenes de Docker con otros

  4. Cómo confirmar cambios en una imagen de Docker

  5. Cómo crear una imagen personalizada desde un contenedor Docker

Cómo usar Docker Scan para encontrar vulnerabilidades en sus imágenes

Cómo inspeccionar el contenido de una imagen Docker sin iniciar un contenedor

Cómo crear una imagen de Docker desde un contenedor en ejecución

Cómo usar Docker Guardar imagen y exportar para compartir

Cómo actualizar las imágenes de Docker a la última versión

Cómo listar/buscar/extraer imágenes de la ventana acoplable en Linux