DanLevy.net

Configuración de servidor Docker

Inicia servidores de base de datos con un solo comando

Hero image for Configuración de servidor Docker

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?

¡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:

Icono de PostgreSQL Postgres

Icono de MongoDB MongoDB

Icono de MySQL MySQL

Icono de Elastic ElasticSearch

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 archivos docker-compose.yml.

Servidor Postgres

Inicia un contenedor, nombrándolo pg-localhost

Terminal window
# Store db files on a local path, outside the container
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'

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. Ver postgres -c 'listen_addresses=*'...)

Accede al prompt de psql como usuario postgres

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

Accede 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 tu entorno debian típico.

Para usar la imagen base debian/ubuntu, cambia postgres:12-alpine a 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'

Ahora que tu servidor está configurado, verifica que tus datos están en $HOME/.mongodb con:

Terminal window
ls -lach $HOME/.mongodb

Conectémonos al servidor con la herramienta CLI mongosh. (Si no la tienes instalada, consulta más abajo.)

Terminal window
#> Usando argumentos por defecto:
mongosh

Y deberías ver algo como esto:

Vista previa de la salida del shell de mongo

Configuración de las herramientas CLI de Mongo

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

Servidor Mysql

ADVERTENCIA: CAMBIA 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 estilo -p 127.0.0.1:27017:27017 impide 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

  1. Añade un archivo vacío llamado Dockerfile en la raíz de tu proyecto.
  2. (Opcional, recomendado) Añade un .dockerignore usando 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 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"]

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)

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 BD

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 interactivamente (no demonio, en 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 una ruta de 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...` 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