[데이터 엔지니어링 데브코스] TIL 42일차 - Docker & K8S (1)

박단이·2023년 12월 19일
0

데브코스 TIL

목록 보기
42/56

오늘 배운 것🤓

Airflow와 Docker

Airflow DAG 관리에 따른 Docker 필요성

DAG 수가 많아진다면 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈가 발생한다.

  1. 라이브러리 충돌
    라이브러리/모듈이 충돌할 수도 있다.
    • DAG에 따라 실행에 필요한 라이브러리/모델이 달라지기 시작한다.
    • DAG 혹은 Task코드에 적용되는 Docker Image를 만들고, 이를 독립된 공간(Docker Container) 안에서 실행함으로써 해결한다.
    • 개발/프로뎍신인 환경을 동일하게 유지한다.
  2. Worker의 부족
    • Scale-Up
    • Scale-Out : Cloud 서비스 이용
    • K8s와 같은 컨테이너 기술을 사용해서 필요한 대로 서버를 요청한다.
  3. Worker 서버들의 관리와 활용도 이슈
    • 낮은 server Utilization 이슈
      서버들이 항상 바쁘지 않고 놀고 있는 시간이 있는데, 피크 시간을 위해 최대치를 계속 유지하는 것을 말한다.
    • 서비스 별로 전용 서버를 할당하지 않고, 공용 서버를 통해 필요할 때 동적으로 할당하는 것으로 해결한다.
    • K8s와 같은 컨테이너 기술인 Container Orchestration 서비스를 통해 할당하여 사용하고 리턴한다.
  • 이 때 사용할 수 있는 방법
    1. Airflow Operator인 KubernetesPodOperator
    2. Airflow Operator인 DockerOperator
    3. Airflow Executor 사용
      • KubernetesExecutor
      • CeleryKubernetesExecutor
      • LocalKubernetesExecutor

Airflow Executor

  • Task/DAG 들을 관리하고 실행하는 역할을 수행한다.
  • 병렬/직렬 실행이나 어느 worker에서 실행해야 하는지 등등을 관리한다.
  1. SequentialExecutor
    • default Executor
    • Sqlite와 같은 single method DB에서만 사용 가능
    • 병렬 기능 사용 X
  2. LocalExecutor
    • task들을 Airflow master node에서 실행
    • multi method DB에서 사용 가능
    • 하나의 node에서만 실행된다.
    • MySQL, PostgreSQL 등에서 사용 가능
  3. CeleryExecutor
    • 다수의 Worker 노드가 있는 경우 CeleryQueue를 사용해 task들을 worker 노드로 분산하여 실행한다.
  4. KubernetesExecutor
    • 독립된 K8s하트위에서 돌린다.
    • 실행될 task는 모두 docker Image로 구현이 되어있어야 한다.
  5. CeleryKubernetesExecutor
    • CeleryExecutorKubernetesExecutor 를 동시에 사용한다.
    • Airflow 로드가 전체적으로 큰데 소수의 task만 독립적으로 사용해야할 때 사용
  6. LocalKubernetesExecutor
    • LocalExecutorKubernetesExecutor 를 동시에 사용한다.
    • Airflow 로드가 전체적으로 큰데 소수의 task만 독립적으로 사용해야할 때 사용

Docker

  • 컴퓨팅 환경을 그대로 패키징하여 전달할 수 있는 오픈 소스 프로젝트
  • Docker의 목표 : 소프트웨어를 일관되게 빌드하고 실행하고 배포하자.
  • Docker Image : 독립적으로 완전하게 만들어진 패키지
  • Docker Container : Docker Image를 독립된 환경에서 실행한 것'
  • DockerFile -> Docker Image -> Docker Container

VM vs Docker

두 서비스 모두 SW를 실행하기 위한 독립적으로 분리된 환경을 제공한다는 공통점을 가지고 있지만, 구동 방식에 있어 차이를 가지고 있다.
VM vs Docker

VM (Virtual Machine)

  • 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것으로, 간단히 말하자면 컴퓨터 하드웨어의 가상화 라고 할 수 있다.
  • 대표적인 서비스로는 AWS EC2가 있다.
  • 하드웨어 안에서 하드웨어를 돌리는 형태

Docker Container

  • 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
  • 자체 파일 시스템을 가지고 있다. 이것을 Volume이라고 한다.
VMDocker
호환성 이슈없이 다수의 SW를 독립적으로 실행 가능하다.Host OS를 사용하기 때문에 호환성 문제가 발생하기도 한다.
각 VM은 가상 하드웨어 위에서 돌리기 때문에 자신만의 OS를 필요로 한다. 유료 OS라면 비용이 발생하고, 시간이 오래 걸릴 수 있다.호스트 OS를 사용하여 구동하기 때문에 별도의 비용이 필요하지 않고, 빠르게 실행할 수 있다.
VM끼리 자원을 나눠써야하므로 자원을 많이 사용한다.자원의 소비가 적어서(light weight) 몇 십 개에서 몇 백 개까지 실행 가능하다.
보통 하나의 컴퓨터 위에 다수의 VM을 실행하는 것이 일반적이지만 많은 수를 실행할 수 없다.많은 수의 docker container를 관리하는 것을 쉽지 않다.
GUI 소프트웨어 개발에는 적합하지 않다.

