[TIL] 개발환경 구축을 위한 Docker와 K8S 실습 (1)

이원진·2023년 6월 12일
0

데브코스

목록 보기
46/54
post-thumbnail
post-custom-banner

학습내용


  1. Airflow 운영상의 어려움

  2. Docker 소개

  3. Docker 설치

  4. Docker 프로그램 개발 프로세스

  5. 실습: 간단한 Hello World 프로그램

1. Airflow 운영상의 어려움


  • 라이브러리

    • 라이브러리 / 모듈의 충돌 이슈 발생

    • DAG에 따라 실행에 필요한 라이브러리 / 모듈이 달라짐

    • 이로 인해 DAG 혹은 태스크별로 별도의 독립 공간을 만들어줘야 함

    • DAG 혹은 태스크 코드를 Docker Image로 만들고 이를 Docker Container 안에서 실행

  • Worker의 부족

    • DAG의 수가 증가함에 따라 Airflow의 용량이 부족할 경우, Worker(CPU)가 부족할 수 있음

    • 해결책

      • Scale Up

      • Scale Out
        • 클라우드 서비스 사용

      • K8S와 같은 컨테이너 기술
        • Airflow Worker가 필요한만큼 K8S에서 동적으로 할당해 사용

  • 낮은 서버 가동률

    • 서비스별로 전용 서버를 할당하는 것은 여러 가지 이슈를 발생시킴

      • 서비스별로 용량 관리해야 함

      • 각 서비스에 속한 서버의 낮은 가동률

    • 마찬가지로 K8S와 같은 컨테이너 기술 도입으로 해결 가능

      • Airflow에 전용 서버를 할당하는 것이 아닌, Container Orchestration 서비스를 통해 할당, 사용 후 반환

  • Airflow에서 Docker, K8S 사용하는 방법

    1. Airflow Operator로 KubernetesPodOperator 사용

      • 특정 태스크를 Docker Image로 만들어 K8S에서 실행

    2. Airflow Operator로 DockerOperator 사용

      • 특정 태스크를 Docker Image로 만들어 Docker Container 위에서 실행

    3. Airflow Executor로 다음 중 하나를 사용

      • Airflow Executor: 태스크를 관리하고 실행하는 역할

      • KubernetesExecutor: 모든 DAG 코드가 Docker Image로 빌드되어 K8S에서 실행

      • CeleryKubernetesExecutor: CeleryExecutor와 KubernetesExecutor를 동시에 사용

        • Airflow 로드가 전체적으로 큰데 소수의 태스크만 독립시킬 경우 사용

      • LocalKubernetesExecutor: LocalExecutor와 KubernetesExecutor를 동시에 사용


2. Docker 소개


  • 개발한 프로그램이 다른 컴퓨터에서 안 돌아가는 문제를 해결하기 위해 Docker 사용

    • 내 컴퓨터 환경을 그대로 패키징해서 배포

    • Docker Image: 독립적으로 완전하게 만들어진 패키지

    • Docker Container: Docker Image를 독립된 환경에서 실행한 것

  • 소프트웨어를 일관되게 빌드, 실행, 배포하는 것이 Docker의 목표

  • Virtual Machines vs Docker Containers

    • Virtual Machines

      • AWS EC2가 대표적인 Virtual Machine(VM)

      • 하드웨어를 추상화해서 컴퓨터 위에 가상의 컴퓨터를 올린 것

        • 보통 하나의 컴퓨터 위에 다수의 VM을 실행
      • 장점

        • 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공

        • 다수의 소프트웨어를 각각의 VM에서 독립적으로 실행 가능

      • 단점

        • 각각의 VM이 자신만의 OS를 필요로 함

        • 실행하는데 오래 걸리고, 유료 OS일 경우 라이센스 비용 필요

        • VM끼리 자원을 공유하기 때문에 자원을 많이 소비함

    • Docker Containers

      • 소프트웨어를 실행하기 위한 독립적인 공간

      • Volume이라고 부르는 자체 파일 시스템을 갖고 있음


      • 장점

        • 다수의 소프트웨어를 각각의 Container에서 독립적으로 실행 가능

        • 자원 소비가 적어 몇 백개까지의 Container 실행 가능

        • 호스트 OS를 사용해 빠른 실행

      • 단점

        • 많은 수의 Container를 관리하는 것이 쉽지 않음

        • 호스트 OS를 사용하기 때문에 다른 OS와 호환이 어려움

        • GUI 소프트웨어 개발에 적합하지 않음


