Cómo usar el comando docker compose create para construir y crear contenedores

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a utilizar eficazmente el comando docker compose create para construir y crear contenedores basados en un archivo docker-compose.yml. Comenzaremos preparando un archivo docker-compose.yml sencillo, incluyendo los pasos necesarios para instalar Docker Compose en el entorno de LabEx.

Después de la configuración, explorarás el uso básico de docker compose create y luego profundizarás en sus diversas opciones. Esto incluye forzar la recreación de contenedores con --force-recreate, crear contenedores sin reconstruir imágenes usando --no-build, y asegurar que se descarguen las imágenes más recientes con --pull always. Al finalizar este laboratorio, tendrás un sólido entendimiento de cómo aprovechar docker compose create para gestionar tus aplicaciones multi-contenedor.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555076{{"Cómo usar el comando docker compose create para construir y crear contenedores"}} docker/ps -.-> lab-555076{{"Cómo usar el comando docker compose create para construir y crear contenedores"}} docker/rm -.-> lab-555076{{"Cómo usar el comando docker compose create para construir y crear contenedores"}} docker/create -.-> lab-555076{{"Cómo usar el comando docker compose create para construir y crear contenedores"}} docker/pull -.-> lab-555076{{"Cómo usar el comando docker compose create para construir y crear contenedores"}} end

Preparar un archivo docker-compose.yml simple

En este paso, prepararemos un archivo docker-compose.yml simple. Antes de comenzar, instalemos Docker Compose. Dado que el entorno de LabEx VM no tiene Docker Compose preinstalado, necesitamos instalarlo manualmente. Descargaremos el binario de Docker Compose y lo haremos ejecutable.

Primero, descarga el binario de Docker Compose usando curl. Descargaremos la versión 1.29.2, que es compatible con la versión instalada de Docker.

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Este comando descarga el binario de Docker Compose desde la página oficial de releases de GitHub y lo guarda en /usr/local/bin/docker-compose. Las partes $(uname -s) y $(uname -m) detectan automáticamente tu sistema operativo y arquitectura, asegurando que descargues el binario correcto.

A continuación, necesitamos hacer que el binario descargado sea ejecutable.

sudo chmod +x /usr/local/bin/docker-compose

Este comando agrega permisos de ejecución al archivo docker-compose, permitiéndote ejecutarlo como un comando.

Ahora, verifiquemos que Docker Compose esté instalado correctamente comprobando su versión.

docker-compose --version

Deberías ver una salida similar a docker-compose version 1.29.2, build 5becea4c. Esto confirma que Docker Compose está instalado y listo para usar.

Ahora, creemos un archivo docker-compose.yml simple en tu directorio ~/project. Este archivo definirá un único servicio usando la imagen nginx.

nano ~/project/docker-compose.yml

Este comando abre el editor de texto nano para crear y editar el archivo docker-compose.yml. Pega el siguiente contenido en el editor:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Analicemos este archivo docker-compose.yml:

  • version: '3.8' especifica la versión del formato del archivo Docker Compose.
  • services: define los servicios (contenedores) que deseas ejecutar.
  • web: es el nombre de nuestro servicio. Puedes elegir cualquier nombre que prefieras.
  • image: nginx:latest especifica la imagen de Docker a usar para este servicio. En este caso, estamos usando la última versión de la imagen oficial de Nginx.
  • ports: mapea puertos entre la máquina host y el contenedor. "80:80" mapea el puerto 80 en el host al puerto 80 en el contenedor. Esto significa que puedes acceder al servidor web Nginx que se ejecuta dentro del contenedor visitando http://localhost en tu navegador web (o la dirección IP de la VM).

Guarda el archivo presionando Ctrl + O, luego presiona Enter, y sal del editor presionando Ctrl + X.

Ahora has creado exitosamente un archivo docker-compose.yml simple que define un servicio web usando la imagen de Nginx. En los siguientes pasos, usaremos este archivo para crear y gestionar contenedores.

Crear contenedores usando docker compose create

En este paso, utilizaremos el comando docker-compose create para crear contenedores basados en el archivo docker-compose.yml que preparamos en el paso anterior. El comando docker-compose create crea los contenedores pero no los inicia. Esto es útil si deseas configurar el entorno del contenedor sin ejecutar inmediatamente los servicios.

Antes de crear el contenedor, asegurémonos de que la imagen nginx esté disponible localmente. Si no lo está, Docker Compose la descargará automáticamente durante el proceso de creación. Sin embargo, es una buena práctica conocer las imágenes que estás utilizando. Puedes descargar la imagen manualmente usando el comando docker pull:

docker pull nginx:latest

Este comando descarga la imagen nginx:latest desde Docker Hub a tu máquina local. Deberías ver una salida que indica el progreso y finalización de la descarga.

Ahora, navega al directorio que contiene tu archivo docker-compose.yml. En nuestro caso, es el directorio ~/project.

cd ~/project

Ahora, ejecuta el comando docker-compose create:

docker-compose create

Este comando lee el archivo docker-compose.yml en el directorio actual y crea los contenedores definidos en él. Deberías ver una salida que indica que se está creando el contenedor para el servicio web.

Una vez que el comando finalice, puedes verificar el estado de los contenedores creados usando el comando docker ps -a.

docker ps -a

La salida de docker ps -a mostrará todos los contenedores, incluyendo aquellos que no están en ejecución. Deberías ver un contenedor llamado project_web_1 (el nombre se genera basado en el nombre del directorio y del servicio) con un estado Created. Esto confirma que el contenedor se ha creado exitosamente pero aún no se ha iniciado.

El comando docker-compose create es útil para aprovisionar previamente tus contenedores. En los siguientes pasos, exploraremos cómo iniciar y gestionar estos contenedores.

