4.10.5. [선택] Docker를 이용한 컨테이너화 및 배포

자동매매 시스템 배포의 또 다른 방법은 Docker 컨테이너를 활용하는 것입니다. Docker는 애플리케이션과 그 의존성을 패키징하는 데 사용됩니다. 이를 통해 환경에 구애받지 않고 일관된 실행 환경을 제공합니다. 컨테이너는 가볍고 이식성이 뛰어나 클라우드 환경에 적합합니다. Docker를 사용하면 배포 과정을 단순화하고, 시스템 관리를 효율적으로 수행할 수 있습니다.

이 섹션에서는 Docker를 사용하여 자동매매 시스템을 컨테이너화하는 방법을 안내합니다. Dockerfile 작성, 이미지 빌드, 컨테이너 실행 과정을 단계별로 설명합니다. Docker Compose를 사용하여 여러 컨테이너를 함께 관리하는 방법도 소개합니다. Docker를 활용하여 자동매매 시스템 배포를 간소화하고 관리 효율성을 높일 수 있습니다.

단계 1: Docker 설치 및 설정

OCI Compute 인스턴스에 Docker를 설치합니다. Docker 공식 문서를 참고하여 운영체제에 맞는 설치 방법을 따릅니다. Ubuntu의 경우, 다음 명령어를 사용하여 Docker를 설치할 수 있습니다.

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

Docker 설치 후, 현재 사용자를 docker 그룹에 추가합니다. 이렇게 하면 sudo 없이 Docker 명령어를 실행할 수 있습니다.

sudo usermod -aG docker $USER
newgrp docker

단계 2: Dockerfile 작성

자동매매 시스템을 컨테이너화하기 위한 Dockerfile을 작성합니다. Dockerfile은 이미지를 빌드하기 위한 명령어 집합입니다. Dockerfile은 프로젝트 루트 디렉토리에 위치해야 합니다.

# 사용할 베이스 이미지 정의
FROM python:3.9-slim-buster

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일 복사
COPY requirements.txt .

# 의존성 설치
RUN pip install --no-cache-dir -r requirements.txt

# 소스 코드 복사
COPY . .

# 환경 변수 설정 (예시)
ENV UPBIT_ACCESS_KEY="YOUR_UPBIT_ACCESS_KEY"
ENV UPBIT_SECRET_KEY="YOUR_UPBIT_SECRET_KEY"

# 실행 명령어 정의
CMD ["python", "main.py"]
  • FROM: 사용할 베이스 이미지를 지정합니다. 여기서는 Python 3.9 슬림 버전을 사용합니다.
  • WORKDIR: 컨테이너 내에서 작업 디렉토리를 설정합니다.
  • COPY: 로컬 파일을 컨테이너 내부로 복사합니다.
  • RUN: 컨테이너 내부에서 명령어를 실행합니다. 여기서는 requirements.txt에 정의된 파이썬 라이브러리를 설치합니다.
  • ENV: 환경 변수를 설정합니다. API 키와 같은 민감한 정보는 환경 변수로 설정하는 것이 좋습니다.
  • CMD: 컨테이너가 시작될 때 실행할 명령어를 정의합니다.

단계 3: Docker 이미지 빌드

Dockerfile을 사용하여 Docker 이미지를 빌드합니다. 프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다.

docker build -t autotrade:latest .
  • docker build: Docker 이미지를 빌드하는 명령어입니다.
  • -t autotrade:latest: 이미지 이름과 태그를 지정합니다. autotrade는 이미지 이름이고, latest는 태그입니다.
  • .: Dockerfile이 위치한 현재 디렉토리를 지정합니다.

이미지 빌드 과정에서 Dockerfile에 정의된 명령어들이 순차적으로 실행됩니다. 빌드 과정이 완료되면 docker images 명령어를 사용하여 이미지가 생성되었는지 확인할 수 있습니다.

단계 4: Docker 컨테이너 실행

빌드된 Docker 이미지를 사용하여 컨테이너를 실행합니다.

docker run -d --name autotrade-container autotrade:latest
  • docker run: Docker 컨테이너를 실행하는 명령어입니다.
  • -d: 컨테이너를 백그라운드에서 실행합니다 (detached mode).
  • --name autotrade-container: 컨테이너 이름을 지정합니다.
  • autotrade:latest: 실행할 이미지 이름과 태그를 지정합니다.

컨테이너가 정상적으로 실행되었는지 확인하려면 docker ps 명령어를 사용합니다.

