Cómo instalar MinIO con Docker
Índice de contenidos
- Puntos clave
- ¿Qué es MinIO y el almacenamiento de objetos S3?
- El docker-compose.yml de MinIO (API y consola)
- ¿Cómo crear buckets y claves de acceso?
- ¿Cómo usar MinIO como backend S3 (copias, adjuntos, fotos)?
- ¿Cómo publicar MinIO con Traefik y HTTPS?
- Preguntas frecuentes
- ¿Es seguro exponer MinIO a Internet?
- ¿Por qué la consola ya no tiene opciones de administración?
- ¿Debo usar la etiqueta latest de la imagen?
- Conclusión
- Fuentes
MinIO es un servidor de almacenamiento de objetos compatible con la API de Amazon S3 que puedes autoalojar con Docker. Con un solo docker-compose.yml levantas la API en el puerto 9000 y la consola en el 9001, creas buckets y claves de acceso con el cliente mc, y lo usas como backend S3 para copias, adjuntos y fotos.
MinIO te da tu propio almacenamiento de objetos compatible con Amazon S3, autoalojado con Docker y bajo tu control. En esta guía levantas MinIO con un solo docker-compose.yml, separas la API S3 (puerto 9000) de la consola web (puerto 9001), creas buckets y claves de acceso con el cliente mc, y lo conectas como backend S3 para copias de seguridad, adjuntos de otras aplicaciones y fotos. La misma explicación está disponible en inglés.
Puntos clave
- MinIO es un servidor de almacenamiento de objetos de alto rendimiento que habla la API de Amazon S3, así que cualquier herramienta que sepa hablar con S3 funciona contra tu MinIO sin cambios.
- Expone dos puertos: el 9000 para la API S3 (donde se conectan las aplicaciones) y el 9001 para la consola web de administración.
- Las credenciales raíz se fijan con
MINIO_ROOT_USERyMINIO_ROOT_PASSWORD; la contraseña debe tener al menos 8 caracteres (usa 20 o más). - Fija una etiqueta concreta como
minio/minio:RELEASE.2025-09-07T16-13-09Zen lugar de:latest, para controlar tú cuándo actualizas. - Desde
RELEASE.2025-05-24, la consola de la edición comunitaria solo trae el explorador de objetos: la gestión de usuarios, políticas y claves se hace ahora con el clientemc.
¿Qué es MinIO y el almacenamiento de objetos S3?
El almacenamiento de objetos guarda cada archivo como un objeto dentro de un contenedor lógico llamado bucket, con sus metadatos y un identificador único, en lugar de organizarlo en carpetas sobre un disco. Es el modelo que popularizó Amazon S3 y sobre el que se apoyan hoy miles de aplicaciones para guardar copias de seguridad, imágenes, vídeos o adjuntos.
MinIO es un servidor de almacenamiento de objetos que implementa esa misma API de S3, pero que corre en tu servidor. Cualquier cliente, SDK o aplicación pensada para Amazon S3 puede apuntar a tu MinIO cambiando solo la dirección del endpoint. Eso lo convierte en la pieza de almacenamiento de referencia para un homelab: un Duplicati que hace copias cifradas, un Outline que guarda sus adjuntos o una aplicación de fotos, todos pueden escribir en el mismo MinIO como si fuera S3 de Amazon.
Conviene conocer dos hechos recientes antes de empezar. Primero, desde la versión RELEASE.2025-05-24 MinIO retiró las funciones de administración de la consola web de la edición comunitaria: ahora la consola solo permite navegar por los objetos, y la gestión de usuarios, políticas y claves de acceso se realiza con el cliente de línea de comandos mc. Segundo, el repositorio oficial minio/minio en GitHub fue archivado el 25 de abril de 2026. Nada de esto impide autoalojarlo (el servidor sigue siendo estable y compatible con S3), pero explica por qué en esta guía la administración se hace con mc y no desde el navegador.
El docker-compose.yml de MinIO (API y consola)
Necesitas una máquina Linux con Docker y el plugin Compose. Si aún no los tienes, sigue primero la guía para instalar Docker en Ubuntu 24.04. MinIO es ligero para desarrollo (con unos 2 GB de RAM sobra para pruebas), aunque para producción seria su documentación recomienda partir de 32 GB por nodo.
Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Cambia la contraseña raíz por una cadena larga y aleatoria:
services:
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
restart: unless-stopped
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: cambia_esta_clave_muy_larga
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 30s
timeout: 10s
retries: 5
volumes:
minio_data:
Fíjate en tres detalles. El comando server /data --console-address ":9001" le dice a MinIO que sirva los datos desde /data y que ponga la consola en el 9001, dejando el 9000 libre para la API. El volumen con nombre minio_data es lo que hace que tus objetos sobrevivan a un reinicio o a una actualización del contenedor. Y el healthcheck usa el propio cliente mc, que viene incluido en la imagen, para marcar el servicio como sano solo cuando está listo para recibir peticiones.
Arranca la pila y sigue los registros:
docker compose up -d
docker compose ps
docker compose logs -f minio
Cuando el registro indique que la API y la consola están escuchando, abre http://localhost:9001 en el navegador y entra con el usuario y la contraseña que pusiste en MINIO_ROOT_USER y MINIO_ROOT_PASSWORD.
¿Cómo crear buckets y claves de acceso?
La consola comunitaria ya no permite crear usuarios ni claves, así que la administración se hace con mc, el cliente oficial de MinIO. Como la imagen del servidor lo trae incorporado, puedes ejecutarlo dentro del propio contenedor con docker compose exec.
Primero configura un alias que apunte a tu servidor y crea un bucket:
docker compose exec minio mc alias set local http://localhost:9000 admin cambia_esta_clave_muy_larga
docker compose exec minio mc mb local/backups
docker compose exec minio mc ls local
Nunca uses las credenciales raíz en tus aplicaciones. Crea una clave de acceso dedicada (una cuenta de servicio ligada al usuario raíz) con permisos que puedas revocar sin tocar la contraseña principal:
docker compose exec minio mc admin user svcacct add local admin \
--access-key miappclave \
--secret-key clave_secreta_muy_larga
Ese par access-key / secret-key es lo que darás a cada aplicación cliente. Si necesitas usuarios completos con políticas propias, el comando es mc admin user add seguido de mc admin policy attach.
¿Cómo usar MinIO como backend S3 (copias, adjuntos, fotos)?
Una vez creado el bucket y la clave, cualquier cliente S3 puede escribir en MinIO. La diferencia clave frente a Amazon S3 es que debes activar el path-style: MinIO espera direcciones del tipo http://minio:9000/mibucket en lugar del formato de subdominio de AWS. En la mayoría de SDK y aplicaciones esto es una opción llamada force_path_style o similar.
Si el cliente corre en otro contenedor de la misma red de Docker, el endpoint es el nombre del servicio, http://minio:9000, y no localhost. Una configuración típica para una aplicación cliente incluye estos valores:
S3_ENDPOINT: http://minio:9000
S3_REGION: us-east-1
S3_BUCKET: backups
S3_ACCESS_KEY: miappclave
S3_SECRET_KEY: clave_secreta_muy_larga
S3_FORCE_PATH_STYLE: "true"
Con esto, Duplicati puede guardar copias cifradas e incrementales en el bucket backups, y un Outline puede almacenar sus adjuntos en MinIO en lugar de en el disco del contenedor. La región us-east-1 es un valor de relleno: MinIO no la usa realmente, pero muchos SDK de S3 exigen que exista.
¿Cómo publicar MinIO con Traefik y HTTPS?
En producción no expongas los puertos 9000 y 9001 directamente: colócalos detrás de un proxy inverso como Traefik con certificados válidos. Necesitas dos nombres de dominio, uno para la API y otro para la consola, porque MinIO los sirve en puertos distintos.
Añade a la aplicación las variables MINIO_SERVER_URL (la URL pública de la API) y MINIO_BROWSER_REDIRECT_URL (la de la consola), quita la sección ports, une el servicio a la red de Traefik y define dos routers con estas etiquetas:
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: cambia_esta_clave_muy_larga
MINIO_SERVER_URL: https://s3.midominio.com
MINIO_BROWSER_REDIRECT_URL: https://consola.midominio.com
labels:
- "traefik.enable=true"
- "traefik.http.routers.minio-api.rule=Host(`s3.midominio.com`)"
- "traefik.http.routers.minio-api.entrypoints=websecure"
- "traefik.http.routers.minio-api.tls.certresolver=letsencrypt"
- "traefik.http.routers.minio-api.service=minio-api"
- "traefik.http.services.minio-api.loadbalancer.server.port=9000"
- "traefik.http.routers.minio-console.rule=Host(`consola.midominio.com`)"
- "traefik.http.routers.minio-console.entrypoints=websecure"
- "traefik.http.routers.minio-console.tls.certresolver=letsencrypt"
- "traefik.http.routers.minio-console.service=minio-console"
- "traefik.http.services.minio-console.loadbalancer.server.port=9001"
Las dos variables MINIO_SERVER_URL y MINIO_BROWSER_REDIRECT_URL son imprescindibles tras un proxy: sin ellas, la consola intenta redirigir a localhost y las peticiones fallan. Con ambos dominios apuntando a la IP de tu servidor y Traefik gestionando los certificados de Let’s Encrypt, tendrás la API S3 en https://s3.midominio.com y la consola en https://consola.midominio.com, ambas cifradas.
Preguntas frecuentes
¿Es seguro exponer MinIO a Internet?
La API S3 (puerto 9000) sí puede exponerse porque es el punto por el que se conectan las aplicaciones, siempre tras HTTPS y con claves de acceso dedicadas en lugar de las credenciales raíz. La consola (puerto 9001), en cambio, conviene mantenerla en tu red interna o detrás de una VPN, ya que da acceso administrativo. Nunca dejes el MINIO_ROOT_PASSWORD por defecto ni con menos de 8 caracteres.
¿Por qué la consola ya no tiene opciones de administración?
Porque desde la versión RELEASE.2025-05-24 MinIO trasladó la gestión de usuarios, políticas y claves de acceso de la edición comunitaria al cliente mc, dejando en la consola web solo el explorador de objetos. No es un fallo de tu instalación: es un cambio de producto. Toda la administración descrita en esta guía se hace con mc, que viene incluido en la imagen del servidor.
¿Debo usar la etiqueta latest de la imagen?
No conviene. :latest cambia sin avisarte y puede introducir cambios de comportamiento en un simple reinicio. Al fijar una etiqueta con fecha como minio/minio:RELEASE.2025-09-07T16-13-09Z decides tú cuándo actualizas, puedes leer antes las notas de la versión y volver atrás si algo no encaja con tus aplicaciones.
Conclusión
Con un único docker-compose.yml tienes tu propio almacenamiento de objetos compatible con S3: MinIO sirviendo la API en el 9000 y la consola en el 9001, con los datos en un volumen persistente. La administración se hace con el cliente mc (crear buckets, claves de acceso y usuarios), y el paso lógico siguiente es publicarlo con HTTPS detrás de Traefik y apuntar contra él tus copias de seguridad con Duplicati. A partir de ahí, tus datos viven en tu servidor, hablando el mismo idioma que la nube pero sin depender de ella.
Fuentes
- Documentación oficial de MinIO
- Imagen oficial minio/minio en Docker Hub
- Repositorio de MinIO (minio/minio en GitHub)
Ruta: Bases de datos y almacenamiento self-hosted con Docker
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub