GH GambleHub

Tecnología e Infraestructura → Docker Compose y entorno Dev

Docker Compose y entorno Dev

1) Por qué Compose

Docker Compose es una forma rápida de elevar la réplica de la pila prod a local/CI: aplicaciones, DB, colas, cachés, proxy inverso, servicios de mok. Objetivos:
  • La paridad con la venta (imágenes, variables, redes) → menos «funciona para mí».
  • Inicio rápido para los principiantes → 'make up' y en la batalla.
  • Stands aislados por desarrollador/rama → trabajo paralelo sin conflictos.
  • Pruebas de integración en dependencias reales.

2) Estructura básica del repositorio


project/
docker/
app/      # Dockerfile, скрипты web/      # Nginx/Traefik конфиги seed/      # сидеры/фикстуры compose.yaml       # общий базовый стек compose.override.yaml   # локальные оверрайды (в.gitignore)
compose.ci.yaml      # для CI
.env.example       # шаблон окружения
Makefile         # удобные цели devcontainer.json     # VS Code Dev Containers (опционально)
Recomendaciones:
  • compose. yaml - describe el «esqueleto» (servicios, redes, volúmenes) igual para dev/CI.
  • override - sólo ediciones locales: mappings de directorios, puertos, banderas debug.
  • .env. ejemplo → el desarrollador copia en '.env' y sustituye los valores.

3) Marco compuesto. yaml (ejemplo)

yaml name: project services:
gateway:
image: traefik:v3 command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.dev.acme.tlschallenge=true"
ports: ["80:80", "443:443"]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro networks: [edge, core]

api:
build:
context:.
dockerfile: docker/app/Dockerfile target: dev env_file: [.env]
command:./scripts/dev-start.sh volumes:
-./:/app:cached depends_on: [db, redis, kafka]
labels:
- "traefik.http.routers.api.rule=Host(`${API_HOST}`)"
- "traefik.http.services.api.loadbalancer.server.port=8080"
networks: [core]

db:
image: postgres:16 environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: ${DB_NAME}
volumes:
- pgdata:/var/lib/postgresql/data healthcheck: {test: ["CMD-SHELL","pg_isready -U $$POSTGRES_USER"], interval: 5s, timeout: 3s, retries: 20}
networks: [core]

redis:
image: redis:7 command: ["redis-server","--appendonly","yes"]
volumes: [ "redisdata:/data" ]
networks: [core]

kafka:
image: bitnami/kafka:3 environment:
KAFKA_ENABLE_KRAFT: "yes"
KAFKA_CFG_PROCESS_ROLES: "controller,broker"
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 networks: [core]

mailhog:
image: mailhog/mailhog ports: ["8025:8025"]
networks: [core]

mock-psp:
image: wiremock/wiremock:3 command: ["--verbose","--global-response-templating"]
volumes: ["./docker/mocks/psp:/home/wiremock"]
labels:
- "traefik.http.routers.mockpsp.rule=Host(`${PSP_HOST}`)"
networks: [core]

volumes:
pgdata: {}
redisdata: {}

networks:
edge: {}
core: {}
Puntos clave:
  • Traefik/NGINX como gateway: acerca el circuito de routing a la venta.
  • Healthcheck y depends_on con 'condition: service_healthy' (en v3 a través de scripts de espera) es un inicio ordenado.
  • Volume para persistencia (DB/caché) y bind-mount para código (hot-reload).

4) Perfiles y varios archivos

Los perfiles ('perfiles: [dev, ci, extras]') incluyen/excluyen servicios ('docker compose --profile extras up -d').

Varios archivos:
  • `docker compose -f compose. yaml -f compose. dev. yaml up '- fusión de configuraciones.
Conjunto de tipos:
  • `compose. yaml '- básico.
  • `compose. dev. yaml' - bind-mounts, debag, fichflagi.
  • `compose. extras. yaml '- instrumental (Grafana, pgAdmin, Kafdrop).
  • `compose. ci. yaml '- «cabeza sin gráficos», sin bind-mounts.

5) Variables, secretos y ajustes

.env es una fuente común de variables: hosts, créditos de prueba de DB, banderas.

Los secretos en dev no los mantenemos explícitamente; utilizamos:
  • secretos dummy locales (claves de enchufe),
  • integración con skinny-Vault/SOPS para ser especialmente sensible.
  • Principio: los datos mínimos necesarios. PAN/PII - tokens/fixtures.

6) Ensamblaje y velocidad

6. 1 Multi-stage + BuildKit

Dockerfile con objetivos 'base', 'dev', 'prod'; cache-layer compartido para dependencias.
Habilitar BuildKit: 'DOCKER _ BUILDKIT = 1' (o en configuración).
Almacenamiento en caché: '--mount = type = cache, target =/root/.cache/...' para pip/npm/maven.

6. 2 Ciclo rápido

Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Destino dev separado con el conjunto sólo deseado.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.

Ejemplo de Makefile:
make
ENV?= dev up:
docker compose --profile $(ENV) up -d down:
docker compose down -v logs:
docker compose logs -f --tail=200 rebuild:
DOCKER_BUILDKIT=1 docker compose build --pull --no-cache api seed:
docker compose run --rm api./scripts/seed.sh migrate:
docker compose run --rm api./scripts/migrate.sh test:
docker compose -f compose.yaml -f compose.ci.yaml run --rm api./scripts/test.sh

7) DB, migración, sentado

Las migraciones (Flyway/Liquibase/Alembic/Prisma) se ejecutan mediante un script de gancho después del inicio de 'db' (espera healthcheck).
Siding: contenedor separado 'seed' con fixtures; repetible e idempotente.
Snapshots de datos: el volumen 'pgdata' se puede restablecer/restaurar con el script' reset-db. sh`.


