기술 및 인프라 → 도커 컴파일 및 개발 환경
도커 컴파일 및 개발 환경
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-v/CI에 대해 동일한 "스켈레톤" (서비스, 네트워크, 볼륨) 을 설명합니다.
- 디렉토리 매핑, 포트, 디버그 플래그: 로컬 편집 만 재생합니다.
- .env. 예 → 개발자가 '.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는 게이트웨이: 라우팅 체계를 판매 체계에 더 가깝게 만듭니다.
- '상태: service _ health' (대기 스크립트를 통한 v3) 로 건강 점검하고 의존합니다.
- 지속성 볼륨 (DB/캐시) 및 코드 바인드 마운트 (핫 재 장전).
4) 프로필 및 여러 파일
프로필 ('프로파일: [dev, ci, extras]') 에는 서비스/제외 ('도커 작성-프로파일 엑스트라 업 -d') 가 포함됩니다.
여러 파일:- '도커 작곡 -f 작곡. yaml-f 작곡. 개발자. yaml up '-구성 병합.
- '작곡. yaml '은 기본입니다.
- '작곡. 개발자. yaml '- 바인드 마운트, 데바 그, phicheflags.
- '작곡. 엑스트라. yaml '- 도구 (Grafana, pgAdmin, Kafdrop).
- '작곡. ci. yaml '- "그래픽이없는 헤드", 바인드 마운트 없음.
5) 변수, 비밀 및 설정
.env-공통 변수 소스: 호스트, 테스트 데이터베이스 크레딧, 플래그.
우리는 비밀을 명시 적으로 유지하지 않습니다. 우리는 다음을 사용합니다:- 로컬 더미 비밀 (스터브 키),
- 추가적인 민감성을 위해 스키니 볼트/sops와 통합.
- 원리: 최소 필수 데이터. PAN/PII-토큰/수정.
6) 어셈블리와 속도
6. 1 다단계 + 빌드 키트
대상 '기본', '개발', 'prod' 가있는 도커 파일; 종속성을위한 공유 캐시 계층.
빌드 키트 포함: 'DOCKER _ BUILDKIT = 1' (또는 설정).
캐싱: pip/npm/maven의 경우 '-mount = tip = cash, 대상 =/rout/.cash/...'.
6. 2 빠른주기
Bind-mount ко계정 + 핫 재 장전 (nodemon, uvicorn-readow, Spring Devtools).
원하는 것의 어셈블리만을 가진 별도의 개발 대상.
메이크 파일 지정값: '메이크업', '메이크 다운', '로그 만들기', '재건', '씨앗 만들기'.
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, 마이그레이션, 사이딩
마이그레이션 (Flyway/Liquibase/Alembic/Prisma) 은 'db' 가 시작된 후 (건강 점검을 기다리는) 후크 스크립트로 시작됩니다.
사이딩: 비품이있는 별도의 '씨앗' 용기; 반복 가능하고 유쾌합니다.
데이터 스냅 샷: 'pgdata' 볼륨을 'reset-db 스크립트로 재설정/복원 할 수 있습니다. sh '.
8) 중개인, 캐시, CDC
Kafka/Rabbit/Redpanda-prod (최소 조합) 에서와 같이.
AOF와 함께한 Redis는 사실주의에 포함되었습니다.
CDC 커넥터 (옵션): 통합 분석 테스트를위한 별도의 서비스에서 Debezium.
9) 외부 공급 업체 모크
REST 용 WireMock/Prism, 복잡한 시나리오 용 MockServer.
문자에 대한 Mailhog/SMTP4Dev.
클라우드 저장소 및 S3 호환성을위한 Localstack/MinIO.
정치: 모든 외부 PSP/KYC/KMS - "인터넷" 이 아닌 계약에 따른 모의 허브 (OpenAPI) 를 통해.
10) 역 프록시 및 TLS
Traefik/NGINX는 서비스를 로컬 도메인 ('.test', '.local') 으로 배포합니다
'api. 현지. 테스트 ',' mockpsp. 현지. 테스트 '.
TLS: mccert에서 HSTS/보안 쿠키를 테스트하기 위해 신뢰할 수있는 로컬 인증서를 발급합니다.
정말 중요한 경우에만 끈적 끈적한 세션을 켜십시오.
11) 개발자 프로필: 노드/파이썬/자바
노드: 설치 속도를 높이기 위해 'node _ modules' 를 캐시 (볼륨) 로 마운트하십시오. Windows/WSL에서 'CHOKIDAR _ USEPOLLING = 1'.
파이썬: 'pip cash' ка) 볼륨, 'watchfiles '/' uvicorn-radowed'.
Java: JRebel/Devtools, 종속성이있는 'mvn -T 1C-o' + 계층.
12) 테스트 및 품질
Compose 네트워크 내부의 통합 테스트 레이스: '도커 작성 런 테스트'.
테스트 컨테이너 (JVM/노드/파이썬/.NET 용) 는 전체 스택없이 장치 통합에 적합한 옵션입니다.
CI의 → 게이트 모의 허브와 계약 테스트.
라이터/사전 커밋: 반복성을 위해 컨테이너에서 실행하십시오.
13) 전복 컨테이너 및 "IDE-as-code"
'데브 컨테이너. json은 '개발자의 이미지 (CLI, SDK, 린터) 를 수정하고 프로젝트를 마운트하며' postCreateCommand '를 실행합니다.
이익: 동일한 도구, 호스트를 "막히지" 않으면 새 기계가 몇 분 안에 준비됩니다.
14) 개발의 보안
응용 프로그램에 루트가없는 이미지; 가능하면 'readOnlyRootFilesystem'.
일시적으로도 전투 키/비밀이 없습니다.
로그-PII/PAN이없는; 포터 레벨에서 마스킹.
포트 및 네트워크 분리: 게이트웨이 만 통한 외부 액세스.
15) 로케일의 FinOps/성능
제한 자원: '배포. 자원. 한계 '(컴포지션은 부분적으로 읽지 만 징계에 도움이됩니다).
팬 아웃 감소 (기본 서비스 감소; 엑스트라-프로필).
패키지 관리자를위한 빌드 키트 캐시 및 볼륨 캐시.
16) CI 복사
같은 작곡을 사용하십시오. yaml '+' 작곡. ci. 바인드 마운트없이 yaml '.
의존성 캐시는 작업/레이어 사이에 부착 가능한 볼륨과 같습니다.
병렬 bs: '이름:' 은 Compose (또는 분기 별 접두사) 가 다르므로 스탠드가 충돌하지 않습니다.
17) Trableshooting
'도커 작성 ps '/' logs -f '/' execs' -기본 진단.
컴포지 네트워크에서 DNS를 확인하십시오 (이름으로 서비스).
macOS/Windows에서 바인드 마운트가 "느려지면" - ': 캐시 된 '/': 위임 된' 또는 Mutagen/virtiofs입니다.
Healthchek는 "녹색" 이지만 서비스는 "죽었습니다": uppka의 '준비' 와 이주 순서를 확인하십시오.
18) 구현 점검표
1. 작성시 기본 스택 (게이트웨이, 아피, db, 캐시, 큐). yaml.
2. 로컬 편집 - 재정의 (v.gitignore).
3. .env. 예제 전체 및 전류; '부트 스트랩 만들기' 는 '.env' 로 복사합니다.
4. 건강 검진 및 데이터베이스/마이그레이션 대기 스크립트
5. 외부 제공 업체를위한 WireMock/Localstack/MinIO.
6. '씨앗/마이그레이션' cmdlets로 사이딩 및 마이그레이션.
7. BuildKit + 다단계 종속성 캐시.
8. 빠른 시작을위한 Devconteries/Makefile.
9. 도구 용 'Extras' 프로필 (Grafana/pgAdmin/Kafdrop).
10. CI는 동일한 작곡 (+ ci-overlide) 을 사용합니다.
19) 반 패턴
항상 실행되는 40 개의 서비스에 대한 "몬스터 작성": 프로필을 켜십시오.
개발자간에 충돌하는 딱딱한 포트.
Git 또는 '.env.의 비밀/키 예 '.
테스트를위한 "인터넷" (실제 PSP/KYC) 에 의존합니다.
건강 점검/기대 부족-마이그레이션 및 레이스 시작.
사이딩 → 벗겨진 통합 테스트가 없습니다.
20) 결론
컴포지션은 개발 속도의 엔진입니다. 하나의 파일은 서비스 세계를 설명하고 프로필/오버 라이드는 유연성을 제공합니다. 판매, 자동화 사이딩 및 마이그레이션과의 패리티를 유지하고, 모키와 TLS를 "전투에서와 같이" 유지하고, 빌드 키트 빌드 속도를 높이십시오. 작업하기에 편리하고, 테스트하기 쉽고, 안전하게 iGaming/fintech 판매 시나리오.