Docker 사용 프로세스

  1. 대상 소프트웨어 선택
    • 다수의 컴포넌트로 구성되는 소프트웨어가 각각 개별 프로세스를 돌아야 한다면, 각각의 Docker Image로 만들어야할 수도 있다.
  2. Docker Image 빌드
    • Dockerization
    • 해당 소프트웨어를 이미지로 바꾸기 위해 Docker에게 주는 명령을 포함한다.
    • Docker Image는 하나의 Docker Container에서 실행된다.
    • Dockerfile을 기준으로 만들어지먀 소프트웨어를 실행하기 위해 필요한 모든 것을 포함한다.
  3. 다른 사람들도 사용해야 한다면 Docker Hub와 같은 Docker Image Registry에 업로드

Docker Image 구성요소

  1. 기본 OS와 같은 sw의 실행 환경
  2. sw 자체 코드
  3. sw가 필요로 하는 라이브러리
  4. 파일 시스템 스냅샷 : 기본이 되는 파일을 복사
  5. 환경 설정 변수 : 빌드할 때, 실행할 때 2가지가 있다.
  6. 메타 데이터 : 이미지에 대한 정보(버전, 작성자 등)

이런 구성요소와 설치 관련 실행 순서 등을 Dockerfile에 기술한다.
Docker Image는 다수의 파일로 구성되어 있다.

Docker Image 실행

  • Container안에서 Docker Image를 실행한다.
  • Container은 자체 파일 시스템을 가진 특수한 프로세스로 이미지의 파일 시스템을 로딩한다.
$ docker run image-name	# 처음 실행할 때 
$ docker exec ...		# 이미 실행된 Container에 명령을 내리는 것

# 두 명령 모두 --user root 혹은 -uroot 를 통해 루트 유저로 연결 가능

Dockerfile 생성

  1. 베이스 이미지를 기술
  2. 코드 복사
  3. 코드 실행
FROM image-name:tag		# 베이스 이미지
COPY copy-path			# 사용해야할 코드를 docker image 에서 저장하기 위한 경로. 새로 생성된다.
WORKDIR work-path		# 뒤의 코드들은 모두 이 경로를 root로 생각함
CMD command-line		# docker가 실행될 때 반드시 실행되어야 하는 명령어
$ docker run image-name 

Dockerfile 키워드

  • ARG : Docker Image를 만들 때 사용되는 환경 변수, 최종 이미지에 저장 X
  • ENV : Container가 실행될 때 사용되는 환경 변수, 최종 이미지에 저장 O
  • USER : Container를 실행할 때 사용할 유저 ID
  • EXPOSE : 서비스 사용 포트
  • RUN : 빌드 시 실행되어야 하는 명령 지정
    RUN apt-get update && apt-get install -y curl
CMD vs ENTRYPOINT

둘 다 Container가 시작될 때 실행되어야 하는 명령어를 지정
굉장히 흡사하지만 둘이 동시에 사용 시 ENTRYPOINT가 우선 순위를 갖는다.
최대한 한가지 종류만 사용하고 CMD 사용을 권장
dockerfile에서 여러번 실행되면 마지막 것만 사용
둘이 같이 사용하면 ENTRYPOINT가 기본 명령이 되고 CMD가 인자를 제공한다.
CMDdocker run image-name cmd.sh 를 통해 오버라이드가 자동으로 되지만 ENTRYPOINT--entrypoint 옵션을 통해서만 오버라이딩이 된다.

Docker Image 생성 및 실행

# Docker Image 생성
$ docker build --platform linux/amd64 -t image-name .
# --platform linux/amd64 : Host OS에 영향을 받을 수 있기 때문에 사용
# -t image-name : 이미지 이름, tag를 설정하고 싶다면 콜론(:) 뒤에 붙힌다.
# . : 현재 경로에 있는 dockerfile을 사용한다.

# Docker Image 확인
$ docker image ls
$ docker images		# 둘 다 같은 명령어

# Docker Container 실행
$ docker run image-name		
# 버전이 여러개라면 반드시 콜론 사용. 기본적으로 최신 것을 실행한다.
# -p : 포트번호
# -v : volumn 

TAG와 Image 이름

  • Docker TAG
    • Docker Image의 버전이나 변형을 타나태는 문자열
    • default : latest
    • OS, version 등을 담는다.
    • Docker Image 이름에서 콜런(:) 뒤에 해당한다.
  • Docker Image name
    • Docker Hub에서 다운했다면 account id를 포함한다.
    • 기본 형태 : account-id/image-name:tag
    • official image는 account id가 없다.

리눅스 커널

리눅스 커널 구성

  • 자동차 엔진처럼 리눅스 커널은 리눅스의 핵심 부분이다.
  • 모든 리눅스는 동일한 커널을 갖는다.
  • 다양한 배포판들은 shell, sw, 응용 program들을 다르게 하여 packaging한 것이다.
  • 리눅스 배포판 으로는 Ubuntu, Devian, Alfine, Fedoram CentOS 등이 있다.
  • 배포판에 따라 패키지 매니저도 다르다. npm, apt, yarn, NuSet, pip 등


느낀 점😊

지금까지 수업 중에서 가장 필기할 것도 많았고 내용도 많았던 하루이다. 도커는 회사에서 직접 써보긴 했지만 무작정 이것저것 명령어를 가져와서 쓰느라 제대로 알지 못했는데 이번 수업으로 머리속에서 정리되고 있다. 내일 수업도 기대된다!

profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글