Configuración de servidor Docker
Inicia servidores de base de datos con un solo comando
Configuración de servidor Docker
Nota histórica: esta es una referencia de desarrollo local de 2015. Resulta útil para comprender el flujo de trabajo antiguo, pero no trates estos fragmentos como consejos de producción actuales. Los archivos modernos de Docker Compose, las redes personalizadas, las versiones de imagen fijadas, la autenticación, los secretos y la automatización de actualizaciones revisada son opciones más seguras hoy en día.
¿Para quién es esta guía?
- ¿Alguna vez quisiste probar una aplicación con una base de datos «desechable»?
- ¿Heredaste un código sospechoso? ¿Prefieres no compartir acceso a tu base de datos existente?
- ¿Trabajas con clientes sensibles a la seguridad? ¡No arriesgues la contaminación cruzada! Usa contenedores y controla la persistencia de datos.
- ¿No puedes actualizar tu entorno de desarrollo a la última versión de la base de datos porque tus aplicaciones heredadas dependen de una versión de mysql de hace 12 años?
¡Que esas razones nunca más se interpongan en tu camino!
Enlaces rápidos a comandos de una línea
Este artículo incluye comandos de una línea para iniciar algunas de las bases de datos más populares, como:
Nota: Estos comandos fueron escritos como atajos para desarrollo local. Si los adaptas para producción, añade autenticación, gestión de secretos, copias de seguridad, políticas de red, imágenes fijadas y un plan de actualización primero.
Usuarios avanzados de Docker: Si estás familiarizado con
docker-compose, puede que quieras convertir los comandos de shell de abajo para usarlos en tus archivosdocker-compose.yml.
Servidor Postgres
Inicia un contenedor, nombrándolo
pg-localhost
# Store db files on a local path, outside the containermkdir -p $HOME/.postgres-data
docker run \ --name pg-localhost \ -p 127.0.0.1:5432:5432 \ -e POSTGRES_PASSWORD=password \ --restart unless-stopped \ -it \ --shm-size=256mb \ postgres:16-alpine \ postgres -c 'listen_addresses=*' \ -c 'password_encryption=scram-sha-256' \ -c 'shared_memory_type=sysv' \ -c 'shared_buffers=256MB' \ -c 'max_connections=200'Ajusta las opciones de línea de comandos según sea necesario. (Los argumentos del demonio postgres comienzan después del nombre de la imagen docker
postgres:16-alpine. Verpostgres -c 'listen_addresses=*'...)
Accede al prompt de
psqlcomo usuario postgres
docker exec --user postgres -it pg-localhost psqlAccede al shell del contenedor como root
docker exec -it pg-localhost bashNota: El comando anterior usa las imágenes base oficiales de Alpine Linux. No es tu entorno debian típico.
Para usar la imagen base debian/ubuntu, cambia
postgres:12-alpineapostgres:12.
Servidor MongoDB
mkdir -p $HOME/.mongodb/data
docker run -d \ --name mongodb \ --restart on-failure:5 \ -p 127.0.0.1:27017:27017 \ -v $HOME/.mongodb:/data \ mongo:7 \ bash -c 'mongod --bind_ip 0.0.0.0'Ahora que tu servidor está configurado, verifica que tus datos están en $HOME/.mongodb con:
ls -lach $HOME/.mongodbConectémonos al servidor con la herramienta CLI mongosh. (Si no la tienes instalada, consulta más abajo.)
#> Usando argumentos por defecto:mongoshY deberías ver algo como esto:

Configuración de las herramientas CLI de Mongo
Usando brew y OSX
brew tap mongodb/brewbrew install mongodb-community-shellServidor Mysql
ADVERTENCIA: CAMBIA LA CONTRASEÑA EN
MYSQL_ROOT_PASSWORDA CONTINUACIÓN.
mkdir -p $HOME/.mysql
docker run -d \ -v $HOME/.mysql:/var/lib/mysql \ -p 127.0.0.1:3306:3306 \ --name mysql-$USER \ -e MYSQL_DATABASE=$USER \ -e MYSQL_ROOT_HOST='172.*.*.*' \ -e MYSQL_ROOT_PASSWORD='p@ssw0rd' \ mysql/mysql-server:8Servidor ElasticSearch
mkdir -p $HOME/.elastic
docker run -d \ --name elastic \ -p 127.0.0.1:9200:9200 \ -p 127.0.0.1:9300:9300 \ -v $HOME/.elastic:/data \ docker.elastic.co/elasticsearch/elasticsearch:8.15.5 bash -c 'elasticsearch --cluster.name elastic_cluster --node.name elastic01 --path.data /data/elastic-data --path.logs /data/elastic-logs 'Notas de seguridad
NOTA: la opción de puerto estilo
-p 127.0.0.1:27017:27017impide el acceso a tu instancia excepto desde la red localhost del servidor docker. Para «publicar» los puertos expuestos, elimina el prefijo de dirección IP local para permitir acceso externo:-p 27017:27017. Asegúrate de haber tomado las precauciones de seguridad necesarias.
Recomendado: Usa siempre una herramienta de escaneo de puertos (como nmap/masscan) para verificar tu configuración de red (desde un sistema separado en otra red.)
Ahora que tienes los comandos para iniciar tus servidores de base de datos, el siguiente paso es empaquetar tu aplicación como una imagen docker. La parte 2 continúa a continuación:
Empaquetar una aplicación web NodeJS
- Añade un archivo vacío llamado
Dockerfileen la raíz de tu proyecto. - (Opcional, recomendado) Añade un
.dockerignoreusando reglas de .gitignore para excluir rutas grandes no esenciales. Por defecto se incluyen todos los archivos del proyecto.
Crea un Dockerfile en la raíz de tu aplicación
# Example for NodeJSFROM node:22EXPOSE 3000COPY . /app/WORKDIR /appRUN apt-get update && apt-get dist-upgrade -yqqRUN ["npm", "install"]
# Overridable CommandCMD ["npm", "start"]Es más fácil mostrar cómo empezar a usar el Dockerfile y demostrar los resultados vía consola (ver comandos abajo).
En la terminal, haz cd a la carpeta de tu proyecto y ejecuta el siguiente comando build cada vez que despliegues cambios, o quieras cambiar/actualizar la configuración del SO o del entorno)
docker build -t app-name-here .Referencia de comandos clave de Docker
Construir imagen Docker
docker build -t app-name-here .Crear/ejecutar aplicación web con enlaces a servidores de BD
docker network create app-localdocker network connect app-local mongodbdocker network connect app-local elasticdocker run -d --name webapp01 --network app-local -p 3000:3000 app-name-hereEjecutar interactivamente (no demonio, en terminal)
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bashEliminar instancia de contenedor o imagen
Importante: ¡¡Cualquier dato que no esté almacenado en una ruta de volumen montado se perderá!!
# Eliminar imagendocker rmi -f app-name-heredocker rm -f webapp01# ahora vuelve a ejecutar tu `docker run...` de ^^^# Por ejemplo, para eliminar tus instancias de bd de arriba, ejecuta: ( empieza con algo como `docker stop {mongo,elastic}` )docker rm -f mongo elastic