DanLevy.net

Configuración del servidor Docker

Iniciaservidores de base de datos con un solo comando

Hero image for Configuración del servidor Docker

Configuración del Servidor Docker

Nota histórica: esta es una referencia de desarrollo local de 2015. Es útil para comprender el flujo de trabajo antiguo, pero no trate estos fragmentos como consejo de producción actual. Los archivos modernos de Docker Compose, redes personalizadas, versiones de imágenes fijadas, autenticación, secretos y automatización de actualizaciones revisada son valores predeterminados más seguros hoy en día.

¿Para quién es esta guía?

¡Nunca deje que esas razones le vuelvan a bloquear el camino!

Enlaces rápidos a los comandos de una línea

Esta artículo presenta comandos de una sola línea para iniciar algunas de las bases de datos más populares, incluyendo:

PostgreSQL icon Postgres

MongoDB icon MongoDB

MySQL icon MySQL

Elastic icon ElasticSearch

Nota: Estos comandos fueron escritos como atajos para desarrollo local. Si los adapta para producción, añada autenticación, gestión de secretos, copias de seguridad, políticas de red, imágenes con versiones fijas y un plan de actualizaciones primero.

Usuarios avanzados de Docker: Si está familiarizado con docker-compose puede que quiera convertir los comandos de shell a su archivo docker-compose.yml.

Servidor Postgres

Inicie un contenedor, nombrándolo pg-localhost

Terminal window
# Almacene los archivos de la base de datos en una ruta local, fuera del contenedor
mkdir -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'

Ajuste las opciones de la línea de comandos según sea necesario. (Los argumentos del demonio de postgres comienzan después del nombre de la imagen Docker postgres:16-alpine. Véase postgres -c 'listen_addresses=*'...)

Acceda al prompt de psql como usuario postgres

Terminal window
docker exec --user postgres -it pg-localhost psql

Acceda al shell del contenedor como root

Terminal window
docker exec -it pg-localhost bash

Nota: El comando anterior usa las imágenes base oficiales de Alpine Linux. No es el típico entorno Debian.

Para usar la imagen base debian/ubuntu, cambie postgres:12-alpine por postgres:12.

Servidor MongoDB

Terminal window
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'

Una vez que el servidor esté listo, verifica que los datos estén en $HOME/.mongodb con:

Terminal window
ls -lach $HOME/.mongodb

Conectémonos al servidor usando la herramienta de línea de comandos mongosh. (Si no la tienes instalada, consulta más abajo.)

Terminal window
#> Usando los argumentos por defecto:
mongosh

Y deberías ver algo similar a esto:

Vista previa de la salida del shell de mongo

Configurar herramientas CLI de Mongo

Usando brew y macOS
Terminal window
brew tap mongodb/brew
brew install mongodb-community-shell

Servidor MySQL

ADVERTENCIA: MODIFICA LA CONTRASEÑA EN MYSQL_ROOT_PASSWORD A CONTINUACIÓN.

Terminal window
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:8

Servidor ElasticSearch

Terminal window
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 del tipo -p 127.0.0.1:27017:27017 impide el acceso a tu instancia salvo desde la red localhost del servidor Docker.
Para “publicar” los puertos expuestos, elimina el prefijo de dirección IP local y permite el 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 bases de datos, el siguiente paso es empaquetar tu aplicación como una imagen Docker. La Parte 2 continúa a continuación:

Empaquetando una aplicación web NodeJS

  1. Añade un archivo vacío llamado Dockerfile en la raíz de tu proyecto.
  2. (Opcional, recomendado) Añade un .dockerignore usando las reglas de .gitignore para excluir rutas grandes y no esenciales. Por defecto se incluyen todos los archivos del proyecto.

Crear un Dockerfile en la raíz de tu aplicación

# Example for NodeJS
FROM node:22
EXPOSE 3000
COPY . /app/
WORKDIR /app
RUN apt-get update && apt-get dist-upgrade -yqq
RUN ["npm", "install"]
# Overridable Command
CMD ["npm", "start"]

Resulta más sencillo mostrar cómo iniciar usando el Dockerfile y demostrar los resultados mediante la consola (ver comandos más abajo).

En la terminal, cd a la carpeta de tu proyecto y ejecuta el siguiente comando build cada vez que despliegues cambios — o quieras cambiar/actualizar el SO o la configuración del entorno.

Terminal window
docker build -t app-name-here .

Referencia de comandos clave de Docker

Construir imagen Docker

Terminal window
docker build -t app-name-here .

Crear/Ejecutar aplicación web con enlaces a servidores de bases de datos

Terminal window
docker network create app-local
docker network connect app-local mongodb
docker network connect app-local elastic
docker run -d --name webapp01 --network app-local -p 3000:3000 app-name-here

Ejecutar de forma interactiva (no daemon, en la terminal)

Terminal window
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bash

Eliminar instancia de contenedor o imagen

Importante: ¡Cualquier dato que no esté almacenado en un volumen montado se perderá!

Terminal window
# Eliminar imagen
docker rmi -f app-name-here
docker rm -f webapp01
# ahora vuelve a ejecutar tu `docker run...` desde ^^^
# Por ejemplo, para terminar tus instancias de base de datos anteriores, ejecuta: (comienza con algo como `docker stop {mongo,elastic}`)
docker rm -f mongo elastic