Docker

[Docker] Docker와 PostgreSQL을 이용한 데이터 생성 시스템 구축하기

JustJunsu 2024. 10. 6. 19:07
728x90

안녕하세요! 이번 포스팅에서는 Docker를 이용하여 PostgreSQL 데이터베이스와 데이터 생성기를 연동하는 방법에 대해 설명하겠습니다. 이 과정을 통해, 컨테이너 기반 환경에서 데이터베이스와 데이터를 자동으로 생성하여 PostgreSQL로 삽입하는 데이터 생성기를 구축해볼 수 있습니다.

0. 시스테 구조 구조

1.docker-compose.yaml 파일 만들기

이 파일은 PostgreSQL 서버와 data_generator라는 컨테이너를 정의하고, 두 컨테이너 간의 의존성을 설정합니다.

services:
  postgres-server:
    image: postgres:14.0
    container_name: postgres-server
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydatabase
    volumes:
      - ./postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-U", "myuser", "-d", "mydatabase"]
      interval: 10s
      timeout: 5s
      retries: 5
      
  data-generator:
    build:
      context: ./data_generator
      dockerfile: Dockerfile
    container_name: data-generator
    depends_on:
      postgres-server:
        condition: service_healthy
    command: ["postgres-server"]

 

  • postgres-server: PostgreSQL 서버 컨테이너
    • 이미지: postgres:14.0
    • 포트 매핑: 5432:5432
    • 환경 변수로 데이터베이스 사용자, 비밀번호, 데이터베이스 이름을 설정
    • Healthcheck 기능을 추가하여 서버 상태를 확인
  • data-generator: 데이터 생성기 컨테이너
    • postgres-server가 준비될 때까지 대기(depends_on 옵션을 사용)

 

2. 데이터 생성용 Dockerfile 파일 만들기

FROM amd64/python:3.9-slim

RUN apt-get update && apt-get install -y \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/app

RUN pip install -U pip &&\
    pip install scikit-learn pandas psycopg2-binary

COPY data_generator.py data_generator.py

ENTRYPOINT ["python", "data_generator.py", "--db-host"]
CMD ["localhost"]

 

 

  • postgresql-client 설치로 데이터베이스와의 연결을 지원
  • Python 패키지 설치 (scikit-learn, pandas, psycopg2-binary)

3. data_generator.py 파일 만들기

import time
from argparse import ArgumentParser
import pandas as pd
import psycopg2
from sklearn.datasets import load_iris

def get_data():
    X, y = load_iris(return_X_y=True, as_frame=True)
    df = pd.concat([X, y], axis="columns")
    rename_rule = {
        "sepal length (cm)": "sepal_length",
        "sepal width (cm)": "sepal_width",
        "petal length (cm)": "petal_length",
        "petal width (cm)": "petal_width",
    }
    df = df.rename(columns=rename_rule)
    return df

def create_table(db_connect):
    create_table_query = """
    CREATE TABLE IF NOT EXISTS iris_data (
        id SERIAL PRIMARY KEY, 
        timestamp timestamp,
        sepal_length float8,
        sepal_width float8,
        petal_length float8,
        petal_width float8,
        target int
    );"""
    with db_connect.cursor() as cur:
        cur.execute(create_table_query)
        db_connect.commit()

def insert_data(db_connect, data):
    insert_row_query = f"""
    INSERT INTO iris_data
        (timestamp, sepal_length, sepal_width, petal_length, petal_width, target)
        VALUES (
            NOW(),
            {data.sepal_length},
            {data.sepal_width},
            {data.petal_length},
            {data.petal_width},
            {data.target}
        );
    """
    with db_connect.cursor() as cur:
        cur.execute(insert_row_query)
        db_connect.commit()

def generate_data(db_connect, df):
    while True:
        insert_data(db_connect, df.sample(1).squeeze())
        time.sleep(1)

if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument("--db-host", dest="db_host", type=str, default="localhost")
    args = parser.parse_args()

    db_connect = psycopg2.connect(
        user="myuser",
        password="mypassword",
        host=args.db_host,
        port=5432,
        database="mydatabase",
    )
    create_table(db_connect)
    df = get_data()
    generate_data(db_connect, df)

 

 

  • Iris 데이터셋을 불러와 테이블을 생성하고 데이터를 삽입
  • create_table() 함수는 iris_data 테이블을 생성
  • insert_data() 함수는 1초 간격으로 데이터를 PostgreSQL에 삽입

4. 파일 실행

sudo docker compose up --build

 

 

Docker Compose를 사용하여 PostgreSQL 데이터베이스와 데이터를 자동으로 삽입하는 데이터 생성기를 연동하는 방법을 살펴보았습니다. 이를 통해 다양한 데이터 처리 및 분석 작업에 유용한 환경을 빠르고 쉽게 구축할 수 있습니다.

 

5. Reference

https://mlops-for-mle.github.io/tutorial/docs/database/data-generator-docker

 

5) Data Generator on Docker | ML Engineer를 위한 MLOps

📌 앞서 작성했던 코드를 Docker 컨테이너 안에서 실행하기 위해 Dockerfile 을 작성합니다.

mlops-for-mle.github.io

https://mlops-for-mle.github.io/tutorial/docs/database/data-generator-docker-compose

 

6) Data Generator on Docker Compose | ML Engineer를 위한 MLOps

📌 DB 컨테이너와 Data Generator 컨테이너를 함께 띄우기 위한 Docker Compose 파일을 작성합니다.

mlops-for-mle.github.io

 

728x90