단계 5: Docker 컨테이너 로그 확인

컨테이너의 로그를 확인하여 시스템 상태를 모니터링합니다.

docker logs autotrade-container
  • docker logs: 컨테이너의 로그를 표시하는 명령어입니다.
  • autotrade-container: 확인할 컨테이너 이름을 지정합니다.

단계 6: Docker Compose를 이용한 다중 컨테이너 관리 (선택 사항)

자동매매 시스템이 여러 컨테이너로 구성된 경우, Docker Compose를 사용하여 관리할 수 있습니다. Docker Compose는 여러 컨테이너를 정의하고 실행하는 데 사용되는 도구입니다.

1. docker-compose.yml 파일 작성:

프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성합니다.

version: "3.9"
services:
  autotrade:
    image: autotrade:latest
    container_name: autotrade-container
    restart: on-failure
    environment:
      UPBIT_ACCESS_KEY: ${UPBIT_ACCESS_KEY}
      UPBIT_SECRET_KEY: ${UPBIT_SECRET_KEY}
    # volumes: # 필요한 경우 볼륨 마운트 설정
    #   - ./data:/app/data
  # 다른 서비스 정의 (예: 데이터베이스)
  # database:
  #   image: postgres:13
  #   ...
  • version: Docker Compose 파일 버전을 지정합니다.
  • services: 실행할 서비스를 정의합니다.
    • autotrade: 자동매매 시스템 컨테이너를 정의합니다.
      • image: 사용할 이미지 이름과 태그를 지정합니다.
      • container_name: 컨테이너 이름을 지정합니다.
      • restart: 컨테이너가 실패하면 자동으로 재시작하도록 설정합니다.
      • environment: 환경 변수를 설정합니다.
      • volumes: 로컬 디렉토리를 컨테이너 내부로 마운트합니다. 데이터 저장 등에 사용됩니다.

2. Docker Compose 실행:

프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다.

docker-compose up -d
  • docker-compose up: Docker Compose 파일을 실행합니다.
  • -d: 컨테이너를 백그라운드에서 실행합니다.

3. Docker Compose 중지:

docker-compose down

단계 7: Docker 이미지 OCI Container Registry에 Push (선택 사항)

생성한 Docker 이미지를 Oracle Cloud Infrastructure (OCI) Container Registry에 Push하여 관리할 수 있습니다. OCI Container Registry는 Docker 이미지를 안전하게 저장하고 관리할 수 있는 서비스입니다.

1. OCI CLI 설치 및 설정:

OCI CLI를 설치하고 OCI 계정에 연결합니다. OCI CLI 설치 및 설정 방법은 Oracle 공식 문서를 참고합니다.

2. Docker 로그인:

OCI Container Registry에 Docker로 로그인합니다.

docker login <region-key>.ocir.io
  • <region-key>: OCI 리전 키입니다. (예: iad – Ashburn, phx – Phoenix)

로그인 시 OCI 사용자 이름과 Auth Token을 입력합니다. Auth Token은 OCI 콘솔에서 생성할 수 있습니다.

3. 이미지 태깅:

Docker 이미지를 OCI Container Registry에 Push하기 위해 태깅합니다.

docker tag autotrade:latest <region-key>.ocir.io/<tenancy-name>/autotrade:latest
  • <region-key>: OCI 리전 키입니다.
  • <tenancy-name>: OCI 테넌시 이름입니다.

4. 이미지 Push:

태깅된 이미지를 OCI Container Registry에 Push합니다.

docker push <region-key>.ocir.io/<tenancy-name>/autotrade:latest

단계 8: 보안 고려 사항

  • 환경 변수 관리: Docker 컨테이너 내부에 API 키와 같은 민감한 정보를 직접 포함하지 마세요. 환경 변수를 사용하고, Docker Compose를 사용하는 경우에도 환경 변수를 안전하게 관리해야 합니다.
  • 이미지 스캔: Docker 이미지를 정기적으로 스캔하여 보안 취약점을 확인합니다.
  • 최소 권한: 컨테이너 내부에서 실행되는 프로세스에 필요한 최소한의 권한만 부여합니다.
  • 네트워크 정책: 컨테이너 간의 네트워크 통신을 제어하기 위해 네트워크 정책을 설정합니다.

요약:

이 섹션에서는 Docker를 사용하여 자동매매 시스템을 컨테이너화하고 배포하는 방법을

위로 스크롤