10주차 월요일, 46일차 Today I Learned
Docker, K8s (1)
: 도커 소개 및 설치, 간단한 예제
✏️ 학습 내용
1. Docker 개요 및 소개
1) Airflow 운영 상의 어려움
2) Docker 소개
3) Virtual Machines vs Docker Contatiners
1) Airflow 운영 상의 어려움
만약 Airflow에서 관리해야 하는 DAG의 수가 100개를 넘어가게 된다면, 데이터 품질이나 데이터 리니지 이슈 외 소프트웨어 버전 및 라이브러리 충돌, Worker 부족, Worker 서버들의 관리와 활용도 이슈 등 다양한 이슈들이 발생할 수 있다는 어려움이 존재한다. 이를 해결하기 위해 Docker와 K8S (쿠버네틱스)를 이용할 수 있다.
- 라이브러리 및 모듈의 충돌 : DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지므로, DAG 혹은 Task별로 별도의 독립공간을 만들어주는 것이 필요하다. → DAG 혹은 Task 코드를 Docker Image로 만들고 독립된 공간인 Docker Container 안에서 실행한다.
- Worker 부족 : Scale Up, Scale Out 방식으로 진행하다가 끝에 가서는 공용 서버 클러스터 K8s와 같은 컨테이너 기술을 사용하여 필요한 대로 서버를 요청하여 동적으로 할당해 사용할 수 있다.
- 낮은 Server Utilization 이슈 : 서비스별로 전용 서버를 할당하면 서비스별로 Capacity를 관리해야 하고, 각 서비스에 속한 서버들에 utilization이 낮은 이슈가 발생한다. → 컨테이너 기술의 도입으로 공용 서버에서 각 서비스가 필요할 때 온디맨드 형태로 사용하게 한다.
Airflow 아키텍처 :
Docker와 K8s를 사용하기 위한 방법으로는 Airflow Operator 사용하거나 Airflow Executor 이용하는 방법이 있다.
- KubernetesPodOperator : 특정 Task를 Docker Image로 만들어 K8s에서 실행
- DockerOperator : 특정 Task를 Docker Image로 만들어 Docker Container 위에서 실행
- KubernetesExecutor : 모든 DAG 코드가 Docker Image로 빌드되어 K8s에서 실행
- CeleryKubernetesExecutor : Celery Excutor + Kubernetes Executor
- LocalKubernetesExecutor : Local Excutor + Kubernetes Executor
Airflow Executor :
Task들을 관리하고 실행하는 역할을 수행한다. 다양한 수의 Executor 타입이 존재한다.
2) Docker 소개
설치 과정에서 중요한 파일이 빠졌거나, 사용하는 라이브러리 등의 버전이 안 맞거나, 환경 설정이 안 맞는 등의 문제로 내가 만든 프로그램이 다른 컴퓨터에서 실행이 안 될 수도 있다. 만약 컴퓨터 환경을 그대로 패키징해서 넘겨준다면 이 문제는 해결될 것이다.
Docker Image가 이렇게 독립적으로 완전하게 만들어진 패키지이며,
Docker Container가 이를 독립된 환경에서 실행한 것이다.
따라서 Docker의 목표는 소프트웨어를 일관되게 빌드하고 실행하고 배포하는 것이다.
3) Virtual Machines vs Docker Contatiners
VM :
AWS의 EC2와 같이 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것이다. 보통 하나의 컴퓨터 위에 다수의 VM을 실행하는 것이 일반적이며, 이 안에서 소프트웨어가 동작한다. 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공하여 충돌이 없지만, 비용과 속도와 자원에 있어서 단점이 존재한다.
Docker Containers :
소프트웨어를 실행하기 위한 독립적이고 분리된 공간으로, Volume이라는 자체 파일 시스템을 가지고 있다. 소프트웨어 실행을 위한 독립적이고 분리된 공간을 제공하며, 자원 소비가 적어 여러 컨테이너 실행이 가능하고, 호스트 OS를 사용하여 빠르게 실행되고, 별도 비용이 없다. 다만 많은 수의 컨테이너를 관리하는 것은 쉽지 않으며, Host OS를 사용하기에 Cross-platform compatibility를 항상 지원하는 것은 아니고, GUI 소프트웨어 개발에는 적합하지 않다.
2. Docker 설치
Docker Desktop과 Docker Engine이 있다. 도커 데스크탑은 도커 엔진에 여러 가지 툴을 더한 기능을 제공한다.
https://docs.docker.com/get-docker/
Get Docker
Download and install Docker on the platform of your choice, including Mac, Linux, or Windows.
docs.docker.com
설치 후, 터미널에서 "docker version" 명령을 실행하면 확인할 수 있다.
3. Docker 프로그램 개발 프로세스
예제 1) 간단한 Hello World 프로그램
예제 2) Ubuntu 실행
예제 3) MySQL 서버 실행
먼저 대상 소프트웨어를 선택하고, Docker file을 기반으로 Docker Image로 빌드하는 것을 Dockerization이라고 한다. Container를 통해 Docker Image 안의 소프트웨어를 실행할 수 있다.
추가로 Docker Image를 Docker Hub에 공유할 수 있다.
예제 1) 간단한 Hello World 프로그램
Node.js로 구성된 초간단 웹 서비스를 만들기 위해서 node 런타임 환경이 필요하다.
직접 설치하고 실행하려면 OS를 선택한 후 Node를 설치하고, 코드를 복사하여 프로그램을 실행하면 된다. 이 내용을 Dockerfile에 기술하면 Docker Image 생성이 가능하다.
Docker에게 소프트웨어 설치 명령을 기술하고, FROM으로 베이스 이미지를 기술한 다음, COPY로 코드 복사 후, CMD로 코드를 실행할 것이다.
CMD or ENTRYPOINT
가급적 CMD만 사용하는 것이 좋다.
ENTRYPOINT가 있으면 CMD 값이 파라미터로 실행되고, 아니면 CMD가 실행된다.
1) hello-world-docker 폴더 생성 후, docker file 생성
2) Docker file 내용 확인
3) Docker image 빌드하기
4) Repo 생성 후 PUSH하기
5) 다른 서버에서 Image를 허브에서 다운로드 받아 리눅스에서 실행해보기
예제 2) Ubuntu 실행
1) ubuntu 폴더 생성 후 그 안으로 이동 (터미널)
2) ubuntu 실행 (컨테이너도 실행 후 끝난다)
3) 실행 확인 (a option으로 실행이 끝난 것도 포함하여 보이도록 함)
4) 인터랙티브하게 ubuntu 실행하기
+) root 어카운트로 접속되어 nano라는 텍스트 에디터 설치 가능
cd ubuntu
docker run ubuntu
docker ps -a
docker run -it ubuntu
# +) 업데이트 후 설치, 실행, 필요 없을 시 삭제까지
apt update
apt install nano
nano
apt remove nano
예제 3) MySQL 서버 실행
1) Docker Engine 실행 후 터미널 프로그램 실행하여 폴더 이동
2) MySQL docker image 다운로드 (Docker Hub에서 PULL)
3) 다운로드받은 이미지로 Docker container 실행
- 이 때 이름 지정 가능 (--name={컨테이너이름})
- 기억하기 쉬운 이름을 Docker ps로 찾은 Container ID 대신 사용 가능
4) MySQL root 계정 패스워드 찾기
5) MySQL sehll 실행하기
cd mysql
docker pull mysql/mysql-server:8.0
docker run --name=mysql_container mysql/mysql-server:8.0
docker ps # 실행 확인
docker logs mysql_container 2>&1 | grep GENERATED
docker exec -it mysql_container mysql -uroot -p
# 임시 비밀번호 변경
ALTER USER root@localhost IDENTIFIED BY 'MeadowoodDr9$';
run : 주어진 이미지를 컨테이너로 처음 실행시킨다.
exec : 이미 실행되어 있는 컨테이너에게 명령어를 보낸다.
show databases;
use mysql;
show tables;
💡 배운 점
- Airflow를 사용하면서 Docker와 K8s 같은 컨테이너 기술이 왜 필요한지에 대해 배웠다.
- VM과 Docker Container의 차이점에 대해서 배웠다.
- Docker 설치 방법에 대해 알아봤다.
- Dockerization, DockerHub, Docker Tag 등에 대해 배웠다.
📝 남아있는 의문과 개선점
- VM에 대해 더 살펴보기
- Docker의 몇 가지 명령어들에 대하여
- Docker Tag
- Dockerization 정확하게
- 공식 이미지, 네임 스페이스 등 용어
☁️ 소감
도커에 대해서 배웠다. 도커는 컴퓨터 사양이 좋아야 한다. 최소 4GB는 확보되어 있어야 한다. 그래서 실습이 다소 어렵다.
'컨테이너'라는 개념에 대해 계속해서 사용하고 있는데, 이것이 왜 중요한지 다시금 깨달아야 하는 순간이 왔다. 컨테이너를 배우니까 가상 서버에 대해서도 다시금 떠올랐다. 컨테이너 서비스가 왜 필요한지 이해하면서 가상 서버가 왜 필요한지에 대해서도 배우면 좋을 것 같다. 이 부분을 좀 더 채워나가자 생각했다.
'Data Engineering > grepp 데브코스 : TIL' 카테고리의 다른 글
[TIL_2023.12.20] Docker, K8s (3) : Docker 명령어, Volume, cleanup, Multi-container로 구성된 소프트웨어 실행 (1) | 2023.12.20 |
---|---|
[TIL_2023.12.19] Docker, K8s (2) : CI/CD와 Github Actions, Test 및 Dockerization (0) | 2023.12.19 |
[TIL_2023.12.15] 데이터 파이프라인 (5) : OLTP 복사, ELT (0) | 2023.12.15 |
[TIL_2023.12.14] 데이터 파이프라인 (4) : PK 고유성, Backfill (0) | 2023.12.14 |
[TIL_2023.12.13] 데이터 파이프라인 (3) : Airflow DAG 작성 (0) | 2023.12.13 |