Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Apache Airflow

[Airflow] docker-compose.yaml로 Jupyter 컨테이너 올리기 - (2)

DH’s Blog 2024. 1. 23. 18:33
반응형

 

 

지난 시간에는 docker-compose.yaml 파일을 이용하여 Jupyter 컨테이너를 올려보는 과정을 알아보았다. 이번에는 Jupyter에서 Mariadb 컨테이너 데이터를 불러오는 과정을 진행해보고자 한다.

 

[지난 시간 내용 - Jupyter 컨테이너 올리기]

2024.01.23 - [[기술공부]/Apache Airflow] - [Airflow] docker-compose.yaml로 Jupyter 컨테이너 올리기 - (1)

 

[Airflow] docker-compose.yaml로 Jupyter 컨테이너 올리기 - (1)

지난 시간에 Mariadb 컨테이너를 올리고 테스트 데이터를 만들어보았다. 이번 시간에는 Jupyter 컨테이너를 올리는 과정을 알아보고, 다음 시간에는 Jupyter에서 Mariadb 컨테이너 데이터를 불러오는 방

developers-haven.tistory.com

 

 

(설명) 전체적으로 아래와 같은 아키텍처를 구축하려고 하며, 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] 클릭

토큰 or 패스워드 입력
Jupyter 브라우저 접속 완료

 

 

 

 

 

 

2. Jupyter notebook에서 Mariadb 컨테이너 데이터 불러오기

이전 시간에 Mariadb 컨테이너를 올리고 샘플 데이터를 적재하는 과정까지 완료했었다. 만약 이 내용을 아직 보지 못했다면 아래 페이지를 참고하도록 하자.

 

[참고 - Mariadb 컨테이너 올리고 데이터 적재하기]

2024.01.18 - [[기술공부]/Apache Airflow] - [Airflow] docker-compose.yaml로 mariaDB 컨테이너 올리기 & DBeaver 연결하기

 

[Airflow] docker-compose.yaml로 mariaDB 컨테이너 올리기 & DBeaver 연결하기

이번 시간에는 docker-compose.yaml 스크립트를 이용하여 mariaDB 컨테이너를 올리고 DBeaver 연결까지 하는 방법을 알아보도록 하자. [1단계 - mariaDB 컨테이너 올리기] 1. 컨테이너가 사용하고 있는 default n

developers-haven.tistory.com

Mariadb container - 샘플 데이터

 

 

 

(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 디렉터리에 들어가서 코드를 생성해야한다.

 

work 폴더 내에서 ipynb 코드 생성

 

 

 

(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 간에 같은 네트워크를 사용하고 있기에 통신이 가능한 것이다.

 

Mariadb 컨테이너 데이터 불러오기 완료

 

 

 

 

 

 

 

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:

docker-compose.yaml에서 설정한 컨테이너 내용

 

◎ 볼륨(volume) - Mariadb

  • 볼륨은 도커가 직접 호스트 파일 시스템(로컬) 일부에 데이터 저장 공간을 지정하여 관리하는 방식으로, 컨테이너 생명 주기와 상관없이 데이터를 독립적으로 유지할 수 있다. (컨테이너를 재기동해도 데이터가 남아있다)
  • 위의 yaml 파일 기준으로 mariadb-db-volume 볼륨이 컨테이너 내부 디렉터리(/var/lib/mysql)에 마운트되는 방식이다.

 

 바인드 마운트(bind mount) - Jupyter

  • 사용자가 직접 호스트 머신(로컬)의 특정 디렉터리를 컨테이너와 연결시키는 방식으로, 호스트 머신의 파일 시스템에 직접 액세스하여 데이터를 수정할 수 있다. (변경 시 실시간으로 양쪽에 반영된다)
  • 위의 yaml 파일 기준으로 호스트 머신의 로컬 디렉터리(./notebooks)를 컨테이너 내부 디렉터리(/home/jovyan/work)에 연결하는 방식이다.

 

 

→ 쉽게 생각하면 볼륨은 도커가 로컬 디렉터리 일부의 저장 공간을 관리할 수 있도록 하는 것이고, 바인드 마운트는 사용자가 직접 로컬 디렉터리를 지정하여 관리하게 되는 것이다. DB 데이터와 달리 분석용 노트북 ipynb 파일은 내가 직접 접근하고 수정하는 상황이 있을 수 있다고 생각하여 바인드 마운트 방식을 사용하게 되었다.

 

 

 

 


지금까지 Jupyter 컨테이너를 올리고 Mariadb 컨테이너의 데이터를 불러오는 과정까지 정리해보았다. 그리고 볼륨과 바인드 마운트 방식의 차이에 대해서도 알아볼 수 있었다. 오늘도 이 내용이 많은 사람들에게 도움이 되었으면 좋겠다:)

 

 

 

 

 

반응형