3. Docker 설치


  • Docker Desktop = Docker Engine + Tools

  • 사양

      • 4GB 이상의 메모리

      • 맥 OS 11버전 이상

    • 윈도우

      • 4GB 이상의 메모리

      • 64비트 윈도우 10 or 윈도우 11

      • Hyper-V, Container 기능 활성화

      • WSL 기능 지원


4. Docker 프로그램 개발 프로세스


  • Docker 사용 프로세스

    1. 대상 소프트웨어 선택

      • 다수의 컴포넌트로 구성된 소프트웨어의 경우, 각각을 Docker Image로 빌드해야할 수도 있음

    2. Docker Image로 빌드(Dockerization)

      • Dockerfile: 세부 정보를 기술하는 텍스트 파일

        • 해당 소프트웨어를 Image로 만들기 위한 Docker 명령어 포함

      • Docker Image: 하나의 Docker Container 안에서 실행

        • Dockerfile을 기준으로 만들어지며, 소프트웨어를 실행하기 위해 필요한 모든 것을 포함

  • Docker Image 구성 요소

    • 기본 OS와 같은 소프트웨어의 실행 환경

    • 소프트웨어(코드)

    • 라이브러리

    • 파일 시스템 스냅샷

    • 환경 설정 변수: 빌드 시의 변수와 실행 시의 변수 두 가지

    • Image 메타 데이터

  • Docker Image 실행

    • Docker Container를 통해 Image 내의 소프트웨어가 실행됨

      • Container는 자체 파일 시스템을 갖는 특수한 프로세스로, Image의 파일 시스템이 로딩됨

      • Docker Image 등록: Docker Hub

        • Docker Registry: Docker Image들의 보관소

      • On-premise Registry와 Cloud Registry로 구분

    • Docker Hub

      • Docker가 제공하는 Image 공유 서비스

      • Public, Private Repo 제공

      • Official Image 사용 가능

      • Github와 연동을 통해 Automated Build 제공


5. 실습: 간단한 Hello World 프로그램


  • Dockerfile

    • Docker에게 소프트웨어 설치 명령을 기술하는 역할

    FROM node:alpine
    COPY ./app
    WORKDIR /app
    CMD node app.js
    • FROM: 베이스 이미지

    • COPY: 코드 복사

    • WORKDIR: Working Directory 지정

    • CMD: 사용할 명령

    • 기타 키워드

      • ARG: Docker Image를 만들 때 사용되는 변수 지정

        • 최종 Image에는 적재 X

      • ENV: Container가 실행될 때 사용되는 환경변수

        • 최종 Image에 적재

      • USER: Container 실행 시의 사용자 ID

      • EXPOSE: 서비스 사용 포트번호

      • RUN: 빌드 시 실행할 명령

        • 보통 다른 패키지를 설치하거나, 새로운 레이어를 생성할 때 사용

  • Dockerfile 키워드: CMD vs ENTRYPOINT

    • 비슷하게 Container가 시작할 때 실행되어야 하는 명령을 지정하는 기능

    • 둘 다 하나의 Dockerfile 내에서 여러 번 사용할 경우, 마지막 것만 실행됨

    • 둘을 같이 사용할 경우, ENTRYPOINT가 기본 명령이 되고, CMD가 인자를 제공

      ...
      ENTRYPOINT ["entrypoint.sh"]
      CMD ["param1", "param2"]

    • 가능한 CMD만 사용

      • ENTRYPOINT 사용 시 파라미터가 감춰질 수 있기 때문에 혼란 발생 가능

  • 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에 이미지 업로드

      • 공식 이미지의 경우 repo_name 없음

    • docker pull image_name: Docker Hub에서 이미지 다운로드

    • docker run --name = XXX: Container ID 대신 name을 사용해 Image 실행

    • docker logs: Container에서 생성된 stdout, stderr단의 로그를 읽어옴

      • --follow 옵션을 사용해 지속적으로 스트리밍 가능

  • docker run vs docker exec

    • docker run: 새로운 container 실행

    • docker exec: 실행된 Container 위에서 작업
      • Container ID가 필요

    • 두 명령 모두 --user_root 혹은 -u root를 통해 루트 사용자로 연결 가능

  • Docker tag

    • Docker Image의 버전이나 변형을 나타내는 문자열

      • default: latest

      • Image 이름 뒤 세미콜론 뒤에 작성


메모



post-custom-banner

0개의 댓글