Airflow 운영상의 어려움
Docker 소개
Docker 설치
Docker 프로그램 개발 프로세스
실습: 간단한 Hello World 프로그램
라이브러리
라이브러리 / 모듈의 충돌 이슈 발생
DAG에 따라 실행에 필요한 라이브러리 / 모듈이 달라짐
이로 인해 DAG 혹은 태스크별로 별도의 독립 공간을 만들어줘야 함
DAG 혹은 태스크 코드를 Docker Image로 만들고 이를 Docker Container 안에서 실행
Worker의 부족
DAG의 수가 증가함에 따라 Airflow의 용량이 부족할 경우, Worker(CPU)가 부족할 수 있음
해결책
낮은 서버 가동률
서비스별로 전용 서버를 할당하는 것은 여러 가지 이슈를 발생시킴
서비스별로 용량 관리해야 함
각 서비스에 속한 서버의 낮은 가동률
마찬가지로 K8S와 같은 컨테이너 기술 도입으로 해결 가능
Airflow에서 Docker, K8S 사용하는 방법
Airflow Operator로 KubernetesPodOperator 사용
Airflow Operator로 DockerOperator 사용
Airflow Executor로 다음 중 하나를 사용
Airflow Executor: 태스크를 관리하고 실행하는 역할
KubernetesExecutor: 모든 DAG 코드가 Docker Image로 빌드되어 K8S에서 실행
CeleryKubernetesExecutor: CeleryExecutor와 KubernetesExecutor를 동시에 사용
LocalKubernetesExecutor: LocalExecutor와 KubernetesExecutor를 동시에 사용
개발한 프로그램이 다른 컴퓨터에서 안 돌아가는 문제를 해결하기 위해 Docker 사용
내 컴퓨터 환경을 그대로 패키징해서 배포
Docker Image: 독립적으로 완전하게 만들어진 패키지
Docker Container: Docker Image를 독립된 환경에서 실행한 것
소프트웨어를 일관되게 빌드, 실행, 배포하는 것이 Docker의 목표
Virtual Machines vs Docker Containers
Virtual Machines
AWS EC2가 대표적인 Virtual Machine(VM)
하드웨어를 추상화해서 컴퓨터 위에 가상의 컴퓨터를 올린 것
장점
소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공
다수의 소프트웨어를 각각의 VM에서 독립적으로 실행 가능
단점
각각의 VM이 자신만의 OS를 필요로 함
실행하는데 오래 걸리고, 유료 OS일 경우 라이센스 비용 필요
VM끼리 자원을 공유하기 때문에 자원을 많이 소비함
Docker Containers
소프트웨어를 실행하기 위한 독립적인 공간
Volume이라고 부르는 자체 파일 시스템을 갖고 있음
장점
다수의 소프트웨어를 각각의 Container에서 독립적으로 실행 가능
자원 소비가 적어 몇 백개까지의 Container 실행 가능
호스트 OS를 사용해 빠른 실행
단점
많은 수의 Container를 관리하는 것이 쉽지 않음
호스트 OS를 사용하기 때문에 다른 OS와 호환이 어려움
GUI 소프트웨어 개발에 적합하지 않음
Docker Desktop = Docker Engine + Tools
사양
맥
4GB 이상의 메모리
맥 OS 11버전 이상
윈도우
4GB 이상의 메모리
64비트 윈도우 10 or 윈도우 11
Hyper-V, Container 기능 활성화
WSL 기능 지원
Docker 사용 프로세스
대상 소프트웨어 선택
Docker Image로 빌드(Dockerization)
Dockerfile: 세부 정보를 기술하는 텍스트 파일
Docker Image: 하나의 Docker Container 안에서 실행
Docker Image 구성 요소
기본 OS와 같은 소프트웨어의 실행 환경
소프트웨어(코드)
라이브러리
파일 시스템 스냅샷
환경 설정 변수: 빌드 시의 변수와 실행 시의 변수 두 가지
Image 메타 데이터
Docker Image 실행
Docker Container를 통해 Image 내의 소프트웨어가 실행됨
Container는 자체 파일 시스템을 갖는 특수한 프로세스로, Image의 파일 시스템이 로딩됨
Docker Image 등록: Docker Hub
On-premise Registry와 Cloud Registry로 구분
Docker Hub
Docker가 제공하는 Image 공유 서비스
Public, Private Repo 제공
Official Image 사용 가능
Github와 연동을 통해 Automated Build 제공
Dockerfile
FROM node:alpine
COPY ./app
WORKDIR /app
CMD node app.js
FROM: 베이스 이미지
COPY: 코드 복사
WORKDIR: Working Directory 지정
CMD: 사용할 명령
기타 키워드
ARG: Docker Image를 만들 때 사용되는 변수 지정
ENV: Container가 실행될 때 사용되는 환경변수
USER: Container 실행 시의 사용자 ID
EXPOSE: 서비스 사용 포트번호
RUN: 빌드 시 실행할 명령
Dockerfile 키워드: CMD vs ENTRYPOINT
비슷하게 Container가 시작할 때 실행되어야 하는 명령을 지정하는 기능
둘 다 하나의 Dockerfile 내에서 여러 번 사용할 경우, 마지막 것만 실행됨
둘을 같이 사용할 경우, ENTRYPOINT가 기본 명령이 되고, CMD가 인자를 제공
...
ENTRYPOINT ["entrypoint.sh"]
CMD ["param1", "param2"]
가능한 CMD만 사용
Docker Image 생성
docker build —platform linux/amd64 -t hello-world-docker .
애플 M1 프로세스의 경우, ARM 기반 아키텍처이기 때문에 리눅스에서 동작하지 않아서 --platform 옵션을 사용해 linux/amd64 지정
-t: Image 이름 지정 옵션
Docker Container로 실행
docker run hello-world-docker
명령어
docker image ls
: Docker Image 목록 출력
docker login --username = XXX
: Docker Hub에 로그인
docker push repo_name/image_name
: Docker Hub에 이미지 업로드
docker pull image_name
: Docker Hub에서 이미지 다운로드
docker run --name = XXX
: Container ID 대신 name을 사용해 Image 실행
docker logs
: Container에서 생성된 stdout, stderr단의 로그를 읽어옴
docker run vs docker exec
docker run
: 새로운 container 실행docker exec
: 실행된 Container 위에서 작업Docker tag
Docker Image의 버전이나 변형을 나타내는 문자열
default: latest
Image 이름 뒤 세미콜론 뒤에 작성