Etiquetas

Docker y docker-compose

 

docker-compose.yml y Dockerfile

Tanto docker-compose.yml como Dockerfile se usan en Docker, pero cumplen funciones diferentes:

ArchivoFunción
DockerfileDefine cómo se construye una imagen personalizada de Docker.
docker-compose.ymlDefine cómo se ejecutan uno o más contenedores y cómo interactúan entre ellos.


¿Cómo funciona un Dockerfile?

El Dockerfile se usa para crear una imagen personalizada de Docker. Una imagen es como una plantilla que define qué sistema operativo, aplicaciones y configuraciones tendrá el contenedor.

Ejemplo de Dockerfile

# Usa una imagen base oficial de PostGIS FROM postgis/postgis:latest # Establece el usuario root para instalar dependencias USER root # Instalar paquetes adicionales (opcional) RUN apt-get update && apt-get install -y \ postgresql-contrib \ && rm -rf /var/lib/apt/lists/* # Cambiar de nuevo al usuario postgres USER postgres # Copiar archivos SQL iniciales (opcional) COPY init.sql /docker-entrypoint-initdb.d/ # Exponer el puerto de PostgreSQL EXPOSE 5432 # Comando que ejecutará el contenedor CMD ["postgres"]

Explicación de cada instrucción

InstrucciónExplicación
FROMDefine la imagen base a partir de la cual se construirá la nueva imagen.
USER rootCambia al usuario root para instalar paquetes.
RUNEjecuta comandos en la imagen, como instalar software adicional.
USER postgresCambia de nuevo al usuario postgres.
COPYCopia archivos al contenedor. En este caso, un script SQL para inicializar la base de datos.
EXPOSEInforma que el contenedor usará el puerto 5432.
CMDDefine el comando que se ejecutará cuando el contenedor inicie.

(Opcional) Agregar un archivo SQL para inicializar la base de datos Crea un archivo init.sql en la misma carpeta si quieres cargar datos al inicio.

init.sql

CREATE TABLE test_table ( id SERIAL PRIMARY KEY, name TEXT NOT NULL ); INSERT INTO test_table (name) VALUES ('Ejemplo 1'), ('Ejemplo 2');

¿Cómo usar un Dockerfile?

# Construir la imagen personalizada docker build -t mi-postgis .

# Crear un contenedor basado en la imagen docker run -d -p 30000:5432 --name usuario_uno mi-postgis

¿Cómo funciona docker-compose.yml?

El docker-compose.yml se usa para definir y orquestar múltiples contenedores con configuraciones específicas. En lugar de ejecutar docker run manualmente, docker-compose permite levantar varios servicios con un solo comando.

Ejemplo de docker-compose.yml

version: '3.1' services: db: build: . # Construye la imagen desde el Dockerfile en esta carpeta container_name: usuario_uno deploy: resources: limits: memory: "512M" cpus: "0.5" reservations: memory: "256M" cpus: "0.3" restart: always ports: - "30000:5432" environment: POSTGRES_DB: usuario_db POSTGRES_USER: usuario POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} PGDATA: /var/lib/postgresql/data POSTGRES_HOST_AUTH_METHOD: trust volumes: - usuario_db_data:/var/lib/postgresql/data volumes: usuario_db_data:

Explicación de cada parte

SecciónExplicación
versionIndica la versión del esquema de docker-compose.
servicesLista los servicios (contenedores) que se van a ejecutar.
dbNombre del servicio de la base de datos PostgreSQL/PostGIS.
buildLe dice a Docker que construya la imagen usando el Dockerfile en la misma carpeta.
container_nameNombre personalizado del contenedor.
deployConfiguración de límites de memoria y CPU (se usa en Docker Swarm).
restartIndica que el contenedor se reiniciará siempre si se detiene.
portsMapea el puerto 5432 del contenedor al 30000 en la máquina host.
environmentVariables de entorno para PostgreSQL.
volumesDefine almacenamiento persistente para los datos de la base de datos.

¿Cómo usar docker-compose.yml?

# Construir la imagen y ejecutar los contenedores en segundo plano docker-compose up -d
# Ver contenedores en ejecución docker ps
# Detener los contenedores docker-compose down

¿Cómo trabajan juntos?

El Dockerfile define cómo se construye la imagen.
El docker-compose.yml define cómo se ejecutan los contenedores con esa imagen.

Cuando docker-compose.yml usa build: ., Docker busca el Dockerfile en la misma carpeta y lo usa para construir la imagen.

Resumen

DiferenciaDockerfiledocker-compose.yml
¿Qué hace?Define la imagen personalizada.Define y ejecuta los contenedores.
¿Cuándo usarlo?Si necesitas modificar la imagen base.Si necesitas varios servicios o configuraciones avanzadas.
¿Cómo se ejecuta?docker builddocker rundocker-compose up