Docker y Docker-Compose: Guía Completa
Este artículo fue publicado por el autor Editores el 09/02/2025 y actualizado el 09/02/2025. Esta en la categoria Artículos.
El mundo de la programación y el despliegue de aplicaciones se ha vuelto más sencillo gracias a herramientas como Docker y Docker-Compose. En esta guía completa, te mostraremos qué son estas herramientas, para qué sirven, y cómo utilizarlas. ¡Comencemos!
¿Qué es Docker?
Docker es una plataforma de código abierto para automatizar el despliegue, escalado y gestión de aplicaciones. Mediante la contenerización de aplicaciones, Docker permite la creación de paquetes estándar que integran todo lo necesario para ejecutar una aplicación en cualquier entorno.
La contenerización es una técnica de virtualización que permite crear entornos aislados y ligeros, en los que se pueden ejecutar aplicaciones sin interferir con el sistema operativo host o con otras aplicaciones. Estos entornos se denominan contenedores, y se crean a partir de imágenes, que son plantillas que definen el entorno de ejecución de la aplicación, incluyendo el sistema operativo, las bibliotecas, los archivos y las dependencias necesarias.
Docker proporciona una serie de herramientas y componentes para crear, gestionar e implementar estas imágenes y contenedores. Entre ellas, destacan:
- Docker Engine: el motor de Docker, que se encarga de crear, ejecutar y gestionar los contenedores.
- Docker Hub: un registro central de imágenes de Docker, donde se pueden almacenar, compartir y descargar imágenes.
- Docker Compose: una herramienta para definir y ejecutar múltiples contenedores como una única aplicación.
- Docker Swarm: un orquestador de contenedores para distribuir aplicaciones en clústeres de máquinas.
- Docker Machine: una herramienta para crear y gestionar máquinas virtuales con Docker Engine instalado.
¿Qué es Docker-Compose?
Docker-Compose es una herramienta que permite definir y ejecutar múltiples contenedores como una única aplicación. Con Docker-Compose, se puede definir todo el entorno de ejecución de una aplicación, incluyendo los servicios, las redes, los volúmenes y las variables de entorno, en un archivo de configuración llamado docker-compose.yml.
Este archivo de configuración se basa en YAML, un lenguaje de serialización ligero y fácil de leer. En él, se pueden definir servicios, que son contenedores que ejecutan una parte de la aplicación. Cada servicio se puede configurar con sus propias opciones, como la imagen a utilizar, los puertos a exponer, los volúmenes a montar, las variables de entorno a establecer y los comandos a ejecutar.
Una vez definido el archivo de configuración, se puede ejecutar la aplicación con un solo comando: docker-compose up
. Docker-Compose se encargará de crear, iniciar y conectar los contenedores, y de gestionar su ciclo de vida.
Instalación y configuración de Docker y Docker-Compose
Antes de empezar a utilizar Docker y Docker-Compose, hay que instalarlos en nuestro sistema. La forma de hacerlo depende del sistema operativo y la distribución que estemos utilizando. En general, se puede hacer siguiendo los pasos de la documentación oficial de Docker.
Una vez instalados, podemos comprobar que funcionan correctamente ejecutando los siguientes comandos: docker --versiondocker-compose --version
Si todo va bien, veremos las versiones de Docker y Docker-Compose instaladas.
Para utilizar Docker-Compose, solo necesitamos tener un archivo de configuración docker-compose.yml en el directorio donde queramos ejecutar la aplicación. A continuación, mostramos un ejemplo sencillo de un archivo docker-compose.yml: yaml version: '3'
services: web: image: nginx:latest ports: - '80:80' volumes: - ./nginx.conf:/etc/nginx/nginx.conf db: image: postgres:latest environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: db En este archivo, definimos dos servicios: web y db. El servicio web utiliza la imagen nginx:latest, expone el puerto 80 y monta un volumen con el archivo nginx.conf en el directorio /etc/nginx/ de la imagen. El servicio db utiliza la imagen postgres:latest, establece las variables de entorno POSTGRES_USER, POSTGRES_PASSWORD y POSTGRES_DB, y crea una base de datos con el nombre db.
Ejemplo práctico: creación de un servidor web con Docker y Docker-Compose
Para ilustrar el uso de Docker y Docker-Compose, vamos a crear un servidor web sencillo, que conste de un contenedor con una imagen de Nginx y un contenedor con una imagen de PostgreSQL.
Lo primero que tenemos que hacer es crear el archivo docker-compose.yml, como hemos visto en el apartado anterior. Después, creamos el fichero de configuración nginx.conf para el servidor web: yaml worker_processes 1;
events { worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server { listen 80;
location / { proxy_pass http://db:5432;}
} } En este fichero, configuramos Nginx para que actúe como un proxy reverso y reenvíe las peticiones al contenedor db, que es el que contiene la base de datos PostgreSQL.
A continuación, ejecutamos el comando docker-compose up
, que creará y pondrá en marcha los dos contenedores: csharp$ docker-compose upCreating network "docker_default" with the default driverBuilding webStep 1/1 : FROM nginx:latest ---> 89e5a9d906b0Successfully built 89e5a9d906b0Successfully tagged docker_web:latestCreating docker_db_1 ... doneCreating docker_web_1 ... doneAttaching to docker_db_1, docker_web_1db_1 | The files belonging to this database system will be owned by user "postgres".db_1 | This user must also own the server process.db_1 |db_1 | The database cluster will be initialized with locale "en_US.utf8".db_1 | The default database encoding has accordingly been set to "UTF8".db_1 | The default text search configuration has been set to "public".db_1 |db_1 | Data page checksums are disabled.db_1 |db_1 | fixing permissions on existing directory /var/lib/postgresql/data ... okdb_1 | creating subdirectories ... okdb_1 | selecting dynamic shared memory implementation ... posixdb_1 | selecting default max_connections ... 100db_1 | selecting default shared_buffers ... 128MBdb_1 | selecting default timezone ... Etc/UTCdb_1 | creating configuration files ... okdb_1 | creating template1 database in /var/lib/postgresql/data/base/1 ... okdb_1 | initializing pg_authid ... okdb_1 | initializing dependencies ... okdb_1 | creating system views ... okdb_1 | loading system objects' descriptions ... okdb_1 | creatingconstraints ... okdb_1 | creating pg_multixact_members ... okdb_1 | creating pg_system_shm ... okdb_1 | setting password ... okdb_1 | configuring Spring locale ... okdb_1 | starting PostgreSQL ... okdb_1 |db_1 | PostgreSQL init process complete; ready for start up.db_1 |db_1 | ****************************************************db_1 | WARNING: no password has been set for the database.db_1 | Instead, one is generated automatically at first use.db_1 | ****************************************************db_1 |db_1 | LOG: database system is ready to accept connectionsdb_1 | LOG: autovacuum launcher starteddb_1 | LOG: incomplete startup packetweb_1 | 172.18.0.1 - - [19/Jan/2022:15:56:11 +0000] "GET / HTTP/1.1" 502 552 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"web_1 | 2022/01/19 15:56:11 [error] 6#6: connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.18.0.2:5432", host: ""web_1 | 172.18.0.1 - - [19/Jan/2022:15:56:11 +0000] "GET /favicon.ico HTTP/1.1" 502 552 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"web_1 | 2022/01/19 15:56:11 [error] 6#6: connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://172.18.0.2:5432", host: "localhost"
Como podemos ver, Docker crea una red virtual en la que se comunican los dos contenedores, y monta el archivo nginx.conf en el directorio /etc/nginx/ de la imagen web. Además, se inicializa la base de datos PostgreSQL en el contenedor db, y se guarda el password generado automáticamente en un archivo de log.
Por último, abrimos un navegador en la URL http://localhost/, y podremos ver el mensaje de bienvenida de Nginx:
Preguntas frecuentes
¿Qué diferencia hay entre Docker y una máquina virtual?
Docker y las máquinas virtuales son dos formas diferentes de virtualizar el entorno de ejecución de una aplicación. Mientras que las máquinas virtuales crean una réplica completa del sistema operativo host, con un kernel propio y una capa de abstracción hardware, Docker comparte el kernel del sistema host y crea entornos aislados y ligeros, en los que se ejecutan las aplicaciones. Esto hace que Docker sea más rápido y ligero que las máquinas virtuales, y más fácil de desplegar y gestionar.
¿Puedo utilizar Docker y Docker-Compose en Windows y macOS?
Sí, Docker y Docker-Compose son multiplataforma, y se pueden utilizar en Windows y macOS, además de en Linux. En Windows y macOS, Docker se ejecuta en una máquina virtual, y se puede gestionar a través de la aplicación Docker Desktop.
¿Qué es un volumen en Docker?
Un volumen en Docker es un directorio o un archivo en el sistema host, que se monta en un contenedor como un directorio. Los volúmenes permiten persistir los datos de un contenedor, y compartirlos entre contenedores o con el sistema host.
¿Qué es un servicio en Docker-Compose?
Un servicio en Docker-Compose es un contenedor que ejecuta una parte de la aplicación. Los servicios se definen en el archivo docker-compose.yml, y se pueden configurar con opciones específicas, como la imagen a utilizar, los puertos a exponer, los volúmenes a montar, las variables de entorno a establecer y los comandos a ejecutar.
Referencias
- Documentación oficial de Docker: https://docs.docker.com/engine/reference/
- Documentación oficial de Docker Compose: https://docs.docker.com/compose/
- Guía para principiantes de Docker y Docker Compose: https://docker-curriculum.com/
- Blog de Docker en español: https://dockerspanish.wordpress.com/
¡Esperamos que te haya sido útil esta guía! Si tienes alguna duda o sugerencia, no dudes en dejarnos un comentario. ¡Hasta la próxima!
Deja un comentario