Product Serving(6): Docker

SeongGyun Hong·2024년 12월 13일

NaverBoostCamp

목록 보기
45/64

1. 가상화란?

개발할 때에 서비스 운영에 사용하는 서버에 직접 들어가는 일은 드물다.
보통 다 Local에서 개발하고 완료되면 Staging 그리고 이후에 Production서버에 배포한다.

근데 이때! 개발을 진행한 Local 환경과 Production 서버 환경이 다른경우...
라이브러리, 파이썬 등이 미묘하게 다를 수 있어서
배포할 때 개발할 때와 다르게 작동하지 않는 부분들이 있을 수 있다.

그래서 이걸 매번 환경 맞춰주고 이러기는 너무 힘드니까 나온 것이 바로 가상화

  • 서버 환경까지도 소프트웨어화 하자!
    • Research / Production 환경에서 공통적으로 사용하는 일종의 템플릿인 것!
    • 주로 사용 했던 것이 VM
      • 호스트 머신이라고 하는 실제 물리적인 컴퓨터 위에, OS를 포함한 가상화 소프트웨어를 두는 방식
      • 예컨데, 호스트 머신은 Window인데, Window에서 Linux를 실행
      • 또는 호스트 머신은 Mac인데, Mac에서 Window 실행
    • 그런데 이게 OS 위에 OS를 하나 더 실행시킨다는 저에서 VM은 굉장히 많은 리소스를 잡아먹음=> 무겁다고 표현
      따라서 VM의 무거움을 크게 덜어주면서 가상화를 좀 더 경량화한 프로세스로 Container가 등장

2. Docker

  • Docker => Container 기술을 잘 사용할 수 있도록 나온 도구가 바로 Docker


출처: https://collabnix.com/docker-vs-virtual-machine-vm-key-differences-you-should-know/

  • Docker Image로 만들어두고 재푸팅하면 Docker Image의 상태로 재실행

  • Docker Image
    컨테니어를 실행할 때 사용할 수 있는 "템플릿"

    • Read Only
  • Docker Container
    Docker Image를 활용하여 실행된 인스턴스

    • Write 가능

그래서 이게 왜 좋나요?

=> 다른 사람이 만든 소프트웨어를 환경 제약 없이 바로 가져와서 사용 가능하다.

  • MySQL을 Docker로 실행하든가
  • Jupyter Notebook을 Docker로 실행하든가... 다 가능!

다른 사람이 만든 소프트웨어: Docker Image

  • OS, 설정을 포함한 실행 환경

  • Host OS가 무엇이든지 Linux, Window, Mac 어디에서나 동일하게 실행 가능

  • 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있으며

    • 원격 저장소에 저장하면 어디서나 사용 가능

      원격저장소 ? => Container Regeistry

      • 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행

