テクノロジーとインフラストラクチャ→Docker ComposeとDev環境
Docker ComposeとDev環境
1)なぜ作曲するのか
Docker Composeは、アプリケーション、データベース、キュー、キャッシュ、リバースプロキシ、iocサービスなど、ロケール/CIで本番スタックのレプリカを作成するための簡単な方法です。目的:- 売上(イメージ、変数、ネットワーク)とのパリティ→「私のために働く」より少ない。
- 初心者のための速い開始→「メイク」と戦いに。
- 開発者/ブランチごとに分離されたスタンド→競合のない並列作業。
- 実際の依存関係に対する統合テスト。
2)基本的なリポジトリ構造
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 (опционально)
推奨事項:
- 作曲してください。yaml-dev/CIで同じ「skeleton」(サービス、ネットワーク、ボリューム)を記述します。
- override-ローカル編集のみ:ディレクトリマッピング、ポート、デバッグフラグ。
- 。env。example→開発者は'。env'にコピーし、値を置き換えます。
3)フレームワークの構成。yaml(例)
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: {}
キーポイント:
- Traefik/NGINXをゲートウェイとして:ルーティングスキームをセールスに近づけます。
- Healthcheck and depends_on with 'condition: service_healthy' (v3では待機スクリプトを介して)-整然としたスタート。
- persistence (DB/cache)用のボリュームと、コード用のバインドマウント(ホットリロード)。
4)プロファイルと複数のファイル
プロファイル('profiles: [dev、 ci、 extras]') include/exclude services ('docker compose --profile extras up -d')。
複数のファイル:- 'docker compose -f compose。yaml -fを構成します。開発しました。yaml up'-コンフィギュレーションのマージ。
- 「コンポーズ」ヤムルは基本だ。
- 「コンポーズ」開発しました。yaml'-バインドマウント、デバッグ、phicheflags。
- 「コンポーズ」エキストラ。yaml'-インストゥルメンタル(Grafana、 pgAdmin、 Kafdrop)。
- 「コンポーズ」CI。yaml'-"head without graphics'、 bind-mountsなし。
5)変数、秘密、設定
。env-変数の共通ソース:ホスト、テストデータベースクレジット、フラグ。
我々は明示的に開発に秘密を保持していません。私たちは以下を使用します:- 地元のダミーの秘密(スタブキー)、
- skinny-vault/sopsとの統合により、機密性を高めます。
- 原則:最低必要なデータ。PAN/PII-トークン/修正。
6)アセンブリおよび速度
6.1マルチステージ+ビルドキット
ターゲット'base'、 'dev'、 'prod'のDockerfile;依存関係の共有キャッシュレイヤ。
BuildKitを含める:'DOCKER_BUILDKIT=1'(またはconfig)。
キャッシュ:'--mount=type=cache、 target =/root/。cache/……'はpip/npm/maven用です。
6.2高速サイクル
Bind-mount(ホットリロード)(nodemon、 uvicorn --reload、 Spring Devtools)。
望ましいものだけのアセンブリを持つ個別の開発ターゲット。
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、移行、サイディング
Migrations (Flyway/Liquibase/Alembic/Prisma)は'db'の開始後にフックスクリプトによって起動される(healthcheckを待つ)。
サイディング:据え付け品が付いている別の'種子'容器;繰り返し可能およびidempotent。
データスナップショット:'reset-dbスクリプトで'pgdata'ボリュームをリセット/復元できます。SH'。
8)ブローカー、キャッシュ、CDC
Kafka/Rabbit/Redpanda-prodのように(最小構成)。
RedisとAOFはリアリズムのために含まれています。
CDCコネクタ(オプション):統合分析テスト用の別サービスのDebezium。
9)外部サプライヤーモック
REST用のWireMock/Prism、複雑なシナリオ用のMockServer。
手紙のためのMailhog/SMTP4Dev。
クラウドストアとS3互換性のためのLocalstack/MinIO。
政治:すべての外部PSP/KYC/KMS-「インターネット上」ではなく、契約(OpenAPI)の下のモックハブを通じて。
10)逆プロキシおよびTLS
Traefik/NGINXは、ローカルドメイン('。test'、 '。local')にサービスを配布します'):
「アピ」ローカル。テスト'、'mockpsp。ローカル。「テスト」
TLS:信頼できるローカル証明書を発行して、HSTS/secure-cookieをテストします。
それが本当に重要である場合にのみ粘着性のあるセッションをオンにします。
11)開発者プロファイル: ノード/Python/Java
ノード: 'node_modules'をキャッシュ(ボリューム)としてマウントしてインストールを高速化します。Windows/WSLでは'CHOKIDAR_USEPOLLING=1'
Python: 'pip cache'ボリューム、'watchfiles'/'uvicorn --read'。
Java:依存関係を持つJRebel/Devtools、 'mvn -T 1C -o'+レイヤー。
12)テストおよび質
Composeネットワーク内の統合テストレース:'docker compose run test'。
Testcontainers (JVM/Node/Python/。NET用)は、フルスタックなしでユニットを統合するための良いオプションです。
CIの→ゲートモックハブとの契約テスト。
Linters/Pre-commit:再現性のためにコンテナで実行します。
13) Devcontainersと「IDE-as-code」
'devcontainer。json'は開発者(CLI、 SDK、 linters)のイメージを修正し、プロジェクトをマウントし、'postCreateCommand'を実行します。
利益:同じツールは、ホストを「詰まらせないでください」、新しいマシンは数分で準備ができています。
14)開発におけるセキュリティ
アプリケーションイメージのルートなし;'readOnlyRootFilesystem'可能な場合。
一時的にもバトルキーや秘密はありません。
ログ-PII/PANなし。フォーマッターレベルでのマスキング。
ポートとネットワークの分離:ゲートウェイ経由の外部アクセスのみ。
15)ロケールでのFinOps/パフォーマンス
リソースの制限:'deploy。リソース。limits '(Composeは部分的に読みますが、規律に役立ちます)。
ファンアウトの削減(デフォルトサービスの削減;extras-プロファイル)。
パッケージマネージャのBuildKitキャッシュとボリュームキャッシュ。
16) CI-作曲
同じ'composeを使用します。yaml'+'を作成します。CI。バインドマウントなしのyaml。
依存性キャッシュは、ジョブ/レイヤー間の添付可能なボリュームのようなものです。
並列jabs: 'name:' Composeではスタンドが競合しないように異なる(またはブランチによる接頭辞)。
17)トレーブルシューティング
'docker compose ps'/'logs -f'/'exec'-基本診断。
ComposeネットワークのDNS(名前によるサービス)を確認します。
macOS/Windowsでbind-mountが「遅くなる」-':cached'/':delegated'またはMutagen/virtiofs。
ヘルスチェックは「緑」ですが、サービスは「死んでいる」:あなたのuppkaの「準備」と移住の順序を確認してください。
18)実装チェックリスト
1.作成中のベーススタック(ゲートウェイ、api、 db、キャッシュ、キュー)。ヤムルだ。
2.ローカル編集-上書き(v。gitignore)。
3。 。env。例fullとcurrent;'make bootstrap'は'。env'にコピーします。
4.Healthchecksとデータベース/移行待ちスクリプト。
5.外部プロバイダ向けのWireMock/Localstack/MinIO。
6.'make seed/migrate'コマンドレットとしてのサイディングとマイグレーション。
7.BuildKit+マルチステージの依存性キャッシュ。
8.高速起動のためのDevcontainers/Makefile。
9.ツールの'Extras'プロファイル(Grafana/pgAdmin/Kafdrop)。
10.CIは同じcompose(+ci-overlide)を使用します。
19)アンチパターン
「Monster-compose」は、常に実行されている40のサービスのために、プロファイルをオンにします。
開発者間で競合するハードネイルポート。
Gitまたは'。envのSecrets/keys。例'。
テストのための「インターネット」への依存(実際のPSP/KYC)。
健康チェック/期待の欠如-移行とレースを開始します。
siding→flakyの統合テスト無し。
20)ボトムライン
Composeは開発スピードのエンジンです。1つのファイルはサービスの世界を説明し、プロファイル/オーバーライドは柔軟性を提供します。販売とのパリティを維持し、サイディングと移行を自動化し、モキとTLSを「戦いのように」保ち、BuildKitのビルドをスピードアップします。iGaming/Fintechの販売シナリオをテストして安全に再現することができ、作業が便利なローカル環境があります。