Docker - 1

이영준·2024년 5월 28일

Airflow 운영 상의 어려움

AIrflow를 운영할 때 겪는 일반적인 어려움이 무엇일까

관리해야 하는 DAG의 수가 100개를 넘어 간다면?

  • 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
    • 라이브러리 충돌
    • Worker의 부족
    • Worker 서버들의 관리와 활용도 이슈

라이브러리 충돌

  • 라이브러리/모듈의 충돌 이슈가 발생하기 시작
  • DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작
    • 예시로 python 버전
  • 이로 인해 dag 혹은 task별로 별도의 독립공간을 만들어주는 것이 필요해짐
    • 이를 위해 Docker를 사용
    • dag 혹은 task 코드를 docker image로 만들고 이를 독립된 공간인 docker container 안에서 실행

worker의 부족

  • 이를 위한 해결 방법은
    • scale up
    • scale out(클라우드 서비스 사용)
    • k8s와 같은 컨테이너 기술 사용

낮은 server Utilization

  • ariflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면? (언젠 바쁘고 언젠 여유롭고)
  • 서비스 별로 전용 서버를 할당하는 것은 여러가지 이슈가 생김
    • 관리해야하는 서비스 별로 capacity 관리르 해야함
    • 각 서비스에 속한 서버들을 보면 Utilization이 낮은 이슈 발생
  • k8s와 같은 컨테이너 기술의 도입으로 해결 가능

해결 방법

  • task나 dag code를 docker image로 만들어 dcoker container 형태로 실행
    • 라이브러리/모듈 충돌 방지
    • 개발 환경과 프로덕션 환경을 동일하게 유지
  • airflow worker를 k8s에서 필요한 대로 동적으로 할당하여 사용
  • airflow에서 이를 해결하는 방법은 3가지가 있음
    • airflow Operaotr로 kubernetesPodOperator를 사용
    • 혹은 dockerOperator를 사용
      • kubernetesExecutor
      • CeleyKubernetesExecutor
      • LocalKubernetesExcutor

airflow Executor

  • Excutor는 task들을 관리하고 실행하는 역할 수행
    • 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등
  • 다양한 수의 type이 존재
    • Sequential Excutor : default로 설치되며, Sqlite와 같은 싱글 스레드 db에서만 사용 가능
    • local Excutor : task들을 airflow 마스터 노드 안에서 실행(병렬은 가능하나, worker 노드가 하나 밖에 없는 문제)
    • Celery Excutor : 다수의 worker 노드가 있는 경우 Celery 큐를 사용해 task들을 worker 노드로 분산하여 실행
    • kubernetes Excutor : k8s 클러스터를 사용하여 task들을 독립된 환경에서 사용
    • Local Kubernetes Excutor와 Celery Kubernetes Excutor도 존재

Docker

  • 아래 문제들을 해결하기 위한 방법
    • 설치 과정에서 중요한 파일이 빠졌을 때
    • 사용하는 라이브러리 등의 버전이 안맞음
    • 환경 설정이 맞지 않는 것
  • 즉 내 컴퓨터 환경을 그대로 포장해서 다른 이에게 주는 것

Docker Image : 독립적으로 완전하게 만들어진 패키지
Docker Container: 이 docker image를 독립된 환경에서 실행한 것

docker의 목표

  • docker File (Build) docker Image (run) Docker Container
  • 소프트웨어를 일관되게 빌드하고 실행하는 배포

Virtual Machine과 docker container 차이

VM

  • aws와 ec가 대표적인 VM
  • 하드웨어를 추상화하여 한 컴퓨터 위에 가상 컴퓨터를 올리는 것

Virtual Machine의 장단점
장점

  • 소프트웨어를 실행하기 위한 독립적이고 분리된 공간 제공
  • 다 수의 소프트웨어를 각 VM단에서 독립적으로 싱행 가능

단점

  • 각 VM은 자신만의 os를 필요로 함(가상 하드웨어에서 돌아감)

    • 유료 os라면 라이센스 비용 필요
    • 그러다보니 시작하는데 오래 걸림
  • 자원을 너무 많이 사용함

    Docker Container

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

  • 자체 파일 시스템(Volume)

장점

  • 다수의 소프트웨어를 각 컨테이너 단에서 독립적 실행 가능
  • 자원 소비가 적음
  • 호스트 os를 사용 (빠르게 실행됨)

단점

  • 많은 수의 docker container를 관리하는 것은 어려움
  • host os를 사용하기에 cross-platform compatibility를 지원하지 않는다.
  • GUI 소프트웨어 개발엔 적합하지 않음

docker 개발 프로세스

  • 먼저 대상 소프트웨어 선택
    • 다수의 컴포넌트로 구성되는 소프트웨어라면 각각이 docker image로 만들어져야 할 수도 있음
  • 이를 docker image로 빌드(dockerization)

docker image 구성 요소

  • default os
  • 소프트웨어 자체
  • 라이브러리
  • 파일 시스템 스냅샷
  • 환경 설정 변수(빌드할 때 변수 , 실행할 때 변수 두 가지가 존재)
  • 메타 데이터 ( 버전,작성자, 설명 등등)

위 정보와 설치 관련 실행 순서등이 docker file에 기술됨

  • docker tag 명령의 경우 별칭을 만들어주는 것(이름을 바꾸는 것은 아님)
  • docker image의 실제 id는 image id
  • 이름 자체는 repo 이름과 tag로 구성됨
    • 한번에 쓰는 경우 :을 사이에 두고 같이 쓴다.

    docker tag

    docker image의 버전이나 변형을 나타냄
  • default value는 latest
  • docker image의 부가정보
    docker image 이름에서 :뒤에 해당

