He visto a muchas personas confundirse entre un Dockerfile y un archivo Compose. Esto se debe principalmente a que ambos se usan para modificar una imagen de Docker de alguna manera, aunque técnicamente no es correcto.
Es fácil confundir los dos términos, pero también es necesario comprender la diferencia al entablar una conversación con un colega o su (potencial) empleador.
Dockerfile es lo que se usa para crear una imagen de contenedor, y un archivo Compose es lo que se usa para implementar una instancia de esa imagen como contenedor.
Permítanme entrar en un poco de detalle para que comprendan correctamente la diferencia entre Docker Compose y Dockerfile.
¿Qué es un Dockerfile?
Me gusta llamar a Dockerfile el predecesor de una imagen de contenedor. Construyes una imagen a partir de un Dockerfile. Un Dockerfile típico contiene instrucciones de compilación especiales, comandos como RUN
, ADD
, COPY
, ENTRYPOINT
, etc
Tome el siguiente ejemplo:
FROM alpine:latest
RUN apk add --no-cache fortune
ENTRYPOINT ["fortune"]
Cada línea comienza con una instrucción para el componente de construcción. Estas instrucciones no necesariamente tienen que estar escritas en mayúsculas. El siguiente es tan válido como el anterior.
from alpine:latest
run apk add --no-cache fortune
entrypoint ["fortune"]
A partir de este Dockerfile, ahora puede crear una imagen de contenedor (o una imagen acoplable). Una imagen es simplemente una plantilla para los contenedores en ejecución, que consta de varias capas de solo lectura. Dado que este no es un artículo sobre imágenes de contenedores, me abstendré de explicar demasiado ese tema.
Para crear una imagen a partir de este Dockerfile, mediante la CLI de Docker, ejecute el siguiente comando
docker build -t fortune:alpine .
Esto creará una imagen etiquetada como fortune:alpine
. Todavía no voy a crear un contenedor a partir de esta imagen, eso es para la siguiente sección.
¿Qué es un archivo Compose?
Los archivos de composición se utilizan en dos tipos de implementaciones:en la implementación sin clúster con docker-compose
y una implementación de clúster con docker swarm
.
Para distinguir los dos tipos, me referiré al archivo de composición responsable de la implementación del clúster como archivos de pila. Hablaré sobre los archivos de pila en un momento.
Los archivos de composición son parte de una herramienta llamada docker-compose
. Es una aplicación cliente para el servidor daemon docker, algo así como docker
Cliente CLI, pero en lugar de escribir todo run
comandos cada vez, con docker-compose
puede reutilizar el mismo archivo YAML una y otra vez e implementar el mismo contenedor con la misma configuración que hizo la primera vez.
Es más legible, más fácil de mantener, más intuitivo. Un único archivo de redacción puede contener varias configuraciones de implementación de contenedores.
La compatibilidad con el archivo Compose formará parte del cliente docker predeterminado que está escrito en Go, como un argumento de la línea de comandos, "docker compose". Observe el guión que falta allí. Todavía es experimental, por lo que en producción se usa la versión de Python, es decir, todavía se recomienda docker-compose.Tomemos la imagen anterior e implementemos una instancia de eso usando un archivo de composición.
version: "3.3"
services:
fortune:
image: "fortune:alpine"
Guarde el archivo como docker-compose.yml
. Ahora ejecute en el mismo directorio el siguiente comando
docker-compose up
No tienes que guarde el archivo como docker-compose.yml
, puedes guardarlo como quieras, pero si no es docker-compose.yml
o docker-compose.yaml
, asegúrese de usar -f [FILENAME]
opción.
docker-compose -f docker-compose.yml up
Espera y mira lo que ocurre.
Para saber qué fortune
es decir, lea este artículo sobre comandos divertidos de Linux.
¿Qué es un archivo de pila?
Los archivos de pila son idénticos a los archivos de composición con una sintaxis similar y la mayoría de las opciones internas, con algunas excepciones. Los archivos de pila se utilizan para implementar pilas de servicios en un clúster de enjambre.
Puede reutilizar el archivo de redacción anterior directamente como un archivo de pila.
Primero, inicialice el clúster.
docker swarm init
Luego ejecute un comando similar al siguiente
docker stack deploy -c docker-compose.yml fortune
Si se implementa de esta manera, debe verificar la salida al ver los registros del servicio usando docker service logs ...
.
Resumiendo
Los archivos Dockerfiles y Compose tienen un propósito diferente. Si pudiera construir una línea de tiempo, se vería así
Dockerfile -> Docker Image -> Compose File -> Running Containers
Hay otra razón por la que los principiantes se confunden con estos dos archivos. Se puede apuntar a un Dockerfile a través del archivo Compose, y luego puede usar docker-compose
para construir la imagen.
Por ejemplo, puede reescribir el archivo de redacción anterior para que
version: "3.3"
services:
fortune:
build:
context: '.'
dockerfile: "./Dockerfile"
image: "fortune:alpine"
Ahora puede ejecutar docker-compose build
para construir la imagen. O también puede ejecutar docker-compose up --build
para compilar y ejecutar el contenedor a la vez.
Aquí, el Dockerfile se pasa a través del archivo de redacción y, a primera vista, puede parecer que es el archivo de redacción el responsable de crear la imagen, pero no lo es.
Docker Run vs Start vs Create:diferencia explicada Para un principiante de docker, términos como docker start, docker run y docker create pueden ser confusos. Este artículo explica la diferencia con ejemplos. Manual de LinuxAbhishek PrakashEspero que este artículo haya aclarado cuál es la diferencia entre un archivo Dockerfile y un archivo Compose. Si tiene alguna pregunta, hágamelo saber en la sección de comentarios a continuación.