데브코스 46일차 - Docker

Pori·2023년 12월 18일
0

데엔

목록 보기
39/47

Airflow 운영상의 어려움

DAG의 수가 증가함에 따라 발생하는 이슈들

  1. 라이브러리 충돌
    • DAG에 따라서 필요한 라이브러리/모듈이 달라지기 시작한다.
    • DAG나 Task별 독립적인 공간을 만드는 것이 필요하다. → Docker
  2. Worker의 부족
    • Scale 조정이 필요하다 (Up, Out)
    • K8s와 같은 컨테이너 기술이 사용되어야 한다.
  3. Worker 서버들의 관리와 활용도 이슈
    • 서버들이 항상 바쁘지 않는 경우.
    • 서비스별 전용 서버는 많은 이슈들이 발생함. (수용성, 활용성…)

해결

  • Task나 DAG를 Docker Image로 만들어서 컨테이너 형태로 실행
    • 모듈의 충돌을 방지
    • 개발 환경과 프로덕션 환경을 동일하게 유지한다.
  • Airflow Worker를 K8s에서 필요한 대로 동적으로 할당해서 사용한다.
    • KubernetesPodOperator를 사용 : Task를 Image로 만들어 K8s에서 실행
    • DockerOperator를 사용 : Task를 Image로 만들어 Docker에서 실행
    • Executor의 변경
      • Kubernetes : 모든 DAG코드가 Image로 빌드되어 K8s에서 실행된다.
      • CeleryKubernetes : Celery+Kubernetes, 로드가 전체적으로 큰데 소수의 task만 고립된 환경이 필요한 경우
      • LocalKubernetes : Local + Kubernetes

Docker

목표

: 소프트웨어를 일관되게 빌드하고 실행, 배포

VM vs Docker Containers

  • Virtual Machine : 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것
    • 장점
      • 소프트웨어 실행을 위한 독립적이고 분리된 공간을 제공
    • 단점
      • VM은 자신만의 OS가 필요하기 때문에 시간이 오래걸리고, 비용이 필요하다
      • 자원을 많이 사용하는 문제가 있다.
  • Docker Container : 소프으웨어를 실행하기 위한 독립적이고 분리된 공간. 자체 파일 시스템을 갖는다.
    • 장점
      • 소프트웨어를 실행하기 위한 독립적이고 분리된 공간을 제공
      • 자원의 소비가 적다
      • 호스트 OS를 사용한다
    • 단점
      • 많은 수의 Container를 관리하는 것은 어렵다.
      • GUI 개발에 적합하지 않다.
      • Cross-platform compatibility를 항상 지원하지 않는다.

VM vs Docker : https://k21academy.com/docker-kubernetes/docker-vs-virtual-machine/

Docker Desktop vs Docker Engine

  • Desktop : Docker Engine + Tools
  • Engine : Docker Container를 구축하고 실행하는 핵심 소프트웨어

Docker 프로그램 개발 프로세스

  • Docker Image Build : Dockeriztion
    • Dockerfile을 이용해서 Image를 생성
    • docker build -t tag
  • Docker Image의 구성요소 → Dockerfile에 기술된다.
    • OS
    • 소프트웨어 자체
    • 라이브러리
    • 파일 시스템 스냅샷
    • 환경 설정 변수
    • 메타 데이터
  • Image의 실행
    • Container를 통해 이미지안의 소프트웨어를 실행한다. docker run
  • Image의 등록 (Docker Hub)
    • Registry를 통해 Image들을 보관한다.
    • On-prem, Cloud
    • Docker Hub를 통해 Github와 연동 가능

Docker 실습

