Developers Haven

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

Welcome to DH's Blog

[기술공부]/Apache Airflow

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

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

 

 

 

지난 시간에 Mariadb 컨테이너를 올리고 테스트 데이터를 만들어보았다. 이번 시간에는 Jupyter 컨테이너를 올리는 과정을 알아보고, 다음 시간에는 Jupyter에서 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

 

 

(설명) 전체적으로 아래와 같은 아키텍처를 구축하려고 하며, 3번 과정에서 Mariadb 데이터를 Jupyter로 불러오는 과정을 진행하기 위해 Jupyter 컨테이너를 올려보도록 한다.

 

 


 

1. docker-compose.yaml 이용하여 jupyter 컨테이너 내용 추가

(1-1) docker-compose.yaml에 아래 내용 추가

# 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
# 내용 설명 
image: jupyter 최신 버전의 이미지 사용
container_name: 컨테이너명 설정
environment: Jupyter 웹 브라우저 접속시 사용할 토큰 키 or 패스워드 설정
volumes
    → 호스트 머신 디렉터리를 컨테이너 내부와 연결하는 바인드 마운트(bind mount) 방식
    → 호스트, 컨테이너 서로 간의 데이터 변경이 발생하면 실시간으로 동기화할 수 있다
    → (의미) 호스트 머신의 로컬 디렉터리를 (./notebooks), 컨테이너 디렉터리를 (/home/jovyan/work)으로 설정
restart: 오류시 재기동 여부
ports: 로컬 및 컨테이너에서 사용할 포트 (Jupyter는 8888 포트를 통해 외부에서 접근하도록 설정되어있음)
networks: 해당 컨테이너에서 사용할 고정 IP

 

docker-compose.yaml에 jupyter 컨테이너 내용 추가

 

 

※ 바인드 마운트(bind mount) 방식이란?

  • 호스트 머신의 로컬 디렉터리(./notebooks)를 jupyter 컨테이너 내부 디렉터리(/home/jovyan/work)에 연결하는 바인드 마운트 방식
  • 즉, 사용자가 호스트 머신의 특정 경로를 컨테이너에 직접 연결시키는 방식이며, 호스트 머신의 파일 시스템에 직접 액세스하여 데이터를 수정할 수 있게 된다. (해당 변경 사항은 실시간으로 양쪽에 반영된다)
  • DB 데이터와 달리 ipynb 파일에 직접 접근하고 수정해야하는 상황이 있을 수 있기에 직접 로컬 디렉터리 위치를 지정해주는 바인드 마운트 방식을 적용했다.

 

 

 

참고로, 아래 내용은 기존 도커 서비스들에게 할당한 고정 IP 정보이다. 나의 경우 jupyter & mariadb 컨테이너를 추가해준 것이고 서비스들 간에 서로 IP를 겹치지 않게만 설정해주면 된다.

# ├── services
#      └── jupyter : 172.28.0.2
#      └── mariadb : 172.28.0.3 (참고로, 나의 경우 172.28.0.4을 다른 테스트용 컨테이너에서 쓰고 있는 상황)
#      └── postgres : 172.28.0.5
#      └── redis: 172.28.0.6
#      └── airflow-webserver: 172.28.0.7
#      └── airflow-scheduler: 172.28.0.8
#      └── airflow-worker: 172.28.0.9
#      └── airflow-triggerer: 172.28.0.10
#      └── airflow-init: 172.28.0.11

# ├── networks
#      └── subnet : 172.28.0.0/16
#      └── gateway : 172.28.0.1

 

 

 

(1-2) 로컬 디렉터리 생성

volumes에서 호스트 머신 디렉터리를 ./notebooks로 지정하였으므로 해당 디렉터리를 생성해준다.

# docker-compose.yaml 파일이 있는 곳에 notebooks 디렉터리 생성
mkdir notebooks

./notebooks 디렉터리 생성

 

 

※ 왜 Jupyter 컨테이너의 디렉터리를 /home/jovyan/work로 설정했을까?

아래 명령어를 통해 Jupyter 컨테이너를 올린 후 bash shell을 실행해보면 default 디렉터리/home/jovyan인 것을 확인할 수 있다. 해당 디렉터리에 있는 work 폴더 안에 Jupyter 노트북 파일(ipynb)을 저장하기 위해서 /home/jovyan/work로 설정했다.

# jupyter container 접근
# sudo docker exec -it ${container명} bash
sudo docker exec -it jupyter-container bash

# bash shell 
pwd
ls

 

 

여담으로, 처음에는 컨테이너 내부 디렉터리를 올바르게 지정하지 못해서 바인드 마운트가 정상적인 기능을 하지 못했다. 컨테이너 재기동 시 ipynb 파일이 계속 사라지게 되었고, 수십 번의 시행착오를 통해 컨테이너 default 디렉터리(/home/jovyan/)를 알아낼 수 있었다.

 

 

 

 

2. 도커 재기동

sudo docker compose down
sudo docker compose up -d

 

 

 

 

 

3. Jupyter notebook 접속

  • http://localhost:8888/
  • Password or Token → docker-compose.yaml에서 jupyter 컨테이너에서 설정한 토큰 or 패스워드 입력 후 [Log in] 클릭
# docker-compose.yaml 

services:
  jupyter:
    environment:
      # Jupyter notebook 접속시 사용할 패스워드
      - JUPYTER_TOKEN=${password}

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

 

 

 

 


 

이번 시간에는 Docker에서 Jupyter 컨테이너를 올려보는 과정을 통해, docker-compose.yaml 파일을 설정하는 방법에 대해서 자세히 알아보았다. yaml 파일을 이용하여 올리는 방법이 많이 공유되어 있지 않아서 많은 시행착오를 겪으면서 성공적으로 컨테이너를 올릴 수 있었다. 다음 시간에는 Jupyter 컨테이너에서 Mariadb 컨테이너의 데이터를 불러오는 과정을 진행해보려고 한다.

 

 

 

 

 

반응형