Tecnologia e infrastruttura di Docker Compose e Deve
Docker Compose e Deve
1) Perché Compose
Docker Compose è un modo rapido per elevare la replica del prod-stack in layout/CI: applicazioni, database, code, cache, proxy inverso, servizi molo. Obiettivi:- La parità con la vendita (immagini, variabili, reti) è meno «funziona da me».
- Inizio rapido per i principianti dì make up "e in battaglia.
- Stand isolati per sviluppatore/ramo, lavoro parallelo senza conflitti.
- Test di integrazione su dipendenze reali.
2) Struttura base del repository
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 (опционально)
Raccomandazioni:
- compose. yaml - descrive «scheletro» (servizi, reti, volumi) uguale a quello dei dave/CI.
- override - Solo modifiche locali: mapping directory, porte, flag debug.
- .env. L' → sviluppatore esample copia in «.env» e incastra i valori.
3) Ossatura compose. yaml (esempio)
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: {}
Punti chiave:
- Traefik/NGINX come gateway: avvicina lo schema di routing alla routing.
- Healthcheck e depends _ on con'posizione: service _ healthy '(in v3 attraverso script waiting) è una partenza ordinata.
- Volumi per la persistenza (database/cache) e bind-mount per il codice (hot-reload).
4) Profili e più file
Profiles ('profiles: [def, ci, extras]') includono/escludono i servizi ('docker compose --profile extras up -d').
Più file:- `docker compose -f compose. yaml -f compose. dev. yaml up "- Fuso delle configurazioni.
- `compose. yaml "- base.
- `compose. dev. yaml '- bind-mount, debag, phicheflagi.
- `compose. extras. yaml - strumenti (Grafana, pgAdmin, Kafdrop).
- `compose. ci. yaml è «testa senza grafica», senza bind-mount.
5) Variabili, segreti e impostazioni
.eng è l'origine comune delle variabili: host, crediti dei database di prova, bandiere.
I segreti non vengono tenuti esplicitamente; usiamo:- dummy-segreti locali (chiavi stub),
- integrazione con skinny-Vault/SOPS per il più sensibile.
- Principio: dati minimi necessari. PAN/PII - token/ficsture.
6) Assemblaggi e velocità
6. 1 Multi-stage + BuildKit
Dockerfile con obiettivi «base», «dave», «prod»; cache-layer condivisa per le dipendenze.
Attiva il BuildKit: 'DOCKER _ BUILDKIT = 1' (o in un configh).
Cache: '--mount = type = cache, target =/root/.cache/...' per pip/npm/maven.
6. 2 Ciclo rapido
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Un unico target dave con l'assieme desiderato.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.
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) Database, migrazioni, siding
Le migrazioni (Flyway/Liquibase/Alembic/Prisma) vengono avviate con uno script gancio dopo l'avvio db (in attesa di healthcheck).
Siding: contenitore separato «seed» con ficstour; ripetibile e idipotente.
Snapshot dati: il volume pgdata può essere reimpostato/ripristinato con lo script reset-db. sh`.
8) Broker, cache, CDC
Kafka/Rabbit/Redpanda - come in vendita (configi minimi).
Redis con AOF acceso per il realismo.
Connettori CDC (opzionale): Debezium in un servizio separato per i test di analisi di integrazione.
9) Moki fornitori esterni
per , per scenari complessi.
Mailhog/SMTP4Dev per le lettere.
Localstack/MinIO per lo store cloud e la compatibilità S3.
Politica: Tutti i PSP/KYC/KMS esterni - tramite Mob Hab per i contratti (OpenAPI) e non «Internet».
10) Proxy inverso e TLS
Traefik/NGINX distribuisce servizi sui domini locali («.test», «.local»):- `api. local. test`, `mockpsp. local. test`.
- TLS: mkcert per il rilascio di un certificato locale attendibile per il test HSTS/secure-cookies.
- Sticky sessioni includere solo per le valigette dove è davvero importante.
11) Profili sviluppatori: Node/Python/Java
Node: mount'node _ modules'come cache (volume) per accelerare install; 'CHOKIDAR _ USEPOLLING = 1' su Windows/WSL.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C -o' + livello con dipendenze.
12) Test e qualità
Test di integrazione in corso all'interno della rete Compose: 'docker compose run test'.
Testontainers (per JVM/Node/Python/.NET) è un'opzione per unit-integration senza stack completi.
Un contratto-test con il MHB di → gate in CI.
Linter/Pre-commit - Avvia in un contenitore di ripetibilità.
13) Devcontainers e «IDE-come-codice»
`devcontainer. json'cattura l'immagine di un dirupo (CLI, SDK, linters), monta il progetto, esegue «postCreateCommand».
Gli stessi strumenti, non intasiamo l'host, la nuova macchina è pronta in minuti.
14) Sicurezza in def
Senza root nelle immagini delle applicazioni; 'readOnlyRootFilesystem' quando possibile.
Niente chiavi di guerra o segreti, anche temporaneamente.
Loghi - senza PII/PAN; maschera a livello di formattatore.
Segregazione di porte e reti: accesso esterno solo tramite gateway.
15) FinOps/prestazioni in locale
Limitare le risorse dì deploy ". resources. limits '(Compose legge parzialmente ma aiuta la disciplina).
Riduzione del fan-out (meno servizi predefiniti; extras - profili).
Cache e cache volumica per i gestori di pacchetti.
16) CI с Compose
Usate gli stessi "compose. yaml` + `compose. ci. yaml'senza bind-mount.
Cache delle dipendenze - Come attachable volumes tra giobbe/livelli.
I giubbotti paralleli sono «name:» in Compose è diverso (o prefisso nel ramo) in modo che gli stand non siano in conflitto.
17) Trablshuting
«docker compose ps »/« logs -f »/« exec» è una diagnosi di base.
Verificare il DNS nella rete Compose (servizio per nome).
Se bind-mount «frena» su - «: cache »/«: delegated» o Mutagen/virtuofs.
Healthcheck è verde, ma il servizio è «morto». Controlla «read.com.» la tua app e l'ordine delle migrazioni.
18) Assegno foglio di implementazione
1. Stack di base (gateway, api, db, cache, queue) in compose. yaml.
2. Le modifiche locali sono in override (v.gitignore).
3..env. «make bootstrap» lo copia in «.env».
4. Healthchecks e lo script in attesa di database/migrazioni.
5. WireMock/Localstack/MinIO per i provider esterni.
6. Siding e migrazioni come comandi «make seed/migrate».
7. BuildKit + multi-stage, cache delle dipendenze.
8. Devcontainers/Makefile per una partenza rapida.
9. Profili «extras» per gli strumenti (Grafana/pgAdmin/Kafdrop).
10. CI utilizza lo stesso compose (+ ci-override).
19) Anti-pattern
«Monster compose» in 40 servizi, sempre in esecuzione: abilita i profili.
Porte dure e in conflitto tra gli sviluppatori.
Segreti/chiavi in Git o '.env. example`.
Dipendenza da Internet per i test (PSP/KYC).
L'assenza di healthcheck/attesa è una corsa alle migrazioni e alle partenze.
Nessun siding flaky test di integrazione.
20) Totale
Compose è il motore della velocità di sviluppo: un unico file descrive il mondo dei servizi e i profili/override offrono flessibilità. Mantenete la parità con la vendita, automatizzate siding e migrazioni, tenete i moki e i TLS "come in battaglia", velocizzate gli assemblaggi BuildKit "in modo da avere un ambiente locale in cui lavorare, testare e riprodurre facilmente gli script di iGaming/Fintech.