docker image 실행

  • container를 통해 docker image안의 소프트웨어를 실행
    • container는 자체 파일 시스템을 가진 특수한 프로세스로 이미지의 파일 시스템이 로딩됨
  • image를 container 안에서 실행
    • docker run

docker image의 등록 : docker hub

  • docker Registrty는 docker image들의 보관소
  • 여기에 등록을 하면 회사내 혹은 퍼블릭하게 이미지를 공유 가능

docker hub

  • https://hub.docker.com
  • docker가 제공해주는 서비스로 docker image를 공유하고 찾기 위한 서비스
  • 계정 업그레이드 하면 private한 repo 제공

전체적인 구조

테스트

테스트 할 것 사전 정보

  • node.js로 구성된 초간단 웹 서비스

docker file 생성

dockerfile 사용 가능 기타 키워드

ARG : docker image를 만들 때 사용되는 변수 지정
env: 컨테이너가 실행될 때 사용되는 환경 변수
user: 컨테이너를 실행할 때 사용할 유저 ID
expose:서비스 사용 포트 번호
run: 빌드시 실행되어야하는 명령들이 지정됨

dockerfile 키워드 : CMD, ENTRYPOINT

  • container가 시작 될 때 실행되어야 하는 명령어를 지정하는데 사용

  • 둘 다 dockerfile에서 여러 번 실행되면 마지막 것만 사용

  • 같이 사용하면 entrypoint가 기본 명령이 됨

docker image 생성

docker build --platform linux/amd64 -t hello-world-docker docker bulid를 실행하면 dockerfile에서 run 명령이 실행

docker image 확인

docker image ls

docker container로 실행

docker run hello-world-docker
다른 컴퓨터에서 이 이미지를 실행하고자 하면 docker registry에 등록

docker registry에 등록

  • dockerhub 접속

  • create registry

  • test할 것이니 hello-world-docker, public으로 지정

  • 터미널로 이동하여 다음 명령을 실행

  • 먼저 현재 이미지의 repo 이름을 papalio/hello-world-docker로 변경

docker image ls
docker tag hello-world-docker:latest papalio887/helo-docker:latest
docker image ls
docker login --username=papalio
docker push papalio/hello-world-docker

docker hub로부터 받은 image 실행

실습 방법

docker version
docker pull papalio/hello-world-docker
docker images ls
docker run papalio/hello-world-docker

명령어 종류

docker version:
docker build -t :
docker push:
docker tag:
docker pull:
docker run:

테스트 - 내 컴퓨터 환경에서

#hello-world-docker.py
print("hello, docker!")

이 파일을 이미지로 만들고자 함
docker 파일 생성

dockerfile_content = """
# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Run hello-world-docker.py when the container launches
CMD ["python", "hello-world-docker.py"]
"""

with open('Dockerfile', 'w') as file:
    file.write(dockerfile_content)

이후에
docker build -t hello-world-docker . 이미지 생성

그 다음에 docker registry에 등록하려고 함

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
PS C:\Users\dldud\Desktop\python_file\docker_test> docker login --username=papalio
Password:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
PS C:\Users\dldud\Desktop\python_file\docker_test> docker login --username=papalio
Password:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
PS C:\Users\dldud\Desktop\python_file\docker_test> docker login --username=papalio
Password:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
PS C:\Users\dldud\Desktop\python_file\docker_test> docker login --username=papalio
Password:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
PS C:\Users\dldud\Desktop\python_file\docker_test> docker login --username=papalio
Password:

Login Succeeded
PS C:\Users\dldud\Desktop\python_file\docker_test>

docker login --username=docker_user_name 으로 로그인(제발 비밀번호는 외워두자)

tag hello-world-docker:latest papalio/hello-world-docker:latest 으로 tag지정
push papalio/hello-world-docker:latest 명령어로 push

public으로 올라갔기 때문에 다른 이들이 사용도 가능함.

테스트 - docker 위에서 ubuntu 실행

# 순서

docker run ubuntu
docker ps
docker ps - a
docker run -it ubuntu
'''
○ nano
○ apt list
○ apt install nano
○ apt update
○ apt install nano
○ nano
○ apt remove nano
  
'''

  • ubuntu docker container로 진입

apt install nano를 위해 apt update를 먼저 진행
nano는 에디터(vi같은거)

테스트 -mysql 서버 실행

순서

  • docker engine 실행 확인하고 power shell 진입
  • mysql docker image 다운 docker pull mysql/mysql-server:8.0
  • docker run --name=mysql_container mysql/mysql-server:8.0
  • mysql root 계정 passwd 찾기 docker logs mysql_container 2>&1 | grep GENERATED
  • mysql shell 실행 docker exec -it mysql_container mysql -uroot -p
  • docker run은 새로운 컨테이너 실행, docker exec는 원래 있던거에 실행
  • docker exec -it mysql_container mysql -uroot -p 하고 password 입력

테스트

  • 서비스 시작
  • 아 참고로 위에서 grep 명령어는 window에서 안되므로 password을 찾으려면 docker logs mysql_container 2>&1 | Select-String "GENERATED ROOT PASSWORD" 명령어로 해야함.

profile
개인공부용(업데이트 중단)

0개의 댓글