data engineering/docker
[Docker] 개요
nani-jin
2024. 5. 28. 15:23
1. Docker 개요
- 컨셉
- 한 대의 컴퓨터(호스트) 안에서 각 앱을 격리된 환경(컨테이너)에서 실행함
- 등장 배경
- 내가 만든 프로그램이 다른 컴퓨터에서 돌아가게 하려면?
- 클라우드 컴퓨팅으로 가상 서버를 더 쉽게 구축할 수 있게 되었지만, 각종 소프트웨어를 설치하고 설정하는데에 또 시간이 듦
- 사소한 설정 하나가 운영체제와 서비스 안정성에 큰 영향을 미치기에 이를 잘 설정하는 것은 아주 중요함!
- 이 문제를 해결하기 위해 Immutable Infrastructure 등장했으며, 이를 구현한 프로젝트가 Docker
- 내가 만든 프로그램이 다른 컴퓨터에서 돌아가게 하려면?
- 목표
- 개발 환경, 테스트 환경, 프로덕션 환경에서 소프트웨어를 일관되게 빌드하고 실행하고 배포하는 것
2. Virtual Machine vs. Docker
- Virtual Machine
- 하드웨어를 추상화해 한 컴퓨터 위에 가상 컴퓨터를 올리는 것(컴퓨터 하드웨어 단에서의 추상화)
- AWS의 EC2가 대표적
- 보통 하나의 컴퓨터 위에 다수의 가상 머신을 실행하며, 이는 운영체제를 포함함
- 장점 - 다수의 소프트웨어를 각 VM에서 독립적으로 실행 가능
- 단점 - 각 VM은 자신만의 운영체제를 필요로 하며, 유료 운영체제라면 라이센스 비용이 필요. 부팅하는데 오래 걸리고, 자원을 많이 사용함(VM들끼리 자원을 나눠 사용)
- 하드웨어를 추상화해 한 컴퓨터 위에 가상 컴퓨터를 올리는 것(컴퓨터 하드웨어 단에서의 추상화)
- Docker
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
- 자체 파일 시스템을 가지고 있음 (Volume)
- 장점 - 다수의 소프트웨어를 각 컨테이너에서 독립적으로 실행 가능. 자원 소비가 적음(몇십 ~ 몇백 개의 컨테이너 실행 가능). 호스트 운영체제를 사용하기 때문에, 별도의 비용이 없음
- 단점 - 다수의 컨테이너를 관리하는 것이 쉽지 않음. 호스트 운영체제를 사용하기에, Cross-platform compatibility를 항상 지원하지 않음. GUI 소프트웨어 개발에 적합하지 않음
3. Airflow 운영상 이슈로 알아보는 Docker의 필요성
- 관리해야하는 DAG 수가 100개를 넘어간다면 생기는 문제
- 라이브러리/모듈 충돌
- DAG 혹은 Task 별로 독립 공간을 만들어주는게 필요함. DAG 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container) 안에서 실행
- worker 부족
- worker는 python으로 구성되어 있기 때문에 CPU의 수만큼 capacity가 있는 것
- DAG가 늘어나면서 worker가 부족해짐
- scale up / scale out - 클라우드 서비스 사용 권장 / K8s와 같은 컨테이너 기술 사용 - 필요한대로 서버 요청
- 낮은 서버 활용도 이슈
- Airflow 전용 서버를 할당했을 때의 이슈
- 아래 그림처럼 서버들이 항상 높게 활용되진 않음
- 서비스 별로 Capacity 관리 필요
- K8s와 같은 컨테이너 기술 도입으로 해결 가능
- Airflow 전용 서버를 할당했을 때의 이슈
- 라이브러리/모듈 충돌
4. Airflow의 운영상 이슈를 Docker로 해결하려면?
- 라이브러리/모듈 충돌 방지?
- DAG, Task코드를 이미지로 만들어 Docker Container 형태로 실행
- 개발 환경과 프로덕션 환경을 동일하게 유지 가능
- worker 부족?
- Airflow에 전용 서버를 할당하지 않고, Container Orchestration 서비스를 통해 할당해 사용하고 리턴함
- Airflow worker를 K8s에서 필요한 대로 동적으로 할당해 사용
- 낮은 서버 활용도 이슈?
- Airflow Operator(Task는 operator로 구현이 됨)로 KubernetesPodOperator를 사용
- Airflow Operator로 DockerOperator를 사용
- Airflow Executor(Task를 관리하고 실행하는 역할)로 아래를 사용
- KubernetesExecutor
- CeleryKubernetesExecutor
- LocalKubernetesExecutor
[출처] 데이터 엔지니어링 데브코스, 생활코딩