Docker와 SQL로 데이터 파이프라인 구축하기
- Docker 소개와 장점
- Docker란 무엇인가
- 독립 컨테이너의 필요성
- 클라우드에서의 사용 가능성
- PostgreSQL 데이터베이스와 연결하기
- PostgreSQL 설치 방법
- 데이터베이스 접속하기
- pgAdmin 활용하기
- 데이터 수집 및 처리하기
- 데이터 다운로드 방법
- Pandas로 데이터 처리하기
- 데이터베이스에 업로드하기
- Docker 이미지로 데이터 파이프라인 자동화
- Dockerfile 작성법
- 파이프라인 스크립트 배치
- Dockerized 환경에서 실행하기
- Docker Compose로 멀티 컨테이너 관리하기
- Docker Compose 소개
- YAML 파일 구성하기
- 여러 컨테이너의 네트워크 설정
- 같이보면 좋은 정보글!
- 전세 계약 시 숨은 함정 알아보기
- 윤석열 발언의 논란과 비판 분석
- 부동산 매매 후 세금은 어떻게 낼까
- 2025년 손 없는 날 활용법 및 성공 팁
- 불법 스트리밍 티비위키의 진실은?
Docker 소개와 장점
Docker는 현대 소프트웨어 개발의 필수 도구로 자리매김하고 있습니다. 많은 기업과 개발자들이 Docker를 사용하여 애플리케이션을 개발하고 배포하는데, 그 장점을 이해하는 것은 필수적입니다. 이번 섹션에서는 Docker의 기본 개념과 그 필요성, 클라우드 환경에서의 활용 가능성에 대해 살펴보겠습니다.
Docker란 무엇인가
Docker는 애플리케이션을 컨테이너라는 독립된 환경에서 실행할 수 있도록 하는 플랫폼입니다. 이러한 컨테이너는 애플리케이션이 필요로 하는 모든 요소를 포함하므로, 시스템 간의 일관성과 이식성을 보장할 수 있습니다. 예를 들어, 데이터 파이프라인에서 사용되는 각종 데이터베이스 및 라이브러리를 쉽게 관리하고 배포할 수 있습니다.
"Docker는 소프트웨어 운송의 혁신적인 방법을 제공하여, 개발자들이 더욱 쉽게 환경을 구축하고 애플리케이션을 배포할 수 있도록 돕습니다."
독립 컨테이너의 필요성
독립적인 컨테이너의 필요성은 주로 다음과 같은 이유에서 발생합니다:
이유 | 설명 |
---|---|
간섭 차단 | 한 시스템에서 여러 데이터베이스를 실행 시킬 수 있지만, 각 컨테이너가 독립적으로 운영되므로 서로 간섭받지 않습니다. |
이식성 | Docker 이미지를 가져와 다른 환경에서 손쉽게 실행할 수 있습니다. 개발 환경에서 만든 이미지를 그대로 클라우드에서도 사용할 수 있습니다. |
재현성 | 동일한 환경을 반복해서 재현할 수 있어, 테스트와 배포 단계에서 신뢰성을 높입니다. |
이러한 요소들은 데이터 엔지니어링 및 소프트웨어 개발에서 필수적인 요구사항으로 자리잡고 있습니다.
클라우드에서의 사용 가능성
Docker는 클라우드 환경에서도 막강한 성능을 보입니다. 이를 통해 CI/CD 파이프라인을 활용하여 애플리케이션을 자동으로 배포하고 관리할 수 있습니다. 클라우드 제공업체인 AWS나 Google Cloud와의 원활한 통합 덕분에, 데이터를 처리하는 시스템을 솔직하게 효과적으로 운영할 수 있습니다. 각기 다른 환경에서의 일관성을 유지하면서 개발자와 운영자의 업무 또한 간소화할 수 있습니다.
Docker를 통한 클라우드 활용의 장점은 다음과 같습니다:
- 서버리스: AWS Lambda나 Google Cloud Functions와 같은 서버리스 아키텍처에 쉽게 맞출 수 있습니다.
- 비용 효율성: 필요한 리소스를 적시에 할당하여 운영 비용을 절감할 수 있습니다.
Docker는 이러한 장점 덕분에 많은 기업들의 데이터 파이프라인과 애플리케이션 배포 전략에 필수적인 요소로 자리잡고 있습니다.
PostgreSQL 데이터베이스와 연결하기
PostgreSQL은 강력한 오픈 소스 관계형 데이터베이스 시스템에서 다수의 데이터베이스와 연동할 수 있는 옵션을 제공합니다. 이번 섹션에서는 PostgreSQL 설치 방법, 데이터베이스 접속하기, pgAdmin 활용하기에 대해 다루겠습니다.
PostgreSQL 설치 방법
PostgreSQL을 설치하는 첫 단계는 환경에 따라 적절한 설치 패키지를 선택하는 것입니다. 성능 및 유연성을 위해 Docker를 사용하는 방법을 추천합니다. 아래는 Docker를 사용하여 PostgreSQL을 설치하는 예시입니다.
docker run -it \
-e postgres_user="root" \
-e postgres_password="root" \
-e postgres_db="ny_taxi" \
-v /c/users/82105/zoomcamp/2_docker_sql/ny_taxi_postgres_data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:13
이 명령어는 PostgreSQL 이미지를 다운로드하고, 필요한 사용자 계정과 데이터베이스를 설정한 후, 데이터 파일을 저장할 경로를 지정합니다. Docker를 사용하여 PostgreSQL을 설치하면, 다양한 환경에서 재사용이 용이해집니다.
데이터베이스 접속하기
PostgreSQL 데이터베이스에 접속하기 위해서는 여러 방법이 있지만, 여기서는 pgcli
와 같은 CLI 도구를 활용하는 방법을 설명합니다. 아래의 명령어로 pgcli
를 설치한 후, 데이터베이스에 접속할 수 있습니다.
pip install pgcli
pgcli -h localhost -p 5432 -u root -d ny_taxi
이 명령어를 실행하면 PostgreSQL 데이터베이스에 접속이 이루어집니다. 사용자의 환경에 맞는 접근 방법을 선택하는 것이 중요합니다.
"PostgreSQL은 데이터의 무결성과 보안을 뛰어나게 지원하는 데이터베이스입니다."
pgAdmin 활용하기
pgAdmin은 PostgreSQL 데이터베이스를 관리할 수 있게 도와주는 강력한 도구입니다. Docker에서 pgAdmin을 실행하기 위한 기본 명령어는 다음과 같습니다.
docker run -it \
-e pgadmin_default_email="admin@admin.com" \
-e pgadmin_default_password="root" \
-p 8080:80 \
dpage/pgadmin4
pgAdmin을 사용하면 웹 기반 인터페이스에서 데이터베이스에 쉽게 접근하고, 데이터를 시각적으로 관리할 수 있습니다. 데이터베이스 관리자는 pgAdmin을 통해 보다 직관적으로 DB 작업을 수행할 수 있습니다. 또한, pgAdmin 컨테이너와 PostgreSQL 데이터베이스 컨테이너는 동일한 네트워크 내에서 연결해야 합니다.
아래는 pgAdmin과 PostgreSQL 데이터베이스의 연결을 위한 네트워크 설정 예시입니다:
서비스명 | 이미지 | 포트 |
---|---|---|
pgdatabase | postgres:13 | 5432 |
pgadmin | dpage/pgadmin4 | 8080 |
Docker를 활용하여 효율적으로 PostgreSQL과 pgAdmin을 구축하고 데이터베이스를 쉽게 관리할 수 있습니다. PostgreSQL과 pgAdmin을 통합적으로 활용하면 데이터 파이프라인 구축이 더욱 수월해집니다.
데이터 수집 및 처리하기
데이터 수집과 처리는 현대 데이터 엔지니어링의 기초입니다. 이 과정에서는 데이터를 다운로드하고, 이를 효과적으로 처리하며, 최종적으로 데이터베이스에 업로드하는 방법에 대해 알아보겠습니다.
데이터 다운로드 방법
데이터를 수집하는 첫 번째 단계는 자료를 다운로드하는 것입니다. 데이터 파일을 효율적으로 다운로드하기 위해 curl
명령어를 사용할 수 있습니다. 아래는 데이터를 다운로드하는 예시입니다:
curl -l -o yellow_tripdata_2021-01.csv.gz https://github.com/datatalksclub/nyc-tlc-data/releases/download/yellow/yellow_tripdata_2021-01.csv.gz
이와 같은 명령어를 사용하면, 특정 URL에서 CSV 파일을 간편하게 다운로드 할 수 있습니다.
"데이터 다운로드는 데이터 파이프라인의 중요한 첫 단계입니다."
파일은 GZ 형식으로 압축되어 있으므로, 후속 단계에서 압축을 해제해야 합니다. 이를 위해 gzip
명령어를 사용하면 됩니다.
Pandas로 데이터 처리하기
다운로드한 데이터를 처리하는 데 있어 Pandas는 매우 유용한 라이브러리입니다. 다음은 Pandas를 사용하여 데이터를 처리하는 단계입니다:
import pandas as pd
# 데이터 읽기
df_iter = pd.read_csv("yellow_tripdata_2021-01.csv", iterator=True, chunksize=100000)
df = next(df_iter)
# 날짜 칼럼을 datetime 형식으로 변환
df['tpep_pickup_datetime'] = pd.to_datetime(df['tpep_pickup_datetime'])
df['tpep_dropoff_datetime'] = pd.to_datetime(df['tpep_dropoff_datetime'])
Pandas의 read_csv
메서드를 사용하면 대규모 데이터를 손쉽게 나눠서 읽을 수 있습니다. 이를 청크 단위로 처리하는 것은 메모리 효율성을 높이는 데 도움을 줍니다.
기능 | 설명 |
---|---|
read_csv |
CSV 파일을 DataFrame으로 읽기 |
to_datetime |
문자열 형태의 날짜를 datetime으로 변환 |
iterator |
데이터셋을 청크별로 읽어 메모리 사용 최적화 |
위와 같은 방식으로, 대용량 데이터를 효과적으로 처리할 수 있습니다.
데이터베이스에 업로드하기
마지막 단계는 처리된 데이터를 데이터베이스에 업로드하는 것입니다. Python에서 SQLAlchemy
를 사용하여 PostgreSQL 데이터베이스에 데이터를 삽입하는 예시는 다음과 같습니다:
from sqlalchemy import create_engine
# 데이터베이스 연결
engine = create_engine('postgresql://username:password@localhost:5432/database')
# 데이터를 데이터베이스에 저장
df.to_sql(name='yellow_taxi_data', con=engine, if_exists='append', index=False)
이 코드에서는 처리된 DataFrame을 PostgreSQL에 저장합니다. if_exists='append'
옵션을 사용하면 이미 존재하는 테이블에 데이터를 추가할 수 있습니다. 데이터베이스에 연결하기 위하여 필요에 따라 사용자의 정보와 데이터베이스의 이름을 적절히 설정해야 합니다.
데이터 수집, 처리, 그리고 업로드 과정은 서로 연결되어 있으며, 각 단계를 이해하고 효과적으로 수행하는 것이 데이터 엔지니어링에 필수적입니다. 데이터 파이프라인을 구축함으로써, 더욱 간편하고 효율적인 데이터 작업을 수행할 수 있습니다.
Docker 이미지로 데이터 파이프라인 자동화
데이터 파이프라인을 자동화하는 것은 데이터 엔지니어링에서 매우 중요한 주제입니다. Docker를 활용하여 데이터 파이프라인을 쉽게 구현하고 관리할 수 있습니다. 아래에서는 Docker 이미지를 사용하여 데이터 파이프라인을 자동화하는 방법을 살펴보겠습니다.
Dockerfile 작성법
Dockerfile은 Docker 이미지를 생성하기 위한 설정 파일입니다. 기본적으로 어떤 기반 이미지에서 시작할지, 필요한 패키지 및 라이브러리를 설치하고, 파일을 복사하는 방식으로 구성됩니다.
예를 들어, 파이썬과 Pandas를 사용한 Dockerfile은 다음과 같이 작성할 수 있습니다:
FROM python:3.9
RUN pip install pandas
WORKDIR /app
COPY pipeline.py pipeline.py
ENTRYPOINT ["python", "pipeline.py"]
“Docker를 통해 환경 설정의 재현성을 제공하는 것은 클라우드 플랫폼에서 데이터 파이프라인을 배포하는 데 큰 도움이 됩니다.”
이 Dockerfile은 파이썬 3.9를 기반으로 하여 Pandas를 설치하고, pipeline.py
스크립트를 /app
디렉토리로 복사합니다. 이후 pipeline.py
파일을 실행하는 방식으로 설정됩니다.
파이프라인 스크립트 배치
다음으로, 데이터 파이프라인 스크립트를 작성해야 합니다. 예를 들어, 특정 CSV 파일을 PostgreSQL 데이터베이스에 업로드하는 스크립트를 작성할 수 있습니다. 스크립트는 인수로 데이터베이스 연결 정보와 CSV 파일 URL을 받아 처리합니다.
import pandas as pd
import argparse
from sqlalchemy import create_engine
def main(params):
# 데이터베이스 연결 및 파일 읽기
engine = create_engine(f'postgresql://{params.user}:{params.password}@{params.host}:{params.port}/{params.db}')
df = pd.read_csv(params.url)
# 데이터베이스에 데이터 업로드
df.to_sql(name=params.table_name, con=engine, if_exists='append')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# 인수 정의
parser.add_argument('--user', required=True)
parser.add_argument('--password', required=True)
parser.add_argument('--host', required=True)
parser.add_argument('--port', required=True)
parser.add_argument('--db', required=True)
parser.add_argument('--table_name', required=True)
parser.add_argument('--url', required=True)
args = parser.parse_args()
main(args)
Dockerized 환경에서 실행하기
Dockerized 환경에서 데이터 파이프라인을 실행하려면, Docker Compose를 활용할 수 있습니다. Docker Compose는 여러 서비스에 대해 단일 명령어로 컨테이너를 실행할 수 있도록 해줍니다. 예를 들어, PostgreSQL 데이터베이스와 pgAdmin 서비스를 설정하는 docker-compose.yaml
파일을 작성합니다:
version: '3'
services:
pgdatabase:
image: postgres:13
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: ny_taxi
ports:
- "5432:5432"
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: root
ports:
- "8080:80"
웬만한 설정은 마친 후, docker-compose up
명령어로 두 개의 서비스가 실행됩니다. 이 방식으로 파이프라인을 손쉽게 배포하고 관리할 수 있습니다.
Docker 이미지를 활용한 데이터 파이프라인 자동화는 유연성과 재현성을 가져옵니다. 필요할 때마다 Docker 이미지를 재사용하여 다양한 환경에서 손쉽게 실행할 수 있습니다.
Docker Compose로 멀티 컨테이너 관리하기
Docker Compose는 컨테이너화된 애플리케이션을 관리하기 위한 도구로, 여러 개의 Docker 컨테이너를 정의하고 실행하는 것을 쉽게 만들어줍니다. 이 섹션에서는 Docker Compose의 기본 개념과 YAML 파일 구성 방법, 그리고 여러 컨테이너의 네트워크 설정에 대해 알아보겠습니다.
Docker Compose 소개
Docker Compose는 여러 개의 서비스(컨테이너)를 정의하고 실행할 수 있는 방법을 제공합니다. 이를 통해 복잡한 애플리케이션을 쉽게 관리할 수 있습니다. 예를 들어, 데이터베이스와 웹 서버를 통해 연동되는 서비스들을 하나의 파일로 설정 함으로써, 손쉬운 배포와 버전 관리를 지원합니다. Docker Compose를 사용하면, 각 컨테이너가 서로 어떻게 연결될지를 정의할 수 있습니다.
“Docker Compose는 모든 서비스의 생성을 자동으로 처리해 줄 수 있는 강력한 도구입니다.”
YAML 파일 구성하기
Docker Compose는 YAML 형식의 파일을 사용하여 애플리케이션의 서비스를 정의합니다. 여기서는 각 서비스의 주요 요소에 대해 설명하겠습니다.
요소 | 설명 |
---|---|
services | 실행할 서비스 목록 |
image | 사용하고자 하는 Docker 이미지 |
environment | 컨테이너에서 사용할 환경 변수 설정 |
ports | 호스트와 컨테이너 간의 포트 매핑 |
volumes | 호스트와 컨테이너 간의 데이터 공유 |
YAML 파일의 기본 형식은 다음과 같습니다:
version: '3.8'
services:
pgdatabase:
image: postgres:13
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: ny_taxi
volumes:
- ./ny_taxi_postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: root
ports:
- "8080:80"
이러한 구성 파일을 사용하여 단일 명령어로 모든 서비스를 시작할 수 있습니다.
여러 컨테이너의 네트워크 설정
여러 개의 컨테이너가 서로 통신할 수 있도록 하기 위해, Docker Compose는 자동으로 네트워크를 설정합니다. 사용자는 별도의 네트워크 설정 없이도 각 서비스가 동일한 네트워크를 통해 서로 연결될 수 있습니다. 이를 통해 상호 작용을 쉽게 관리할 수 있습니다.
아래는 Docker Compose에서 정의한 서비스 간의 네트워크 설정 예시입니다:
services:
serviceA:
image: my_service_a
networks:
- my_network
serviceB:
image: my_service_b
networks:
- my_network
networks:
my_network:
이와 같은 설정을 통해, 컨테이너들은 "my_network"라는 네트워크를 통해 서로 직접 통신할 수 있습니다. 이는 여러 서비스를 포함하는 복잡한 애플리케이션을 효율적으로 구성하는 데 큰 도움이 됩니다.
Docker Compose를 사용하면 개발 환경을 보다 체계적이고 재현 가능하게 구성할 수 있는 이점이 있습니다. 이러한 방법으로 Docker를 활용하면, 다양한 서비스 간의 통신을 쉽게 설정하고 관리할 수 있습니다.
같이보면 좋은 정보글!