241213 TIL #562 AI Tech #95 17주차 주간학습정리 / Docker - 2

김춘복·2024년 12월 13일
0

TIL : Today I Learned

목록 보기
564/575

Today I Learned

오늘은 17주차 주간 학습정리와 지난 강의에 이어서 docker를 배웠다.


주간학습정리

학습 정리로 월~금 동안 매일
복습, 과제, 피어세션, 회고 정리했고 아래 링크 달았습니다.


팀 회고


Docker

Dockerfile

Docker 이미지를 생성하기 위한 설정 파일

  • 예시
    FROM, COPY, WORKDIR, RUN, CMD, EXPOSE
    (CMD는 인자 오버라이딩 가능, ENTRYPOINT는 인자 오버라이딩 불가능해 보안이 좋음)
FROM python:3.9-slim # FROM 베이스 이미지 지정. 이미지이름:태그

WORKDIR /app # WORKDIR 작업 디렉토리 (컨테이너 경로) 설정

COPY requirements.txt . # COPY 로컬디렉토리(파일) 컨테이너디렉토리(파일) 컨테이너로 파일 복사
COPY src ./src

RUN pip install --no-cache-dir -r requirements.txt # RUN 실행할 리눅스 명령어. '\'를이용해 여러 줄 동시 실행 가능

ENV APP_ENV=production # 환경변수 이름=값

EXPOSE 5000 # 컨테이너 외부에 노출할 포트 지정

CMD ["python", "src/main.py"] # CMD ["실행할명령어", "인자"] 이미지기반으로 컨테이너 만들 때 실행할 명령어
```[9]
  • 이미지 빌드 : 경로에 .을쓰면 현재 폴더를 의미
docker build -t 이미지이름:태그 dockerfile경로

Container Registry

  • 이미지파일을 업로드할 수 있는 원격 저장소

  • Dockerhub, GCP GCR. AWS ECR 등이 있다.
    미지정시 도커허브 사용

  • 새 이미지를 태그한 뒤 도커허브에 push.
    Dockerhub에 올릴 이미지 이름은 "계정ID/이미지이름" 형태여야한다.

docker tag 기존이미지:태그 새이미지이름:태그
docker push 새이미지이름:태그

이미지 최적화

  • ML프레임워크나 모델이 들어간 도커 이미지는 용량이 gb단위로 매우 크다.
    빌드 시간과 비용, 컨테이너시작시 메모리 문제로 인해 size 최적화가 필요하다.
  1. 작은 size의 base image 사용하기
    python같은경우 표준보다 slim, alpine이 용량이 작다.

  2. Multi Stage Build
    빌드엔 필요하지만 최종 컨테이너 이미지에는 필요없는 내용을 제외해 이미지 생성
    빌드 환경과 실행 환경을 분리해 최종 이미지 크기를 줄인다.
    COPY --from 옵션으로 실행 이미지로 전달이 가능하다

# Build stage
FROM python:3.9 AS builder

WORKDIR /app

# 필수 시스템 라이브러리 설치
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    software-properties-common \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --user -r requirements.txt 
# --user를 하면 /root/.local에 저장됨

# Runtime stage
FROM python:3.9-slim AS runtime

WORKDIR /app

# 최소한의 시스템 라이브러리만 설치
RUN apt-get update && apt-get install -y \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*

# Python 패키지 복사
# 아래에서 --from builder가 위에서 설치한 걸 
COPY --from=builder /root/.local /root/.local 
COPY ./src .
COPY ./models ./models

ENV PYTHONPATH=/root/.local/lib/python3.9/site-packages
ENV PATH=/root/.local/bin:$PATH

CMD ["python", "app.py"]
  1. 컨테이너 잘 패키징하기
    .dockerignore로 필요없는 파일 제거하고, .pt나 .pth같은 사이즈가 큰 모델 파일을 이미지 안에 저장하지 않고 컨테이너 스크립트가 시작될 때 받아오는 식으로 변경

Docker Compose

여러 컨테이너를 통합적으로 관리하고 운영하기 위한 도구

  • 여러 컨테이너의 설정을 YAML 파일(docker-compose.yml) 하나로 정의하여 관리

  • 여러 컨테이너의 실행 순서와 의존도를 관리할 수 있다.

  • 실행 명령어
    docker-compose up -d : 도커 컴포즈 실행. -d는 백그라운드 실행
    docker-compose down : 서비스 중단 후 컨테이너 제거
    docker-compose logs 서비스명 : 로그확인

  • docker-compose.yml 파일 예시

version: '3.1' # 도커 컴포즈 버전

services: # 실행할 컨테이너 정의. 각 서비스는 하나의 컨테이너
  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=myapp
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
    volumes: # 볼륨 정의
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - backend
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=myapp
    depends_on: # db 실행 후 실행된다는 뜻
      - db
    volumes:
      - ./src:/app/src
    networks:
      - backend
    restart: always # 컨테이너 재실행 정책
profile
Backend Dev / Data Engineer

0개의 댓글