8) Corredores, cachés, CDC

Kafka/Rabbit/Redpanda - como en la venta (confecciones mínimas).
Redis con AOF incluido para el realismo.
Conectores CDC (opcional): Debezium en un servicio separado para pruebas de análisis de integración.


9) Proveedores externos de Moki

WireMock/Prism para NAT, MockServer para scripts complejos.
Mailhog/SMTP4Dev para las cartas.
Localstack/MinIO para la compatibilidad en la nube y S3.
Política: Todos los PSP/KYC/KMS externos - a través del moc-hub por contrato (OpenAPI), no «en línea».


10) Proxy inverso y TLS

Traefik/NGINX distribuye servicios por dominios locales ('.test', '.local'):
  • `api. local. test`, `mockpsp. local. test`.
  • TLS: mkcert para emitir un certificado local de confianza para probar las cookies HSTS/Secure.
  • Las sesiones de sticky sólo se incluyen para casos en los que sea importante.

11) Perfiles del desarrollador: Node/Python/Java

Node: mount 'node _ modules' como caché (volumen) para acelerar el install; 'CHOKIDAR _ USEPOLLING = 1' en Windows/WSL.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C -o' + capa con dependencias.


12) Pruebas y calidad

Las pruebas de integración corren dentro de la red Compose: 'docker compose run test'.
Testcontainers (para JVM/Node/Python/.NET) es una opción de coros para la integración de unidades sin una pila completa.
Pruebas de contrato con moc hub → gate en CI.
Linters/Pre-commit: ejecutar en el contenedor para la repetibilidad.


13) Devcontainers y «IDE-as-code»

`devcontainer. json 'fija la imagen del razrab (CLI, SDK, linters), monta el proyecto, ejecuta el' postCreateCommand '.
Profit: las mismas herramientas, no «obstruimos» el host, la nueva máquina está lista en minutos.


14) Seguridad en dev

Sin root en imágenes de aplicaciones; 'readOnlyRootFilesystem' siempre que sea posible.
Sin llaves de combate/secretos, incluso temporalmente.
Registros - sin PII/PAN; enmascaramiento a nivel de formateador.
Segregación de puertos y redes: acceso externo sólo a través de gateway.


15) FinOps/rendimiento en el local

Limite los recursos: 'deploy. resources. limits '(Compose lee parcialmente, pero ayuda a la disciplina).
Reduzca el fan out (menos servicios predeterminados; extras - perfiles).
Caché BuildKit y caché de volumen para administradores de paquetes.


16) CI с Compose

Use el mismo 'compose. yaml` + `compose. ci. yaml 'sin bind-mounts.
Cachés de dependencia: como volums attachables entre jobs/capas.
Jobs paralelos: 'name:' en Compose diferente (o prefijo por rama) para que los stands no estén en conflicto.


17) Trablshuting

'docker compose ps '/' logs -f '/' exec' es un diagnóstico básico.
Compruebe el DNS en la red Compose (servicio por nombre).
Si bind-mount «frena» en macOS/Windows - ': cached '/': delegated' o Mutagen/virtiofs.
Healthcheck es «verde», pero el servicio está «muerto»: comprueba la 'readiness' de tus apps y el orden de las migraciones.


18) Lista de verificación de implementación

1. Pila básica (gateway, api, db, cache, queue) en compose. yaml.
2. Ediciones locales - en override (v.gitignore).
3..env. ejemplo completo y actual; 'make bootstrap' lo copia en '.env'.
4. Healthchecks y script de espera DB/migraciones.
5. WireMock/Localstack/MinIO para proveedores externos.
6. Sentarse y migrar como cmdlets 'make seed/migrate'.
7. BuildKit + multi-stage, cachés de dependencias.
8. Devcontainers/Makefile para un inicio rápido.
9. Perfiles 'extras' para herramientas (Grafana/pgAdmin/Kafdrop).
10. El CI utiliza el mismo compose (+ ci-override).


19) Anti-patrones

«Monster-compose» en 40 servicios, siempre en ejecución: incluye perfiles.
Puertos rígidamente clavados, en conflicto entre desarrolladores.
Secretos/claves en Git o '.env. example`.
Dependencia de «Internet» para pruebas (PSP/KYC reales).
La ausencia de healthcheck/espera es una carrera de migraciones y lanzamientos.
Sin sentarse → pruebas de integración flaky.


20) Resultado

Compose es un motor de velocidad de desarrollo: un archivo describe su mundo de servicios y los perfiles/sobrecargas dan flexibilidad. Mantenga la paridad con la venta, automatice el side and migration, mantenga el moki y el TLS «como en combate», acelere los ensambles BuildKit 'om, y obtendrá un entorno local en el que funcione cómodamente, sea fácil de probar y reproduzca con seguridad los scripts de venta iGaming/fintech.

Contact

Póngase en contacto

Escríbanos ante cualquier duda o necesidad de soporte.¡Siempre estamos listos para ayudarle!

Iniciar integración

El Email es obligatorio. Telegram o WhatsApp — opcionales.

Su nombre opcional
Email opcional
Asunto opcional
Mensaje opcional
Telegram opcional
@
Si indica Telegram, también le responderemos allí además del Email.
WhatsApp opcional
Formato: +código de país y número (por ejemplo, +34XXXXXXXXX).

Al hacer clic en el botón, usted acepta el tratamiento de sus datos.