실습1. Hello World

  • 개요
    • Node.js로 구성된 간단 웹서비스
    • 보통은 node 환경이 설정되어 있어야한다.
  • Dockerfile의 생성 : 소프트웨어 설치 명령을 기술
    • 먼저 베이스 이미지를 먼저 기술하고, 코드 복사, 코드 실행의 순서로 작성된다.

      FROM node:OS_name (ex: Alpine)
      COPY ./app (현재 디렉토리의 내용을 Image의 /app으로 COPY)
      WORKDIR /app
      CMD node app.js
  • Dockerfile keywords
    • ARG : Image를 만들 떄 사용되는 변수 지정 → 최종 이미지에는 안들어간다, 컨테이너 실행 시에는 ARG 변수 접근 불가
    • ENV : 컨테이너 안의 환경 변수를 정의 (환경변수)
    • USER : 컨테이너가 실행될 때 사용할 유저 ID
    • Expose : 서비스 사용 포트번호
    • RUN : 반드시 실행되어야하는 명령들이 저장된다. (docker build), RUN apt-get update && apt-get install -y curl
    • 참고
  • CMD vs Entrypoint
    • 공통점
      • 컨테이너가 시작할 때 실행되어야 하는 명령어를 지정하는데 사용
      • 한 Dockerfile에서 여러번 실행되는 경우에 마지막 것만 사용된다.
    • 차이점
      • 같이 사용되는 경우에 Entrypoint가 기본 명령이 되고, CMD가 인자를 제공한다.
      • Entrypoint는 —entrypoint 옵션을 통해서만 덮어쓰기가 가능하다.
    • CMD만을 쓰는것을 권장한다.
  • Dockerfile 예시
    • FROM python:3.7-slim-buster : 파이썬 3.7버전을 사용, slim-buster라는 세팅을 가져온다.
    • ENV DEBIAN_FRONTEND noninteractive : 환경 변수, Build time에만 사용됨
    • ARG AIRFLOW_USER_HOME = /usr/local/airlfow : 이미지에서도 최종 저장된다.
    • RUN chown -R airflow: $(AIRFLOW_USER_HOME} : 빌드 시 실행되는 명령
    • ENTRYPOINT ["/[entrypoint.sh](http://entrypoint.sh)"], CMD["webserver"] : /entrypoint.sh webserver 명령
  • Docker Image 생성

: docker build --platform linux/amd64 -t hello-world-docker. : hello-world-docker 라는 이미지가 빌드된다, platform 옵션을 이용해서 아키텍처를 지정해준다. (Mac에서는 ARM 기반이기 때문에 amd기반으로 적용시키기 위해 사용)

  • Image 확인은 docker image ls 를 이용
  • Push
    • docker login —username=user_name : 로그인
    • docker push user_name/hello-world-docker : upload
    • 결과는 DockerHub에서 확인이 가능하다.
  • Docker Hub로부터 받은 Image 실행
    • https://labs.play-with-docker.com/ : 4시간동안 서버를 무료로 사용가능
    • docker pull user_name/hello-world-docker : image pull
    • docker run user_name/hello-world-docker : image run

실습2. Ubuntu 실행

  • docker run ubuntu
  • docker ps
  • docker ps -a
  • docker run -it ubuntu : 사용자가 입출력이 가능하도록 가상 터미널환경 에뮬레이션

참고 : docker run 커맨드

실습3. MySQL 서버 실행

  • MySQL docker image 다운로드 : docker pull mysql/mysql-server:8.0
  • MySQl container 실행 : docker run --name=mysql_container mysql/mysql-server:8.0
    • —name : 이름을 지정, docker exec 같은 container_id가 필요한 경우에 사용된다.

  • MySQL root 계정의 패스워드 찾기 : docker logs mysql_container 2>&1 | grep GENERATED
  • MySQL shell 실행 : docker exec -it mysql_container mysql -uroot -p
    - MySQL 첫 실행 시에 ALTER USER 명령으로 pw를 변경해야함
    : ALTER USER root@localhost IDENTIFIED BY '<my_password>';

참고

Airflow Executor

  • Executor는 Task들을 관리하고 실행하는 역할을 수행한다.
  • Type
    • Sequential : Default, Sqlite와 같은 싱글스레드 DB에서만 사용 가능하다.
    • Local Executor : task들을 Airflow 마스터 노드에서 실행한다.
    • Celery Executor : 다수의 Worker노드가 있는 경우 사용된다. Celery 큐를 사용해서 task들을 worker 노드로 분산해서 실행한다.

docker run vs docker exec

  • docker run : 새로운 Container를 실행하는 것이다.
  • docker exec : 실행된 Container에 작업을 하는것이다. → Conatiner ID가 필요한 이유
  • —user root 또는 -u root로 루트 유저로 연결 가능하다.

Docker Image 이름과 tag

  • tag : 별칭을 만들어주게 된다. docker tag image_name tag_name, default = latest
    • image_name:tage_name 처럼 생기게 된다.
  • Image name
    • Docker Hub에서 다운받는 경우 어카운트 ID를 포함할 수 있다.
    • 공식 이미지의 경우 네임스페이스가 없다.
      • 포맷 : repo_name: tag (bitnami/airflow, hello-world-docker:latest, ubuntu:18.04)

0개의 댓글