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
https://mlops-for-mle.github.io/tutorial/docs/database/data-generator-docker-compose
728x90
'Docker' 카테고리의 다른 글
[Docker] NGINX란? Docker와 FastAPI를 활용한 서버 구축 실습 (6) | 2024.11.17 |
---|---|
Docker를 이용한 ChromaDB와 데이터 생성 컨테이너 연동하기 (2) | 2024.11.15 |
[Docker] Zookeeper와 Kafka 설치 및 연동 가이드: Docker Compose로 간편하게 설정하기 (0) | 2024.11.10 |
[Docker] DockerFile 명령어 정리: ADD, COPY, CMD, ENTRYPOINT, ARG, ENV 등 (6) | 2024.09.25 |
[Docker] Ubuntu 22.04 환경에서 도커 설치하기 (0) | 2024.09.23 |