지난 시간에는 docker-compose.yaml 파일을 이용하여 Jupyter 컨테이너를 올려보는 과정을 알아보았다. 이번에는 Jupyter에서 Mariadb 컨테이너 데이터를 불러오는 과정을 진행해보고자 한다.
[지난 시간 내용 - Jupyter 컨테이너 올리기]
2024.01.23 - [[기술공부]/Apache Airflow] - [Airflow] docker-compose.yaml로 Jupyter 컨테이너 올리기 - (1)
(설명) 전체적으로 아래와 같은 아키텍처를 구축하려고 하며, 3번 과정에서 Mariadb 데이터를 Jupyter로 불러오는 과정을 진행해보고자 한다.
내용에 들어가기 앞서, docker-compose.yaml에 추가한 Jupyter 컨테이너 내용을 짚고 넘어가자.
# docker-compose.yaml
services:
jupyter:
image: jupyter/base-notebook:latest
container_name: jupyter-container
environment:
# Jupyter notebook 접속시 사용할 패스워드
- JUPYTER_TOKEN=${password}
volumes:
- ./notebooks:/home/jovyan/work
restart: always
ports:
- 8888:8888
networks:
network_custom:
ipv4_address: 172.28.0.2
networks:
network_custom:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.1
※ 바인드 마운트 방식이란?
volumes:
- ./notebooks:/home/jovyan/work
- 호스트 머신의 로컬 디렉터리(./notebooks)를 jupyter 컨테이너 내부 디렉터리(/home/jovyan/work)에 연결하는 바인드 마운트 방식
- 즉, 사용자가 호스트 머신의 특정 경로를 컨테이너에 직접 연결시키는 방식이며, 호스트 머신의 파일 시스템에 직접 액세스하여 데이터를 수정할 수 있게 된다. (해당 변경 사항은 실시간으로 양쪽에 반영된다)
- DB 데이터와 달리 ipynb 파일에 직접 접근하고 수정해야하는 상황이 있을 수 있기에 직접 로컬 디렉터리 위치를 지정해주는 바인드 마운트 방식을 적용했다.
1. Jupyter notebook 접속
- http://localhost:8888/
- Password or Token → docker-compose.yaml에서 jupyter 컨테이너에서 설정한 토큰 or 패스워드 입력 후 [Log in] 클릭
2. Jupyter notebook에서 Mariadb 컨테이너 데이터 불러오기
이전 시간에 Mariadb 컨테이너를 올리고 샘플 데이터를 적재하는 과정까지 완료했었다. 만약 이 내용을 아직 보지 못했다면 아래 페이지를 참고하도록 하자.
[참고 - Mariadb 컨테이너 올리고 데이터 적재하기]
(2-1) Jupyter 컨테이너 접속해서 필요한 라이브러리 설치
# jupyter 컨테이너 접근
# sudo docker exec -it ${container명} bash
sudo docker exec -it jupyter-container bash
# bash
pip install mysql-connector-python
(2-2) Jupyter 화면에서 work 폴더 더블 클릭 > python3 notebook 선택 > test.ipynb 생성
Jupyter notebook의 컨테이너 디렉터리를 /home/jovyan/work로 설정했으므로 work 디렉터리에 들어가서 코드를 생성해야한다.
(2-3) test.ipynb에 아래 코드 작성 후 실행
import mysql.connector
from mysql.connector import Error
# mariadb container 접속정보
# docker-compose.yaml에 추가한 mariadb 컨테이너 정보
db_config = {
'host': 'mariadb-container', # mariadb 컨테이너명
'port': 3306, # mariadb 컨테이너접속포트
'database': 'mariadb', # mariadb 데이터베이스명
'user': '${DBeaver_Username}', # mariadb 접속정보 유저명
'password': '${DBeaver_Password}' # mariadb 접속정보 패스워드
}
query = "SELECT * FROM test_table"
try:
with mysql.connector.connect(**db_config) as connection:
with connection.cursor() as cursor:
cursor.execute(query)
result = cursor.fetchall()
print(result)
except Error as e:
print(f"Error: {e}")
# 코드 설명
▶db_config 정보를 이용하여 mariadb 컨테이너를 연결하고, "SELECT * FROM test_table" 쿼리를 실행하여 결과를 가져오는 코드
▶try~except를 통해서 모든 과정이 올바르면 데이터를 가져오고, 만약 문제가 발생하면 에러 메세지 표시
# db_config 설명 (모든 내용은 아래 docker-compose.yaml에 추가한 내용 기반)
▶host: mariadb 컨테이너명
▶port: mariadb 컨테이너 접속 포트
▶database: mariadb 데이터베이스명 ${MYSQL_DATABASE}
▶user: mariadb 접속 유저명 ${MYSQL_USER}
▶password: mariadb 접속 패스워드 ${MYSQL_PASSWORD}
※ (참고) docker-compose.yaml의 Mariadb 컨테이너 정보
services:
mariadb:
image: mariadb:10
container_name: mariadb-container
environment:
MYSQL_USER: ${user}
MYSQL_PASSWORD: ${passwd}
MYSQL_ROOT_PASSWORD: ${root_passwd}
MYSQL_DATABASE: ${db_name}
TZ: Asia/Seoul
volumes:
- mariadb-db-volume:/var/lib/mysql
restart: always
ports:
- 3307:3306
networks:
network_custom:
ipv4_address: 172.28.0.2
(2-4) Mariadb 컨테이너 내의 test_table 테이블 데이터 불러오기 완료
참고로, 이전 시간에 서비스들 간의 고정 IP를 지정해주었고 이 과정은 Mariadb, Jupyter 간에 같은 네트워크를 사용하고 있기에 통신이 가능한 것이다.
3. (선택사항) 바인드 마운트가 정상 작동하는지 확인
(3-1) 호스트 머신 local directory 확인 → test.ipynb 파일 존재 확인
로컬 디렉터리 내에서 test.ipynb 파일이 존재하는 것을 확인할 수 있다.
# 현재위치: docker-compose.yaml 스크립트가 있는 위치
pwd
cd notebooks/
ls
(3-2) container 내부 확인 → test.ipynb 파일 존재 확인
컨테이너 내부에서 test.ipynb 파일이 존재하는 것을 확인할 수 있다.
# jupyter 컨테이너 접근
# sudo docker exec -it ${container명} bash
sudo docker exec -it jupyter-container bash
# bash
cd work/
ls
→ Jupyter 컨테이너의 바인드 마운트 방식이 올바르게 적용되었음을 확인했고, 컨테이너 재기동 여부와 상관없이 ipynb 파일은 계속 남아있게 된다. 바인드 마운트 방식은 호스트, 컨테이너 디렉터리에 모두 접근할 수 있으며 서로 간의 데이터 변경이 발생하면 실시간으로 동기화된다.
※ (참고) 볼륨과 바인드 마운트 방식의 차이?
Mariadb, Jupyter 컨테이너를 올리기 위해서 각각 볼륨과 바인드 마운트 방식을 사용했는데 왜 서로 다르게 지정했을까?
# docker-compose.yaml
services:
jupyter:
volumes:
# 바인드 마운트 방식
- ./notebooks:/home/jovyan/work
mariadb:
volumes:
# 볼륨 방식
- mariadb-db-volume:/var/lib/mysql
...
volumes:
mariadb-db-volume:
◎ 볼륨(volume) - Mariadb
- 볼륨은 도커가 직접 호스트 파일 시스템(로컬) 일부에 데이터 저장 공간을 지정하여 관리하는 방식으로, 컨테이너 생명 주기와 상관없이 데이터를 독립적으로 유지할 수 있다. (컨테이너를 재기동해도 데이터가 남아있다)
- 위의 yaml 파일 기준으로 mariadb-db-volume 볼륨이 컨테이너 내부 디렉터리(/var/lib/mysql)에 마운트되는 방식이다.
◎ 바인드 마운트(bind mount) - Jupyter
- 사용자가 직접 호스트 머신(로컬)의 특정 디렉터리를 컨테이너와 연결시키는 방식으로, 호스트 머신의 파일 시스템에 직접 액세스하여 데이터를 수정할 수 있다. (변경 시 실시간으로 양쪽에 반영된다)
- 위의 yaml 파일 기준으로 호스트 머신의 로컬 디렉터리(./notebooks)를 컨테이너 내부 디렉터리(/home/jovyan/work)에 연결하는 방식이다.
→ 쉽게 생각하면 볼륨은 도커가 로컬 디렉터리 일부의 저장 공간을 관리할 수 있도록 하는 것이고, 바인드 마운트는 사용자가 직접 로컬 디렉터리를 지정하여 관리하게 되는 것이다. DB 데이터와 달리 분석용 노트북 ipynb 파일은 내가 직접 접근하고 수정하는 상황이 있을 수 있다고 생각하여 바인드 마운트 방식을 사용하게 되었다.
지금까지 Jupyter 컨테이너를 올리고 Mariadb 컨테이너의 데이터를 불러오는 과정까지 정리해보았다. 그리고 볼륨과 바인드 마운트 방식의 차이에 대해서도 알아볼 수 있었다. 오늘도 이 내용이 많은 사람들에게 도움이 되었으면 좋겠다:)
'[기술공부] > Apache Airflow' 카테고리의 다른 글
[Airflow] Connection 연결시 [Test] 버튼 비활성화된 경우 해결하는 방법 (1) | 2024.02.04 |
---|---|
[Airflow] docker-compose.yaml로 Jupyter 컨테이너 올리기 - (1) (0) | 2024.01.23 |
[Airflow] docker-compose.yaml로 mariaDB 컨테이너를 올렸을 때 볼륨이 정상 작동 안하는 오류 해결 (3) | 2024.01.18 |
[Airflow] docker-compose.yaml로 mariaDB 컨테이너 올리기 & DBeaver 연결하기 (0) | 2024.01.18 |
[Airflow] docker-compose.yaml에 대해 알아보기 (0) | 2024.01.18 |