Docker File vs Docker Compose: ¿Cuál es la diferencia?

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

toma el example debajo:

                      
                        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 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 Componer?

Los archivos de redacción se utilizan en dos tipos de implementaciones: en la implementación sin clúster con docker-compose y un despliegue 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.

Componer archivos es parte de una herramienta llamada docker-compose . Es una aplicación cliente para el servidor daemon docker, algo así como el 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 composició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, aún 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"

                      
                    

Guardar el archivo como docker-compose.yml . Ahora ejecute en el mismo directorio el siguiente comando

                      
                        docker-compose up

                      
                    

tu no tengo que guardar el archivo como docker-compose.yml puedes guardarlo como quieras, pero si no lo está docker-compose.yml o docker-compose.yaml asegúrese de utilizar el -f [FILENAME] opción.

                      
                        docker-compose -f docker-compose.yml up

                      
                    

Espera y mira lo que ocurre.

Saber qué fortune es, 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 enjambre grupo.

Puede reutilizar el archivo de composició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 ... .

Terminando

Los archivos Dockerfiles y Compose tienen un propósito diferente. Si pudiera construir una línea de tiempo, sería algo como esto

                      
                        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.

Para examplepuede reescribir el archivo de redacción anterior para que

                      
                        version: "3.3"

services:
    fortune:
        build:
            context: '.'
            dockerfile: "./Dockerfile"
        image: "fortune:alpine"

                      
                    

Ahora puedes correr docker-compose build para construir la imagen. O también puedes 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.

Espero 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.

Related Posts