Develop/DevCourseTIL

06.12 데이터 엔지니어링 46일차 - Docker

향식이 2023. 6. 12. 13:37

관리해야 하는 DAG의 수가 100개를 넘어간다면?

  • 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
  • 주로 발생할 수 있는 이슈
    • 라이브러리 충돌
      • 라이브러리/모듈의 충돌 이슈가 발생하기 시작함
      • DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작 (ex. python 버전)
      • 이로 인해 DAG 혹은 Task 별로 별도의 독립공간을 만들어주는 것이 필요
        • Docker to the rescue
        • Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행
    • Worker의 부족
      • 해결책
        • scale up (언젠가 한계가 있음)
        • scale out
          • 클라우드 서비스 사용
        • K8s와 같은 컨테이너 기술 사용
          • 필요한대로 서버 요청
    • Worker 서버들의 관리와 활용도 이슈
      • airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면?
      • 서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄
        • 서비스별로 capacity 관리를 해야 함
        • 각 서비스에 속한 서버들은 보면 utilization이 낮은 이슈 발생
      • 이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능

* docker image: 해당 소프트웨어를 실행하기 위한 모든 것들이 하나로 패키지가 된 것 (독립적으로 완전하게 만들어진 패키지)

* docker container: 작게 분리된 이 소프트웨어만을 위한 컴퓨터(분리된 공간?), docker image를 독립된 환경에서 실행한 것

* k8s: 언제든지 다양한 용도로 사용될 수 있는 공용 클러스터

 

airflow executor

  • executor는 task들을 관리하고 실행하는 역할을 수행
    • 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등
  • 다양한 수의 executor 타입이 존재
    • sequential executor: 디폴트로 설치되며 sqlite와 같은 싱글 스레드 db에서만 사용가능
    • local executor: task들을 airflow 마스터 노드 안에서 실행
    • celery executor: 다수의 worker 노드가 있는 경우 사용되며 celery 큐를 사용해 task들을 worker 노드로 분산하여 실행

Docker의 목표

  • 소프트웨어를 일관되게 빌드하고 실행하고 배포

docker 사용 프로세스

  1. docker file: 지금 내가 만든 프로그램에 대해 어떤 소프트웨어에 대해 어떤 환경변수가 세팅되어야 하는지 적혀 있음
  2. 이를 빌드하면 docker 이미지 생성
  3. 이를 그대로 실행하고자 한다면 container 형태로 docker command를 이용해 실행 가능
  • docker registry에 업로드하면 다른 사람들도 접근 가능

Docker Container

  • 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
  • 자체 파일 시스템을 갖고 있음 (Volume 이라고 부름)

Docker container의 장단점

  • 장점
    • 소프트웨어를 실행하기 위한 독럽적이고 분리된 공간을 제공
      • 다수의 소프트웨어를 각 컨테이너 단에서 독립적으로 실행 가능
    • 자원 소비가 적음 
      • 몇 십개에서 몇 백개의 container를 실행 가능
    • 호스트 OS를 사용 (별도 비용 없음)
      • 따라서 빠르게 실행됨
  • 단점
    • 많은 수의 docker container를 관리하는 것은 쉽지 않음
    • Host OS를 사용하기에 Cross-platform compatibility를 항상 지원하지 않음
    • GUI 소프트웨어 개발에 적합하지 않음 (command line으로 진행하기 때문에)

하이레벨 docker 사용 프로세스

  • 대상 소프트웨어 선택
    • 다수의 컴포넌트로 구성되는 소프트웨어라면 각각 docker Image로 만들어져야 할 수 있음
  • 이를 Docker Image로 빌드(dockerization)
    • Dockerfile에 텍스트 파일로 세부 정보를 기술
    • Docker Image: 하나의 Docker Container안에서 실행됨
      • dockerfile을 기준으로 만들어지며 소프트웨어를 실행하기 위해 필요한 모든 것을 포함
      • docker Image의 구성 요소
        • 기본 OS와 같은 소프트웨어의 실행환경
        • 소프트웨어 자체 (코드)
        • 소프트웨어가 필요로 하는 라이브러리
        • 파일 시스템 스냅샷
        • 환경 설정 변수(설치할 때, 소프웨어가 실제로 실행될 때): env, arg 존재
        • 메타 데이터: 이미지 자체에 대한 정보 (버전, 작성자, 설명 등등)
        • 위 정보와 설치 관련 실행 순서 등이 dockerfile에 기술됨
        • docker Image는 다수의 파일로 구성

1. Docker Image의 실행

  • Container를 통해 Docker Image안의 소프트웨어 실행
    • container는 자체 파일 시스템을 가진 특수한 프로세스로 이미지 파일 시스템이 로딩됨
  • Image를 container 안에서 실행

2. Docker Image의 등록: Docker Hub

  • Docker Registry: Docker Image들의 보관소
    • On-prem registry와 Cloud registry가 존재
    • docker hub이 가장 유명함..
  • registry에 등록하면 회사 내 혹은 퍼블릭하게 이미지를 공유 가능
  • github와 연동하여 github으로 코드 관리하고 docker hub에 배포하는 것이 일반적

--- 작성중 ---

반응형