Teknolojiler ve Altyapı - Docker Compose ve Dev Ortamı
Docker Besle ve Dev ortamı
1) Neden oluşturmak
Docker Compose, yerel/CI'daki üretim yığınının bir kopyasını yükseltmenin hızlı bir yoludur: uygulamalar, veritabanları, kuyruklar, önbellekler, ters proxy, ioc hizmetleri. Hedefler:- Satışlarla parite (resimler, değişkenler, ağlar) - daha az'benim için çalışıyor ".
- Yeni başlayanlar için hızlı başlangıç - 'makyaj've savaşa.
- Geliştirici/şube başına izole standlar - çakışmalar olmadan paralel çalışma.
- Gerçek bağımlılıklar üzerinde entegrasyon testleri.
2) Temel depo yapısı
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 (опционально)
Öneriler:
- beste. yaml - dev/CI için aynı "iskelet" (hizmetler, ağlar, hacimler) açıklar.
- Override - sadece yerel düzenlemeler: dizin eşlemeleri, bağlantı noktaları, hata ayıklama bayrakları.
- .env Örnek - geliştirici '.env'e kopyalar ve değerleri değiştirir.
3) Çerçeve oluşturmak. yaml (örnek)
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: {}
Önemli noktalar:
- Ağ geçidi olarak Traefik/NGINX: yönlendirme şemasını satış şemasına yaklaştırır.
- Healthcheck ve 'condition ile depends_on: service_healthy' (bekleyen komut dosyaları aracılığıyla v3'te) - düzenli bir başlangıç.
- Kalıcılık için birimler (DB/cache) ve kod için bind-mount (hot-reload).
4) Profiller ve çoklu dosyalar
Profiller ('profiller: [dev, ci, extras]') servisleri içerir/hariç tutar ('docker compose --profile extras up -d').
Birden çok dosya:- 'docker compose -f compose. yaml -f beste. Dev. yaml up '- birleştirme konfigürasyonları.
- 'beste. Yaml 'temel.
- 'beste. Dev. yaml '- bağlama-binekler, debaglar, phicheflags.
- 'beste. ekstralar. yaml '- enstrümantal (Grafana, pgAdmin, Kafdrop).
- 'beste. Ci. yaml '- "grafiksiz kafa", bağlama bağlantıları olmadan.
5) Değişkenler, sırlar ve ayarlar
.env - değişkenlerin ortak kaynağı: hosts, test veritabanı kredileri, bayraklar.
Açıkça dev'de sır saklamıyoruz; Kullanıyoruz:- Yerel kukla sırları (stub anahtarları),
- Ekstra hassas için skinny-vault/sop ile entegrasyon.
- İlke: Minimum gerekli veri. PAN/PII - belirteçler/düzeltmeler.
6) Montajlar ve hız
6. 1 Çok aşamalı + BuildKit
'Temel', 'dev', 'prod' hedefleri ile Dockerfile; bağımlılıklar için paylaşılan önbellek katmanı.
BuildKit'i dahil edin: 'DOCKER _ BUILDKIT = 1' (veya yapılandırmada).
Önbelleğe alma: '--mount = type = cache, target =/root/.cache/...' pip/npm/maven için.
6. 2 Hızlı döngü
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Sadece istenen bir montaj ile ayrı bir dev hedef.
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) DB, göçler, siding
Geçişler (Flyway/Liquibase/Alembic/Prisma) 'db' başlangıcından sonra bir kanca komut dosyası ile başlatılır (sağlık kontrolü için beklenir).
Siding: armatürlü ayrı bir 'tohum' kabı; tekrarlanabilir ve idempotent.
Veri anlık görüntüleri: 'pgdata' birimi 'reset-db komut dosyası ile sıfırlanabilir/geri yüklenebilir. sh '.
8) Brokerler, Önbellekler, CDC
Kafka/Tavşan/Redpanda - prod'da olduğu gibi (minimum yapılandırmalar).
Gerçekçilik için AOF ile Redis dahil.
CDC konektörleri (isteğe bağlı): Entegrasyon analizi testleri için ayrı bir serviste debezium.
9) Dış Tedarikçi Mocks
REST için WireMock/Prism, karmaşık senaryolar için MockServer.
Mektuplar için Mailhog/SMTP4Dev.
Bulut mağazaları ve S3 uyumluluğu için Localstack/MinIO.
Politika: Tüm harici PSP/KYC/KMS - sözleşmeler altındaki sahte merkez (OpenAPI) aracılığıyla ve "internette'değil.
10) Ters proxy ve TLS
Traefik/NGINX hizmetleri yerel alanlara ('.test', '.local') dağıtır:- 'api. yerel. Test ',' mockpsp. yerel. test '.
- TLS: mkcert to issue a trusted local certificate to test HSTS/secure-cookies. - HSTS/güvenli çerezleri test etmek için güvenilir bir yerel sertifika vermek için mkcert.
- Yapışkan oturumları yalnızca gerçekten önemli olduğu durumlarda açın.
11) Geliştirici Profilleri: Düğüm/Python/Java
Node: Kurulumu hızlandırmak için önbellek (birim) olarak 'node _ modules' mount; 'CHOKIDAR _ USEPOLLING = 1' Windows/WSL üzerinde.
Python: Hacim как 'pip cache', 'watchfiles'/' uvicorn --reload'.
Java: JRebel/Devtools, bağımlılıkları olan 'mvn -T 1C -o' + katmanı.
12) Testler ve kalite
Entegrasyon testleri Compose ağı içinde yarış: 'docker compose run test'.
Testcontainers (JVM/Node/Python/.NET için) tam bir yığın olmadan birim entegrasyonu için iyi bir seçenektir.
Gate mock hub ile CI sözleşme testleri.
Linters/Pre-commit: Tekrarlanabilirlik için konteynerde çalıştırın.
13) Devcontainers ve "IDE-as-code"
'devcontainer. json 'geliştiricinin (CLI, SDK, linters) imajını düzeltir, projeyi monte eder,' postCreateCommand'ı çalıştırır.
Kâr: Aynı araçlar, ana bilgisayarı "tıkamayın", yeni makine dakikalar içinde hazır.
14) Dev'de güvenlik
Uygulama görüntülerinde kök olmadan; Mümkünse 'readOnlyRootFilesystem'.
Savaş anahtarları/sırları yok, geçici olarak bile.
Günlükler - PII/PAN olmadan; Biçimlendirici düzeyinde maskeleme.
Bağlantı noktası ve ağ ayrımı: yalnızca ağ geçidi üzerinden harici erişim.
15) FinOps/yerelde performans
Kaynakları sınırla: 'konuşlandırın. kaynakları. Limits '(Beste kısmen okur, ancak disipline yardımcı olur).
Fan çıkışını azaltın (daha az varsayılan hizmet; ekstralar - profiller).
Paket yöneticileri için BuildKit önbellek ve birim önbellekleri.
16) CI с Compose
Aynı 'oluştur'u kullan. yaml '+' beste. Ci. Bağlama bağları olmadan yaml '.
Bağımlılık önbellekleri, işler/katmanlar arasında eklenebilir hacimler gibidir.
Paralel jabs: 'name:' In Compose, standların çakışmaması için farklıdır (veya şubeye göre önek).
17) Trableshooting
'docker compose ps'/' logs -f'/' exec' - temel tanılama.
Compose ağında DNS'yi kontrol edin (isme göre hizmet).
MacOS/Windows'ta bind-mount "yavaşlarsa" - ': cached'/': delegated' veya Mutagen/virtiofs.
Sağlık kontrolü'yeşil ", ancak hizmet" ölü ": uppka'nızın" hazır olup olmadığını've göç sırasını kontrol edin.
18) Uygulama kontrol listesi
1. Temel yığın (gateway, api, db, cache, queue) oluşturulur. Yaml.
2. Yerel düzenlemeler - geçersiz kılma (v.gitignore).
3. .env Örnek tam ve güncel; 'make bootstrap' bunu '.env'e kopyalar.
4. Healthcheckler ve veritabanı/migrasyon bekleme betiği.
5. Dış sağlayıcılar için WireMock/Localstack/MinIO.
6. Siding ve 'make seed/migrate' cmdlets olarak göçler.
7. BuildKit + çok aşamalı, bağımlılık önbellekleri.
8. Hızlı bir başlangıç için Devcontainers/Makefile.
9. Araçlar için 'ekstralar' profilleri (Grafana/pgAdmin/Kafdrop).
10. CI aynı kompozisyonu kullanır (+ ci-overlide).
19) Anti-desenler
Her zaman çalışan 40 hizmet için "Monster-compose": profilleri açın.
Geliştiriciler arasında çelişen sert çivili bağlantı noktaları.
Git veya '.env'deki sırlar/anahtarlar Örnek '.
Testler için "İnternet'e bağımlılık (gerçek PSP/KYC).
Sağlık kontrolü/beklenti eksikliği - göç ve başlangıç yarışları.
Siding yok - lapa lapa entegrasyon testleri.
20) Alt satır
Compose, geliştirme hızının motorudur: bir dosya hizmet dünyanızı tanımlar ve profiller/geçersiz kılmalar esneklik sağlar. Satışlarla pariteyi koruyun, siding ve göçleri otomatikleştirin, moki ve TLS'yi "savaşta olduğu gibi" tutun, BuildKit yapılarını hızlandırın - ve iGaming/fintech satış senaryolarını test etmenin ve güvenli bir şekilde yeniden üretmenin kolay olduğu, çalışmanın uygun olduğu yerel bir ortama sahipsiniz.