티스토리 뷰

카테고리 없음

Python 데몬 실습하기

Band Of Story 2024. 10. 19. 11:17

목차



    docker & Python Logo

    현재 webdb 컨테이너가 설정된 환경에서, Python 데몬을 운영하는 새로운 Docker 컨테이너를 추가하려고 합니다. 이 Python 데몬은 30초마다 MySQL test 테이블의 행(row) 수를 확인하는 역할을 수행할 것입니다. 프로젝트 루트 디렉토리 구조도 포함해서 순차적으로 설명드릴게요.

    1단계: 프로젝트 디렉토리 구조

    현재 프로젝트 루트 디렉토리는 아래와 같이 구성되어 있습니다.

    apache-mysql-docker/
    │
    ├── Dockerfile             # Apache 웹 서버용 Dockerfile
    ├── db/                    # MySQL 데이터베이스 설정용 디렉토리
    │   └── Dockerfile         # MySQL Dockerfile
    ├── html/                  # Apache 서버에 배포할 HTML 파일
    │   └── index.html         # 간단한 HTML 파일
    ├── docker-compose.yml     # Docker Compose 파일
    └── daemon/                # Python 데몬을 위한 디렉토리
        ├── Dockerfile         # Python 데몬 컨테이너를 위한 Dockerfile
        └── count_rows.py      # Python 스크립트

    2단계: Python 프로그램 작성하기

    먼저, Python 데몬 프로그램을 작성합니다. apache-mysql-docker/daemon/ 디렉토리를 생성하고, 그 안에 count_rows.py 파일을 작성합니다.

    daemon/count_rows.py

    import time
    import mysql.connector
    from mysql.connector import Error
    
    # MySQL에 연결하기 위한 설정
    db_config = {
        'user': 'myuser',
        'password': 'myuser_password',
        'host': 'db',  # Docker Compose에서 MySQL 컨테이너의 서비스 이름
        'database': 'mydb',
    }
    
    def log_message(message):
        """상태를 콘솔에 출력하는 함수."""
        print(f"[INFO] {time.strftime('%Y-%m-%d %H:%M:%S')} - {message}", flush=True)
    
    def count_rows():
        connection = None
        try:
            log_message("Attempting to connect to MySQL...")
            # MySQL 연결 시도
            connection = mysql.connector.connect(**db_config)
            
            if connection.is_connected():
                log_message("Successfully connected to MySQL")
                cursor = connection.cursor()
    
                # 테이블의 row 수를 확인하는 SQL 쿼리 실행
                log_message("Executing query: SELECT COUNT(*) FROM test")
                cursor.execute("SELECT COUNT(*) FROM test")
                row_count = cursor.fetchone()[0]
    
                log_message(f"Row count: {row_count}")
            else:
                log_message("Failed to connect to MySQL")
    
        except Error as err:
            log_message(f"Error while connecting to MySQL: {err}")
        finally:
            if connection and connection.is_connected():
                log_message("Closing MySQL connection")
                cursor.close()
                connection.close()
            else:
                log_message("MySQL connection was not established")
    
    if __name__ == "__main__":
        log_message("Starting Python daemon")
        # MySQL 서버에 연결을 반복적으로 시도
        while True:
            try:
                count_rows()
            except Error as e:
                log_message(f"Retrying in 5 seconds... Error: {e}")
                time.sleep(5)  # 연결 실패 시 5초 후 재시도
            log_message("Sleeping for 30 seconds before the next query")
            time.sleep(30)  # 30초마다 실행
    

    이 Python 프로그램은 MySQL test 테이블의 행 수를 30초마다 출력하는 간단한 데몬입니다. hostdb를 지정하여 MySQL 컨테이너와 연결할 수 있습니다.

    3단계: Python Dockerfile 작성하기

    이제 이 Python 프로그램을 실행할 Docker 이미지를 빌드하기 위해 Dockerfile을 작성합니다. apache-mysql-docker/daemon/ 디렉토리 내에 Dockerfile을 생성합니다.

    daemon/Dockerfile

    # Python 3.9 slim 베이스 이미지 사용
    FROM python:3.9-slim
    
    # 작업 디렉토리 설정
    WORKDIR /app
    
    # Python 프로그램 복사
    COPY count_rows.py .
    
    # MySQL 커넥터 설치
    RUN pip install mysql-connector-python
    
    # Python 스크립트 실행
    CMD ["python", "count_rows.py"]

    이 Dockerfile은 Python 3.9 slim 이미지를 기반으로 MySQL과 통신하기 위한 mysql-connector-python 패키지를 설치한 뒤, Python 스크립트를 실행하는 설정입니다.

    4단계: Docker Compose에 Python 데몬 컨테이너 추가

    이제 docker-compose.yml 파일에 새로운 Python 데몬 컨테이너를 추가합니다. docker-compose.yml 파일은 이미 webdb 서비스가 설정되어 있는 상태입니다.

    docker-compose.yml

    version: '3.8'
    
    services:
      web:
        build: .
        ports:
          - "8080:80"
        depends_on:
          - db
        networks:
          - webnet
    
      db:
        build: ./db
        environment:
          MYSQL_ROOT_PASSWORD: root_password
          MYSQL_DATABASE: mydb
          MYSQL_USER: myuser
          MYSQL_PASSWORD: myuser_password
        ports:
          - "3306:3306"
        volumes:
          - dbdata:/var/lib/mysql
        networks:
          - webnet
    
      python-daemon:
        build: ./daemon  # Python 데몬 Dockerfile이 위치한 디렉토리
        depends_on:
          - db  # db 서비스가 준비된 후 실행
        networks:
          - webnet  # 같은 네트워크에 연결
    
    volumes:
      dbdata:
    
    networks:
      webnet:

    이 설정에서는 python-daemon이라는 새로운 서비스를 추가했습니다. build 옵션에서 ./daemon 디렉토리 내에 있는 Dockerfile을 사용해 Python 데몬 컨테이너를 빌드하고, depends_on 옵션으로 MySQL이 준비된 후에 실행되도록 설정했습니다.

    5단계: Docker 컨테이너 빌드 및 실행

    이제 모든 설정이 완료되었으므로, docker-compose를 사용하여 컨테이너를 빌드하고 실행합니다.

    docker-compose up --build

    이 명령어는 docker-compose.yml에 정의된 모든 서비스를 빌드하고 실행합니다.

    • web: Apache 웹 서버 컨테이너
    • db: MySQL 데이터베이스 컨테이너
    • python-daemon: Python 데몬 컨테이너 (30초마다 MySQL 테이블의 행 수를 출력)

    6단계: Python 데몬 로그 확인

    Python 데몬 컨테이너가 제대로 동작하는지 확인하기 위해 로그를 확인합니다.

    docker-compose logs -f python-daemon

    이 명령어를 실행하면 Python 데몬 컨테이너의 로그를 실시간으로 확인할 수 있습니다. 30초마다 test 테이블의 행 수가 출력됩니다.

    7단계: 컨테이너 종료 및 정리

    모든 컨테이너를 중지하고 정리하려면 다음 명령어를 사용합니다.

    docker-compose down

    이 명령어는 현재 실행 중인 모든 컨테이너와 네트워크를 중지하고 삭제합니다.

    최종 디렉토리 구조

    apache-mysql-docker/
    │
    ├── Dockerfile             # Apache 웹 서버용 Dockerfile
    ├── db/                    # MySQL 데이터베이스 설정용 디렉토리
    │   └── Dockerfile         # MySQL Dockerfile
    ├── html/                  # Apache 서버에 배포할 HTML 파일
    │   └── index.html         # 간단한 HTML 파일
    ├── docker-compose.yml     # Docker Compose 파일
    └── daemon/                # Python 데몬을 위한 디렉토리
        ├── Dockerfile         # Python 데몬 컨테이너를 위한 Dockerfile
        └── count_rows.py      # Python 스크립트

    요약

    • Python 데몬 작성: MySQL test 테이블의 행 수를 30초마다 확인하는 Python 프로그램을 작성했습니다.
    • Python Dockerfile 작성: Python 프로그램을 실행할 Docker 이미지를 만들기 위한 Dockerfile을 작성했습니다.
    • Docker Compose 설정: docker-compose.yml 파일에 새로운 Python 데몬 컨테이너를 추가했습니다.
    • Docker Compose 빌드 및 실행: docker-compose up --build 명령어로 모든 서비스를 빌드하고 실행했습니다.

    이 과정을 통해 Python 데몬을 독립된 Docker 컨테이너로 실행할 수 있습니다.