실행하기

  1. docker를 공식 홈페이지에서 다운 받고

  2. 터미널에서

    docekr

    쳐서 확인하고

  3. 이후 docker pull mysql:8 같이 이미지 다운받아서

  4. docker images로 제대로 다운받아 졌는지 재확인

  5. 다운 받은 docekr image를 기반으로 컨테이너를 띄워야겠다?
    docker run "이미지 이름:태그"

    docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
    1. docker run
    • 의미: 새로운 컨테이너를 생성하고 실행할 때 사용
    • 역할: 지정한 Docker 이미지를 기반으로 컨테이너 실행

    1. --name mysql-tutorial
    • 의미: 컨테이너 이름 지정
    • 역할: 생성된 컨테이너를 mysql-tutorial이라는 이름으로 부를 수 있도록 설정함 (이거 없으면 임의로 Docker가 이름 부여함

    1. -e MYSQL_ROOT_PASSWORD=1234
    • 의미: 환경 변수(Environment Variable) 설정
    • 역할: MYSQL_ROOT_PASSWORD는 MySQL 공식 이미지에서 사용하는 표준 환경변수로써 루트 비밀번호를 설정하기 위해 반드시 지정해야 함

    1. -d
    • 의미: Detached 모드에서 컨테이너를 실행
    • 역할: 컨테이너를 백그라운드에서 실행함. 터미널을 차지하지 않음

    1. -p 3306:3306
    • 의미: 호스트와 컨테이너 간의 포트 연결 설정
    • 역할: 호스트의 3306번 포트를 컨테이너의 3306번 포트에 맵핑함,

      MySQL 서버의 기본 포트가 3306이므로, 외부에서 이 컨테이너에 접근할 때 호스트의 3306번 포트를 사용

    1. mysql:8
    • 의미: 사용할 Docker 이미지와 태그 지정
    • 역할: mysql이라는 이름의 이미지 중 버전 8을 기반으로 컨테이너를 생성 (:8은 버전을 의미하며 MySQL 버전을 8로 명시적으로 지정한 것)
  1. 실행한 컨테이너는
    docker ps 명령어로 확인

컨테이너 안으로 진입까지 해보자!

docker exec -it "컨테이너 이름(혹은ID)"/bin/bash

Compute Engine에서 SSH와 접속하는 것과 유사하다.

구체적으로 MySQL 프로세스로 들어가면 MySQL 쉘 화면이 보인다.

mysql -u root -p

  1. 작동을 멈춘 컨테이너는 docker ps -a명령어로만 확인할 수 있음
    docker ps는 실행중인 컨테이너만 보여줌

  2. 컨테이너는 멈춘 컨테이너만 삭제할 수 있고
    이는 docker rm "컨테이너 이름(ID)"로 삭제 가능

이외에도
docker stop "컨테이너 이름(ID)": 실행중인 컨테이너 중지
docker rm "컨테이너 이름(ID)": 중지된 컨테이너 삭제

와 같은 기본 명령어가 있음

3. Docker run할 때 파일을 공유하는 방법

  • Container안에 있는 파일의 경우 보통 컨테이너를 삭제하면 자동으로 사라진다. 즉, HOSTContainer 간에 파일 공유가 되지 않는다는 것

  • 만약 파일을 유지하고 싶다면 HostContainer의 저장소를 공유하여야 한다.

  • Volumne Mount를 진행하면 HostContainer의 폴더가 공유되는데,

  • -v옵션을 사용하며, `-p(Port)처럼 사용한다.

    • -v Host_Folder:Container_Folder
      ex)

      docekr run it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspacejupyter/minimal-notebook
  • Docekrhub에 많은 이미지가 올라와있다!

4. Docekr Image 만들기: 프로젝트 셋팅

간단한 PyTorch example 코드를 실행하는 Docker Image를 생성해보자

  1. 먼저 폴더를 하나 만들고 여기에 poetry 세팅과 torch 관련 패키지 설치

  2. Dockerfile 파일을 만들어서 작성한다.
    아래는 예시

# 1. 베이스 이미지로 공식 PyTorch 이미지 사용
# PyTorch가 사전 설치된 Python 환경을 제공
FROM pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime

# 2. 작업 디렉토리 설정
# 컨테이너 내에서 작업할 디렉토리를 /app으로 설정
WORKDIR /app

# 3. 요구 사항 파일 복사
# 호스트 머신에서 컨테이너로 requirements.txt 파일을 복사
COPY requirements.txt .

# 4. Python 패키지 설치
# requirements.txt에 명시된 모든 Python 패키지를 설치
RUN pip install --no-cache-dir -r requirements.txt

# 5. 애플리케이션 코드 복사
# 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY . .

# 6. 포트 노출 (필요한 경우)
# 컨테이너가 외부와 통신할 포트를 지정 (예: 8080)
EXPOSE 8080

# 7. 기본 실행 명령 설정
# 컨테이너 시작 시 실행할 기본 명령어를 설정 (예: main.py 실행)
CMD ["python", "main.py"]

단계별 설명

  1. 베이스 이미지 선택:

    • FROM pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime는 PyTorch가 사전 설치된 Docker 이미지를 사용한다.
      이 이미지에는 CUDA 및 cuDNN도 포함되어 있어 GPU 가속을 활용할 수 있음.
  2. 작업 디렉토리 설정:

    • WORKDIR /app은 컨테이너 내에서 /app 디렉토리를 작업 디렉토리로 설정
      이후의 모든 명령은 이 디렉토리 내에서 실행
  3. 요구 사항 파일 복사:

    • COPY requirements.txt .는 호스트 머신의 requirements.txt 파일을 컨테이너의 현재 작업 디렉토리 (/app)로 복사한다.
  4. Python 패키지 설치:

    • RUN pip install --no-cache-dir -r requirements.txtrequirements.txt에 명시된 모든 Python 패키지를 설치한다.
      --no-cache-dir 옵션은 캐시를 사용하지 않아 이미지 크기를 줄이는 데 도움을 줌
  5. 애플리케이션 코드 복사:

    • COPY . .는 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사.
      우리 예시에서는 여기에 PyTorch 예제 코드가 포함되어야 함
  6. 포트 노출:

    • EXPOSE 8080은 컨테이너가 외부와 통신할 포트를 지정
  1. 기본 실행 명령 설정:
    • CMD ["python", "main.py"]는 컨테이너 시작 시 실행할 기본 명령어를 설정
      여기서는 main.py라는 Python 스크립트를 실행하도록 설정

Docker 이미지 빌드 및 실행

Dockerfile을 작성한 후, 다음 명령어를 사용하여 이미지를 빌드하고 실행

docker build -t my-pytorch-app .

이게 의미하는 바는

  • 이미지 생성(빌드)
  • .은 현재 폴더에 Dockerfile이 있음을 의미
  • -t "이미지이름:태그" 옵션으로 이미지 이름과 태그 지정할 수 있음
    • 태그는 미 지정시 "latest"로 채워짐
docker run --rm my-pytorch-app

doker run "이미지 이름:태그"를 하는 것으로
방금 만든 이미지를 실행하는 명령어
태그가 latest인 경우에는 생략이 가능하다.

5. Docker Image 만들기 - 정리

  • 파이썬 환경 및 애플리케이션 코드 작성
  • Dockerfile 작성
    • FROM으로 베이스 이미지를 지정하고
    • COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사한다.
    • WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉토리를 지정하고
    • RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
    • CMD로 이미지 실행 시 바로 실행할 명령어를 지정
  • docker build "Dockerfile이 위치한 경로" -t "이미지 이름:태그"으로 이미지 빌드
  • docker run"이미지 이름:태그"로 빌드한 이미지를 실행

이외에도 Dockerfile에서 사용하는 것이 있는데

  • EXPOSE: 컨테이너 외부에 노출할 포트 지정
  • ENTRYPOINT: 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

그럼 CMD랑 ENTRYPOINT 둘 다 도커 이미지 시작할 때 app.py 실행에 쓰일 수 있는거 아닌가요?

예 맞습니다. 다만
CMD의 경우에는 실행 시점에 오버라이딩할 수 있으나
ENTRYPOINT의 경우 오버라이딩이 어렵다. 그런데, 그렇기에 보안적인 면에서 더 안전하다.

오버라이딩이 뭔가용?
오버라이딩이란 명령어에 추가 인자를 제공하였을 때에 해당 명령어가 덧 씌워지는 것을 말함. 즉, 말 그대로 대체 하는 것

6. Registry에 Docker Image Push

이제 우리가 만든 이미지를 인터넷에 업로드 해서 배포해보자..,.

이를 위해 이미지 저장소인 Container Registry에 Docker Image Push ...
근데 Container Registry 는 다양하다

도커 허브도 있고
GCP, AWS도 있다.

GCP 쓰면 GCR 쓰는거고
AWS 쓰면 ECR 쓴다.

dockerhub에 우리는 올린다.

  • docker tag "기존 이미지:태그" "새 이미지 이름:태그"
    dockerhub에 올릴 이미지 이름은 내 계정ID/이미지 이름 형태여야 함
  • 큰 흐름은 아래와 같이 기억하자
    • Build => Tag => Push
  • Push한 이미지는 docker pull 명령어로 어디서든 받을 수 있다.

머신러닝 모델이 들어간 이미지는 좀 사이즈가 크다...
이거 어떻게 최적화 할지 좀 생각해 볼만 하다. 왜냐하면 다음 문제가 있기 때문

7. Docker Image Size 최적화

  • ML 프레임워크, 모델이 들어간 도커 이미지의 사이즈가 큰 것이 왜 문제가 되나요?
  1. 빌드 타임: 이미지 빌드하는 시점에서의 문제

    • 아니 이거 어떻게 기다려요??
      새로운 이미지로 교체하기 위해 기다려야 하는 시간이 늘어나서 신속한 대응이 어려움

    • 비용
      네트워크 전송하는 절대량이 많아짐으로써 비용이 발생
      이것도 다 돈임! 디스크 용량, 빌드 시간 ,, 네트워크,,, 등등...

  2. 런타임: 도커 이미지 실행 시점의 문제

    • 컨테이너 시작할 때 메모리에 로드되는 용량이 매우 큼
    • Image pull 땡길때 기다리는 시간 엄청 길어짐
  3. Host 머신 디스크

    • 이미지 하나의 용량이 매우 크니까 VM인스턴스 환경 등에서 디스크에 대한 용량 관리가 필요해짐...
    • 근데 이건 앞서 말했듯이 다 비용의 문제가 됨.

그래서 이거 어떻게 해결하나요?

  1. 작은 Base Image 선정해서사용하기
    아무거나 고르지 말고 알맞은 Base Image를 찾자
    사용할 OS package들만 설치 후 사용하자
    디버깅 하는 목적으로 필요한 shell 환경도 중요
    bash, zsh 등이 안 깔려있는 이미지도 있음!

파이썬 표준이미지만 보더라도
파이썬 표준인 python:3.9가 있는가하면
파이썬 슬림인 python:3.9-slim이 있다.
슬림한 데비안 이미지 기반인데, Production 환경에 적합하다.
이 외에도 파이썬 알파인 이미지도 있는데, 이렇게 BaseModel을 고름에 있어서 가벼운 걸로 내 프로젝트에 맞춰 땡기는 것이 중요하다.

  1. Multi Stage Build 활용하기
    Multi Stage Build 도커 이미지를 효율적으로 작성하고 최적화하기 위한 방법, 컨테이너 이미지를 만들면서 빌드엔 필요하지만 최종 컨테이너 이미지엔 필요 없는 내용을 제외하며 이미지를 생성하는 방법이다.
  • 최적화에 정말 많이 쓰인다.
    하나의 파일에 여러 이미지를 빌드하고 사용
    Base 이미지를 바꾸면서 사용하며 2개 이상의 Dockerfile이 있는 것처럼 빌드 수행

COPY --from 옵션을 통해서 실행 이미지로 전달할 수 있음

예시
Single Stage vs Multi Stage

Single Stage Build (비효율적인 방식)

# Base 이미지로 Python 3.9 사용
FROM python:3.9

# 작업 디렉토리 설정
WORKDIR /app

# requirements.txt 파일 복사
COPY ./requirements.txt /app/requirements.txt

# 패키지 설치 - 캐시 미사용, 용량 증가 요인
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

# 애플리케이션 파일 복사
COPY ./simple_webserver.py /app/simple_webserver.py

# 실행 명령 설정
CMD ["python", "simple_webserver.py"]

Multi Stage Build (최적화된 방식)

# Stage 1: 빌드 환경 구성
FROM python:3.9 as build
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

# Stage 2: 실행 환경 구성
FROM python:3.9 as runtime
WORKDIR /app

# build 스테이지에서 필요한 파일만 복사
# /root/.local: pip install로 설치된 패키지 위치
COPY --from=build /root/.local /root/.local

# 애플리케이션 파일만 복사
COPY ./simple_webserver.py /app/simple_webserver.py

# PATH 환경변수 설정 - pip 설치 경로 추가
ENV PATH=/root/.local:$PATH

# 실행 명령 설정
CMD ["python", "simple_webserver.py"]
  • 최적화 효과
    • 빌드 도구와 중간 파일들이 제외됨
    • 필수 실행 파일만 포함
    • 최종 이미지 크기 대폭 감소
    • 보안성 향상

이거 잘 활용하면 1/10 으로 줄일 수도 있음!

  1. Container를 잘 패키지하자
    • .dockerignore로 필요없는 파일들 제거
    • .pt, .pth 파일과 같은 큰 사이즈 asset들은 빌드에서 포함하지 않고, 빌드 타임 혹은 컨테이너 시작하는 스크립트에서 다운로드
    • Dockerfile 안에서 commnad들의 순서 최적화를 통해 캐싱을 최대한 이용
      • 변경 가능성이 낮은 명령어를 위로, 변경 가능성이 높은 명령어는 아래에 위치

8. Furthermore: Docker Compose

  • 여러 Docker Image를 실행하게 해주는 것

이거 왜 쓰나요?
1. 구체적인 경우로 따지면
에어플로우는 항상 웹서버와 스케줄러를 같이 띄워야 하는데 도커 이미지에서 한번에 띄우는 거 말고 각각을 따로 띄워야 할 때도 있음
그때 사용하는게 바로 Docker Image

2. 혹은 의존성 문제가 있을 수 있음
A먼저 띄우고 나중에 B Container를 띄워야 하는 경우가 있을 수 있음.
예를 들면 A는 데이터베이스고, B는 웹서비스인 경우가 이에 해당함

3. docker run 옵션 관리 및 Volumn Mount 관리에 유용
docker run할 때 옵션이 너무 다양하고, Volumn Mount를 하지 않았다면 데이터가 모두 날아갈 판...
이럴 때 유용하게 사용하는 것이 Docker Compose이다.

요약하자면 Docker Compose 는~

  • 여러 컨테이너를 한번에 실행할 수 있으며
  • 여러 컨테이너의 실행 순서, 의존도 또한 관리 가능하고
  • docker-compose.yml 파일에 작성하여 운용한다고 생각하면 된다.

Docker Compose 기본 구조 예시

MySQL과 애플리케이션 서버를 연동하는 docker-compose.yml 파일의 기본 구조 예시이다.

# Docker Compose 파일의 버전 지정 (최신 버전 중 하나)
version: '3'

# 서비스(컨테이너) 정의 섹션
services:
  # MySQL 데이터베이스 서비스 설정
  db:
    # MySQL 8.0 공식 이미지 사용
    image: mysql:8.0
    
    # 컨테이너에 custom 이름 부여 (기본 이름 대신 사용)
    container_name: mysql_db
    
    # 데이터베이스 초기 설정을 위한 환경 변수들
    environment:
      # MySQL root 계정의 비밀번호
      MYSQL_ROOT_PASSWORD: rootpassword
      
      # 애플리케이션에서 사용할 데이터베이스 이름
      MYSQL_DATABASE: myapp_db
      
      # 일반 사용자 계정 이름
      MYSQL_USER: user
      
      # 일반 사용자 계정 비밀번호
      MYSQL_PASSWORD: userpassword
    
    # 호스트와 컨테이너 간 포트 매핑 (외부에서 MySQL 접근 가능)
    ports:
      - "3306:3306"
    
    # 데이터 영구 보존을 위한 볼륨 마운트
    volumes:
      - db_data:/var/lib/mysql
    
    # 컨테이너 간 네트워크 연결 설정
    networks:
      - app-network

  # 스프링 부트 애플리케이션 서비스 설정
  app:
    # 로컬 Dockerfile을 사용하여 이미지 빌드
    build: 
      # 빌드 컨텍스트 (Dockerfile이 위치한 디렉토리)
      context: .
      # 사용할 Dockerfile 지정
      dockerfile: Dockerfile
    
    # 애플리케이션 컨테이너에 custom 이름 부여
    container_name: myapp
    
    # DB 서비스가 완전히 시작된 후에 이 서비스 시작
    depends_on:
      - db
    
    # 호스트와 컨테이너 간 포트 매핑 (애플리케이션 접근)
    ports:
      - "8080:8080"
    
    # 스프링 부트 데이터베이스 연결 설정 환경 변수
    environment:
      # MySQL 서비스와 연결되는 JDBC URL
      # 'db'는 서비스 이름을 참조 (Docker 내부 네트워크)
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/myapp_db
      
      # 데이터베이스 사용자 이름
      SPRING_DATASOURCE_USERNAME: user
      
      # 데이터베이스 사용자 비밀번호
      SPRING_DATASOURCE_PASSWORD: userpassword
    
    # 애플리케이션을 데이터베이스와 같은 네트워크에 연결
    networks:
      - app-network

# 영구 데이터 저장을 위한 볼륨 정의
volumes:
  db_data:

# 컨테이너 간 통신을 위한 네트워크 정의
networks:
  # 브릿지 네트워크 드라이버 사용 (컨테이너 간 통신)
  app-network:
    driver: bridge

주요 구성 요소 설명

데이터베이스 서비스 (db)

  • MySQL 8.0 이미지 사용
  • 환경변수로 데이터베이스 접속 정보 설정
  • 3306 포트 매핑
  • 데이터 영속성을 위한 볼륨 설정

애플리케이션 서비스 (app)

  • Dockerfile을 통한 애플리케이션 빌드
  • 데이터베이스 서비스 의존성 설정
  • 8080 포트 매핑
  • 데이터베이스 연결을 위한 환경변수 설정

실행 순서

  1. docker-compose.yml 파일 작성
  2. docker-compose up -d 명령어로 실행 # background옵션
  3. docker-compose ps 명령어로 상태 확인
  4. docker-compose logs 명령어로 로그 확인
  5. docker-compose down 서비스 중단(컨테이너, 볼륨 등 삭제)

참고로 docker-compose.yml 파일을 수정하고 docker-compose up을 하게되면 컨테이너를 재생성하고 서비스를 재시작함.
docker-compose up이 완료되면 docker ps 명령어나, docker-compose ps 명령어로 현재 실행되고 있는 컨테이너를 확인할 수 있다.

주의사항

  • 네트워크 설정을 통해 컨테이너 간 통신 보장
  • 볼륨 설정으로 데이터 영속성 확보
  • 환경변수를 통한 설정 관리
  • depends_on을 통한 서비스 시작 순서 제어

이외에도

  • secrets
    보안이 필요한 데이터 전달
  • configs
    컨테이너에 사용할 config 파일
  • command
    컨테이너가 시작될 때 실행할 명령 지정

등의 기능이 있다.


9. Docker 실습 가이드

1. MySQL 데이터베이스 설치

  • Step 1: MySQL Docker 이미지 다운로드

    docker pull mysql:8.0
  • Step 2: 컨테이너 실행

    docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testpass -p 3306:3306 -v mysql_data:/var/lib/mysql -d mysql:8.0
    • MYSQL_ROOT_PASSWORD, MYSQL_DATABASE 등 환경 변수 설정 필수.
    • 볼륨 마운트를 통해 데이터 영구 저장 (-v mysql_data:/var/lib/mysql).
  • 에러 핸들링:

    1. "Access denied" → 비밀번호 설정 확인.
    2. "Port already in use" → 포트 충돌 시 다른 포트 사용 (-p 3307:3306).

2. Jupyter Lab 설치

  • Step 1: Jupyter Lab Docker 이미지 다운로드

    docker pull jupyter/base-notebook
  • Step 2: 컨테이너 실행

    docker run --name jupyter-lab -p 8888:8888 -v $(pwd):/home/jovyan/work -d jupyter/base-notebook
    • 로컬 디렉토리를 /home/jovyan/work로 마운트해 데이터 공유.
    • URL 출력되는 토큰값을 통해 접속.
  • 에러 핸들링:

    1. "Cannot access notebook" → 브라우저 주소 확인 (토큰 포함 여부).
    2. "Permission denied" → 볼륨 경로에 권한 부여 (chmod 활용).

3. Docker Compose로 Jupyter Lab 설치

  • Step 1: docker-compose.yml 작성

    version: "3.9"
    services:
      jupyter:
        image: jupyter/base-notebook
        ports:
          - "8888:8888"
        volumes:
          - ./workspace:/home/jovyan/work
  • Step 2: Compose 실행

    docker-compose up -d
  • 에러 핸들링:

    1. "Service not found" → docker-compose.yml 파일 경로 확인.
    2. "Volume not mounted" → 경로 오류 여부 점검.

4. Airflow 설치 및 DAG 폴더 설정

  • Step 1: docker-compose.yml 작성

    version: "3.9"
    services:
      airflow:
        image: apache/airflow:2.6.1
        environment:
          - AIRFLOW__CORE__LOAD_EXAMPLES=False
        volumes:
          - ./dags:/opt/airflow/dags
        ports:
          - "8080:8080"
  • Step 2: 초기화 및 실행

    docker-compose up airflow-init
    docker-compose up -d
  • 에러 핸들링:

    1. "Webserver not reachable" → 포트 8080이 열려 있는지 확인.
    2. "DAGs not visible" → dags 폴더 위치 확인 및 DAG 파일 포맷 점검.

5. FastAPI + DB 설치

  • Step 1: docker-compose.yml 작성

    version: "3.9"
    services:
      fastapi:
        build: .
        ports:
          - "8000:8000"
      db:
        image: mysql:8.0
        environment:
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_DATABASE=fastapi_db
        ports:
          - "3306:3306"
  • Step 2: Docker Compose 실행

    docker-compose up -d
  • 에러 핸들링:

    1. "DB connection error" → FastAPI의 DB_URL 환경 변수 확인.
    2. "Port conflict" → 포트 충돌 시 다른 포트 설정.

공통 주의 사항

  1. 포트 충돌: 기존에 사용 중인 포트가 있을 경우 변경 필요.
  2. 환경 변수 확인: 비밀번호나 유저 이름 등 설정 일치 여부.
  3. 로그 확인: 오류 발생 시 docker logs [컨테이너명] 명령으로 원인 파악.
  4. 볼륨 경로: 로컬 경로와 컨테이너 경로 간 일치 여부 점검.
  5. 버전 호환성: Docker 이미지 버전과 시스템 설정 호환 확인.
profile
헤매는 만큼 자기 땅이다.

0개의 댓글