본문 바로가기

Server Story....

도커(Docker)로 파이썬 에이전트 24시간 무중단 가동하기

반응형

파이썬 에이전트



1. 도입 및 배경 (Why?) 💡

우리가 만든 파이썬 에이전트가 훌륭하게 작동하더라도, 터미널 창을 닫으면 종료되거나 서버 재부팅 시 수동으로 다시 켜야 한다면 '자동화'라고 부르기 민망합니다. 😅

진정한 시니어 개발자는 **도커(Docker)**를 사용합니다.

도커는 내 프로그램을 하나의 **'독립된 방(Container)'**에 가두어, 어떤 환경에서도 동일하게 작동하고 서버가 켜질 때마다 자동으로 실행되게 만듭니다. 오늘 이 과정을 통해 에이전트에 불사(不死)의 생명력을 불어넣어 보겠습니다.


2. 시스템 구성도 (What?) 🏗️

에이전트가 컨테이너라는 보호막 안에서 외부(MSSQL, Slack)와 통신하며 주기적으로 임무를 수행하는 구조입니다.

Plaintext
 
  [ Host OS (Linux) ]
          |
  [ Docker Engine ] <----( Restart Policy: Always )
          |
    [ Container ]
    +---------------------------+
    |  Python Agent (Cron/Loop) | ----> Slack (Alert)
    |  ODBC Driver / Pandas     | <---- MSSQL (Data)
    +---------------------------+

3. 핵심 작업: Dockerfile 작성하기 🛠️

도커 이미지의 '설계도'를 그리는 단계입니다. 에이전트 폴더 안에 Dockerfile이라는 이름의 파일을 만드세요.

Dockerfile
 
# 1. 가벼운 파이썬 공식 이미지를 기반으로 시작
FROM python:3.9-slim

# 2. MSSQL 접속을 위한 시스템 패키지 설치 (중요!)
RUN apt-get update && apt-get install -y \
    curl gnupg unixodbc-dev \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && apt-get clean

# 3. 작업 디렉토리 생성
WORKDIR /app

# 4. 필수 라이브러리 복사 및 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 5. 소스 코드 전체 복사
COPY . .

# 6. 컨테이너 실행 시 에이전트 시작
CMD ["python", "main.py"]

4. 무중단 가동의 핵심: Docker Compose ⚙️

서버가 죽어도 다시 살아나게 하는 restart: always 옵션을 적용할 차례입니다.

■ docker-compose.yml

YAML
 
version: '3.8'

services:
  news-agent:
    build: .
    container_name: python-blog-agent
    restart: always  # <-- 서버 재부팅 시 자동 시작 핵심 옵션!
    volumes:
      - ./logs:/app/logs  # 로그 데이터 보존을 위한 볼륨 매핑
    environment:
      - DB_IP=YOUR_IP
      - DB_PW=YOUR_PASSWORD

5. 트러블슈팅: 당신이 마주칠 삽질 기록 🛠️

🚨 에러: 컨테이너 내부 시간이 한국 시간과 달라요!

  • 원인: 도커 컨테이너의 기본 시간은 UTC(세계 표준시)입니다.
  • 해결: docker-compose.yml의 environment 섹션에 TZ=Asia/Seoul을 추가하고, 볼륨에 /etc/localtime:/etc/localtime:ro를 매핑하세요.

🚨 에러: ODBC Driver 18을 찾을 수 없대요!

  • 원인: 로컬 리눅스에 깔린 드라이버와 컨테이너 내부 드라이버는 별개입니다.
  • 해결: 위 Dockerfile의 **2번 섹션(시스템 패키지 설치)**이 정확히 포함되었는지 확인하세요.

🔍 더 알아보기

이 시스템을 더 고도화하고 싶다면, 제 블로그 검색창에 아래 키워드를 입력해 보세요!

  • "Slack 알림" : 에이전트가 죽었을 때 즉시 보고받는 법
  • "Nginx 프록시" : 에이전트 관리 페이지를 도메인으로 연결하는 법
  • "MSSQL 보안" : 컨테이너와 윈도우 서버 간 보안 통신 설정
반응형