Docker 봇 배포: 재현 가능한 이미지·영속 상태·비밀 설정

English version

TECH INSIGHT / EXPLAINED

Docker는 애플리케이션과 사용자 공간 의존성을 이미지로 묶습니다. 배포 차이를 줄일 수 있지만 호스트 커널·CPU 구조·마운트·설정·외부 서비스까지 같아지는 것은 아닙니다.

세 사람이 앱 이미지와 호스트 차이·영속 데이터·자격증명을 구분합니다.
AI로 제작한 설명용 일러스트. 세 사람이 앱 이미지와 호스트 차이·영속 데이터·자격증명을 구분합니다.

태그 이름보다 배포 산출물 고정

python:3.12-slim 같은 태그도 새 이미지로 바뀔 수 있습니다. 재현 가능한 배포에는 검토한 base digest·고정한 앱 의존성·빌드 이미지 digest·대상 플랫폼을 기록합니다. 나중에 같은 Dockerfile을 다시 빌드했다고 바이트까지 같지는 않습니다. 고정이 보안 업데이트 중단을 뜻하지 않도록 검토된 갱신 일정을 둡니다.

아래 시작 예제는 Linux Python 단일 파일 앱과 requirements.txt를 가정합니다. 릴리스에는 PYTHON_IMAGE 빌드 인자를 시험한 tag@sha256 digest로 바꿉니다. 의존성을 소스보다 먼저 복사하면 설치 캐시를 재사용할 수 있지만 실제 절감 시간은 빌드에 달렸습니다.

ARG PYTHON_IMAGE=python:3.12-slim
FROM ${PYTHON_IMAGE}
ENV PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN useradd --uid 10001 --create-home bot && mkdir /data && chown bot:bot /data
COPY --chown=bot:bot bot.py .
USER bot
CMD ["python", "-u", "bot.py"]

운영 상태와 자격증명을 이미지 밖으로

선택한 소스만 복사하더라도 민감 파일은 빌드 컨텍스트에서 제외합니다. 다음 .dockerignore 시작 예제를 프로젝트의 모든 자격증명·출력 경로에 맞게 조정하세요.

.git
.env*
secrets/
config*.ini
data/
logs/
__pycache__/
.venv/

Compose에 애플리케이션 규약 드러내기

배포 동작을 시험하는 동안 예제는 자동 재시작 없이 시작합니다. BOT_MODE·DATA_DIR·*_FILE 이름은 앱의 규약이므로 bot.py가 구현하고 잘못된 설정에서 실패하며 paper 모드의 주문 제출을 실제로 막아야 합니다. Docker가 그 의미를 추론하지는 않습니다. 로컬 비밀 파일을 접근 제한해 만들고 커밋하지 마세요.

services:
  trading-bot:
    build: .
    init: true
    restart: "no"
    environment:
      BOT_MODE: paper
      DATA_DIR: /data
      API_KEY_FILE: /run/secrets/api_key
      API_SECRET_FILE: /run/secrets/api_secret
    secrets:
      - api_key
      - api_secret
    volumes:
      - bot_data:/data
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
secrets:
  api_key:
    file: ./secrets/api_key.txt
  api_secret:
    file: ./secrets/api_secret.txt
volumes:
  bot_data: {}

무엇이 남는지 구분

같은 컨테이너를 중지·시작하면 쓰기 계층은 남지만 컨테이너를 제거하면 사라집니다. 이름 있는 volume은 명시적으로 제거하지 않는 한 교체 후에도 남으며 별도로 백업·복원 시험이 필요합니다. compose.yaml만 옮겨서는 DB·비밀 파일·레지스트리 접근까지 이전되지 않습니다.

Compose는 허용한 secret을 파일로 마운트합니다. 자격증명을 이미지에 굽지 않게 하지만 원본 파일을 암호화하거나 호스트 관리자에게서 보호하지는 않습니다. 비root 앱이 secret을 읽고 데이터 volume에 쓸 수 있는지 확인하되 누구나 쓸 수 있도록 권한을 풀지 않습니다.

시작·종료·복구 시험

Docker가 있는 시험 환경에서 docker compose config --quiet와 이미지 빌드를 수행한 뒤 가상 자격증명·모의 어댑터로 시작을 검증합니다. 컨테이너 교체 후 영속성·SIGTERM 정상 종료·재시작 상태 대조를 시험하세요. health 상태만으로 Docker가 멈춘 프로세스를 재시작하지는 않습니다. 복구가 입증되면 수동 중지 동작을 이해한 상태에서 unless-stopped 같은 정책을 선택할 수 있습니다.

시간대 처리는 앱에서 명시합니다. 필요한 시간대 자료 없이 TZ만 설정하면 부족합니다. Python 비버퍼 출력은 빠른 로그 확인을 돕고 rotation은 디스크 사용을 제한합니다. Linux 컨테이너에서 Windows COM 의존성을 그대로 실행할 수는 없습니다. 여기 구성은 문법을 점검했으며 컨테이너 런타임 빌드를 했다고 주장하지 않습니다.

공식 자료와 함께 읽기

Docker build practices · Docker persistence · Compose secrets · Restart policies · Python timezone data

내용·예제 검토: 2026-09-29

댓글