Forzar recreación de contenedores con --force-recreate

En este paso, aprenderemos cómo forzar la recreación de contenedores usando el comando docker-compose create --force-recreate. La bandera --force-recreate se utiliza para recrear contenedores incluso si su configuración no ha cambiado. Esto es útil en escenarios donde podrías necesitar refrescar la instancia del contenedor, por ejemplo, después de hacer cambios en la imagen base que Docker Compose podría no detectar automáticamente.

Primero, asegúrate de estar en el directorio ~/project donde se encuentra tu archivo docker-compose.yml.

cd ~/project

Ahora, ejecuta el comando docker-compose create con la bandera --force-recreate:

docker-compose create --force-recreate

Como ya creamos el contenedor en el paso anterior, Docker Compose detectará el contenedor existente. Debido a la bandera --force-recreate, eliminará el contenedor existente y creará uno nuevo con la misma configuración. Deberías ver una salida que indica que se está eliminando el contenedor existente y se está creando uno nuevo.

Verifiquemos nuevamente el estado de los contenedores usando docker ps -a.

docker ps -a

Deberías seguir viendo un contenedor llamado project_web_1 con el estado Created. Aunque el nombre y la configuración son los mismos, esta es una nueva instancia de contenedor que se creó debido a la bandera --force-recreate.

La bandera --force-recreate es una opción poderosa cuando necesitas asegurar una instancia fresca de tu contenedor, independientemente de si la configuración en el archivo docker-compose.yml ha cambiado.

Crear contenedores sin construir usando --no-build

En este paso, exploraremos la opción docker-compose create --no-build. Esta bandera es útil cuando tu archivo docker-compose.yml incluye servicios que se construyen desde un Dockerfile (usando la instrucción build), pero solo deseas crear los contenedores sin reconstruir las imágenes. Como nuestro archivo docker-compose.yml actual solo usa una imagen preconstruida (nginx:latest), la bandera --no-build no tendrá un efecto visible en el proceso de construcción de imágenes en este caso específico. Sin embargo, es importante entender su propósito para usos futuros con servicios que requieran construcción.

Primero, asegúrate de estar en el directorio ~/project.

cd ~/project

Ahora, ejecutemos el comando docker-compose create con la bandera --no-build. Como el contenedor project_web_1 ya existe de los pasos anteriores, también usaremos la bandera --force-recreate para asegurar que se cree un nuevo contenedor.

docker-compose create --no-build --force-recreate

En un escenario donde tu docker-compose.yml tuviera un servicio definido con una instrucción build, ejecutar este comando crearía el contenedor usando una imagen existente (si está disponible) o descargaría la imagen, pero omitiría el proceso de construcción definido en el Dockerfile. En nuestro caso actual, como estamos usando una imagen preconstruida, la salida será similar al paso anterior, indicando la eliminación del contenedor antiguo y la creación de uno nuevo.

Verifiquemos nuevamente el estado del contenedor.

docker ps -a

Deberías seguir viendo el contenedor project_web_1 en estado Created. La bandera --no-build afecta principalmente a servicios que se construyen desde un Dockerfile, evitando el proceso de construcción durante la creación del contenedor.

Crear contenedores y descargar imágenes con --pull always

En este paso, utilizaremos el comando docker-compose create --pull always. La bandera --pull always indica a Docker Compose que siempre descargue la versión más reciente de la imagen antes de crear el contenedor, incluso si existe una copia local de la imagen. Esto es útil para asegurarse de que siempre se esté utilizando la imagen más actualizada para los servicios.

Primero, asegúrate de estar en el directorio ~/project.

cd ~/project

Ahora, ejecuta el comando docker-compose create con la bandera --pull always. Como el contenedor project_web_1 ya existe, también usaremos la bandera --force-recreate para crear un nuevo contenedor basado en la imagen potencialmente actualizada.

docker-compose create --pull always --force-recreate

Cuando ejecutes este comando, Docker Compose primero verificará si hay actualizaciones para la imagen nginx:latest en Docker Hub. Si hay una versión más reciente disponible, la descargará. Luego, eliminará el contenedor existente project_web_1 y creará uno nuevo usando la imagen descargada. Deberías ver una salida que indique el proceso de descarga (si hay una nueva imagen disponible), seguido de la eliminación y creación del contenedor.

Verifiquemos el estado del contenedor una última vez.

docker ps -a

Seguirás viendo el contenedor project_web_1 en estado Created. La diferencia clave aquí es que Docker Compose verificó activamente y potencialmente descargó una imagen más nueva antes de crear esta instancia del contenedor.

La bandera --pull always es importante para mantener tus implementaciones de servicios actualizadas con las últimas versiones de imágenes, asegurando que te beneficies de las funciones más recientes, correcciones de errores y actualizaciones de seguridad.

Resumen

En este laboratorio, aprendimos a utilizar el comando docker compose create para construir y crear contenedores basados en un archivo docker-compose.yml. Comenzamos preparando un archivo docker-compose.yml simple que definía un servicio Nginx, lo cual implicó instalar manualmente Docker Compose en el entorno LabEx descargando y haciendo ejecutable el binario. Posteriormente verificamos la instalación.

Tras la preparación, exploramos varias opciones del comando docker compose create. Aprendimos:

  • Cómo crear contenedores usando el comando básico
  • Cómo forzar la recreación de contenedores existentes con la bandera --force-recreate
  • Cómo crear contenedores sin reconstruir imágenes usando la bandera --no-build
  • Cómo asegurar que se descarguen las imágenes más recientes antes de la creación con la bandera --pull always

Estos pasos demostraron la flexibilidad y control que ofrece docker compose create en la gestión del ciclo de vida de los contenedores.