1. Dockerfile 작성
내가 구현한 모듈을 Docker 이미지로 만들기 위한 설명서인 Dockerfile을 작성한다.
Python과 FastAPI 기반이므로, uvicorn이라는 비동기 서버로 실행하도록 구성하였다.
# 베이스 이미지: 파이썬 3.11 슬림 버전
FROM python:3.11-slim
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 소스 코드 복사
COPY . .
# 서버 실행 (main.py 파일의 app 객체를 8000 포트로 실행)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
CMD 부분의 "main:app" 부분을 본인 프로젝트에 맞춰서 작성하면 된다.
[파이썬 파일명]:[FastAPI 앱 변수명] 형식으로 지정
2. Docker 이미지 빌드 및 Docker Hub에 푸시
먼저 로컬 PC의 프로젝트 폴더에서 터미널을 열고 아래 명령어를 입력한다.
마지막 '.'이 현재 디렉토리의 Dockerfile을 사용하라는 의미이므로 꼭 포함시켜줘야 한다.
docker build -t {DockerHubID}/{프로젝트명} .
빌드된 이미지는 현재 로컬 PC에만 존재하므로 중앙 이미지 저장소인 Docker Hub에 올려준다.
docker login
docker push {DockerHubID}/{프로젝트명}
+ Mac OS라면 아래 트러블 슈팅으로 넘어가주세여
3. AWS EC2 준비 및 배포
AWS에서 Ubuntu를 사용하는 EC2 인스턴스를 하나 생성하고,
보안 그룹 설정을 통해 SSH(22번)와 HTTP(80번) 포트 등등을 열어주었다.
로컬 터미널에서 pem 키 통해서 이 서버에 접속한다.
ssh -i "키페어이름.pem" ubuntu@<EC2-퍼블릭-DNS-주소>
Docker를 설치하고
Docker Hub에 올려두었던 프로젝트 이미지를 가져온다.
docker pull {DockerHubID}/{프로젝트명}
마지막으로, 내려받은 이미지를 컨테이너로 실행하면 끝 !!!
# -d: 컨테이너를 백그라운드에서 계속 실행 (detached mode)
# -p 80:8000: EC2 서버의 80번 포트로 들어온 요청을 컨테이너의 8000번 포트로 전달
docker run -d -p 80:8000 --name my-ai-app {DockerHubID}/{프로젝트명}
🚨트러블 슈팅
1. 의존성 충돌
처음에 우분투의 패키지 매니저인 apt를 이용하여 도커를 설치하였더니 의존성 충돌 에러가 발생했다.
# 시도했던 명령어
sudo apt-get install docker.io
에러 메시지: The following packages have unmet dependencies: containerd.io : Conflicts: containerd
우분투의 containerd와 도커의 containerd.io가 같은 시스템 자원을 두고 충돌을 일으킨 것이었다.
해결 방법 : 기존 패키지 완전 삭제 -> 공식 스크립트로 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
2. no matching manifest 아키텍처 불일치
에러 메시지: no matching manifest for linux/amd64 in the manifest list entries
원인은 CPU 아키텍처의 불일치였다.
개발 환경인 내 로컬 컴퓨터는 M3 Mac이므로 arm64 아키텍처 기반이지만,
실행 환경인 AWS EC2 인스턴스는 amd64 아키텍처 기반의 CPU를 사용한다.
해결 방법: Docker가 지원하는 buildx 라는 CLI 플러그이니 사용
buildx로 타겟 플랫폼 지정
docker buildx build 명령어에 --platform 플래그를 추가하여, 이미지가 실행될 환경인 linux/amd64를 명시적으로 지정해준다.
# M3 맥(로컬) 터미널에서 실행
# --push 플래그 사용하여 빌드 끝나자마자 푸시하도록
docker buildx build --platform linux/amd64 -t {DockerHubID}/{프로젝트명} --push .
'My projects' 카테고리의 다른 글
[DriveMate 🚘] AI로 사용자의 졸음 감지하기 (0) | 2024.11.21 |
---|---|
[Unity 게임 프로젝트] 나는 음식의 왕이 될거야! - 김밥편 - (0) | 2024.08.26 |
Ne(o)rdinary HACKATHON 참가 후기 (0) | 2024.06.03 |