💭 Minji's Archive

[s2n] 도커 기반 런타임 아키텍처 설계 + 배경지식 공부

November 16, 2025

이번에 내가 담당한 티켓은 “스캐너가 실행되는 타임 환경 전체 설계”하기이다. 즉 PyPI 패키지로 배포된 s2n이 어디서, 어떤 환경에서, 어떤 방식으로 동작할지를 결정하고 구현하는 것이다.

핵심 작업

1) prod/dev Docker 이미지 설계 및 빌드 (내가 핵심적으로 맡은 부분)

스캐너의 실제 실행 환경은 모두 도커 컨테이너 안에서 돌아간다. 그래서 나는 아래 내용들을 담당하게 된다.

  • Prod 이미지: 최종 사용자 실행용 (안정성/보안/재현성 중심)
  • Dev 이미지: 개발/디버깅용
  • Dockerfile 설계
  • 의존성 버전 고정
  • 이미지 크기 최적화
  • EntryPoint 설정
  • 빌드/태깅/레지스트리 push 자동화 => 실행 엔진을 만드는 작업

2) PyPI 패키지와 Docker 이미지 연결 (Wrapper Layer 설계) -> CLI 부분 (내담당 아님)

사용자는

pip install s2n
s2n scan --url http://target

으로 실행하지만 실제로는

docker run s2n/runtime:prod ...

이 도커 컨테이너가 실행된다. 즉 로컬 파이썬 코드 -> 도커 런타임으로 연결되는 bridge layer을 설계하는 작업을 해야 한다.

  • docker binary 탐지
  • 이미지 존재 여부 확인 -> 없으면 자동 pull
  • CLI 인자를 컨테이너 내부로 전달
  • subprocess로 docker run 실행
  • 결과를 파이썬에서 다시 받아 파싱 => PyPI 패키지의 핵심 기능

3) Dev/Prod 런타임 환경 완전 분리 -> 1,2 완성되면 자동으로 되어있을 예정

플러그인은 모두 컨테이너 안에서 돌아가지만, dev/prod는 완전 다른 이미지로 분리된다.

  • dev -> 디버깅/로깅/테스트 도구 포함
  • prod -> 최소 실행환경/보안 강화/크기 최소화

4) CI/CD + 이미지 빌드 자동화

이미지를 개발자가 직접 빌드하지 않도록 CI/CD에서 자동으로

  • 테스트
  • 이미지 빌드
  • 이미지 태깅 (Dev/prod)
  • 레지스트리 push
  • PyPI 패키지 빌드
  • 버전 동기화 까지.

필요한 배경지식

(1) Docker / Containerization 기본기

  • Dockerfile 구조
  • multi-stage build
  • ENTRYPOINT / CMD
  • image layer 구조
  • alpine / slim 기반 이미지 선택 기준
  • 볼륨 마운트 방식 (-v)
  • 네트워크 옵션
  • 이미지 태깅 규칙(최소 latest 금지)
  • 컨테이너 보안 기초(CAP_DROP 등)

(2) Docker Registry 사용 스캐너가 사용할 이미지는 외부 레지스트리에서 pull 되므로

  • Docker Hub
  • GitHub Container Registry(GHCR)
  • 이미지 push / pull
  • 태그 관리(dev, prod, v1.0.0 등)

(3) Python ↔ Docker 연결(Python Wrapper 기술)

  • Python subprocess
  • docker run command 구성
  • stdout/stderr 처리
  • JSON 직렬화/역직렬화
  • 예외 처리(이미지 없음, Docker daemon 꺼짐 등)

(4) PyPI Packaging

  • pyproject.toml
  • wheel / sdist
  • entry_points (CLI 명령 등록)
  • build backend (setuptools/hatch/pdm-backend)
  • MANIFEST.in / 패키지 포함 파일 관리
  • 버전 정책(semver)

도커와 PyPI가 분리되어 있으므로 Python 패키징도 제대로 이해해야 한다.

(5) CI/CD 파이프라인 설계 (GitHub Actions)

  • 테스트 후 이미지 빌드
  • 병렬 실행
  • 캐싱
  • Docker login + push
  • PyPI publish 자동화
  • 버전 bump 전략
  • 실패 시 rollback 전략

(6) 개발/운영 환경 분리 철학 (Environment Isolation)

  • dev 환경은 자유도·속도
  • prod 환경은 안정성·재현성
  • 각각의 lifecycle이 다르다는 점
  • plugin sandbox 필요성(보안)