Python 프로젝트의 Docker 이미지 생성 및 배포 과정

이 예제는 Python 기반 프로젝트를 Docker 이미지로 빌드하고 저장소에 푸시하는 방법을 설명합니다.

필수 준비사항

Docker가 시스템에 설치되어 있어야 합니다.

프로젝트 설정

프로젝트 루트 디렉토리에서 작업을 수행하면 해당 프로젝트만 포함된 이미지를 생성할 수 있습니다.

의존성 파일 생성

pip install pipreqs

# 의존성 목록 생성
pipreqs ./

# 인코딩 문제가 발생할 경우 아래 명령어 사용
pipreqs ./ --encoding=utf8 --force

# 실행 후 requirements.txt 파일이 생성됨

Dockerfile 구성

프로젝트 루트에 확장자 없는 Dockerfile을 생성하고 다음 내용을 추가합니다:

FROM python:3.7
ENV PATH /usr/local/bin:$PATH
ADD . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
CMD ["scrapy", "crawl", "quotes"]
  • FROM: Python 3.7 베이스 이미지를 사용하여 Scrapy 프로젝트 실행 환경 구축
  • ENV: PATH 환경변수에 /usr/local/bin 경로 추가
  • ADD: 로컬 소스코드를 컨테이너 내 /app 디렉토리로 복사
  • WORKDIR: 작업 디렉토리를 /app으로 설정하여 이후 명령어 실행 위치 지정
  • RUN: requirements.txt에 명시된 Python 패키지 설치
  • CMD: 컨테이너 시작 시 실행될 기본 명령어 정의

참고: 다운로드 속도가 느린 경우 알리바바 클라우드 미러를 활용할 수 있습니다.

이미지 빌드

다음 명령어로 Docker 이미지를 생성합니다:

docker build -t quotes:crawler .

빌드 성공 시 다음과 유사한 출력을 확인할 수 있습니다:

Sending build context to Docker daemon 191.5 kB
Step 1/6 : FROM python:3.7
 ---> 968120d8cbe8
Step 2/6 : ENV PATH /usr/local/bin:$PATH
 ---> Using cache
 ---> 387abbba1189
Step 3/6 : ADD . /app
 ---> a844ee0db9c6
Removing intermediate container 4dc41779c573
Step 4/6 : WORKDIR /app
 ---> 619b2c064ae9
Removing intermediate container bcd7cd7f7337
Step 5/6 : RUN pip3 install -r requirements.txt
 ---> Running in 9452c83a12c5
...
Removing intermediate container 9452c83a12c5
Step 6/6 : CMD ["scrapy", "crawl", "quotes"]
 ---> Running in c092b5557ab8
 ---> c8101aca6e2a
Removing intermediate container c092b5557ab8
Successfully built c8101aca6e2a

생성된 이미지 확인:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
quotes       crawler   41c8499ce210   2 minutes ago   769 MB

컨테이너 실행 및 테스트

# 컨테이너 실행
docker run -d --name quote-crawler quotes:crawler

# 실행 중인 컨테이너 확인
docker ps

# 컨테이너 내부 접속
docker exec -it quote-crawler /bin/bash

정상적으로 작동하는지 확인하고, 오류 발생 시 여러 번 재시도해보세요.

이미지 푸시

# 컨테이너를 새로운 이미지로 커밋
docker commit quote-crawler myuser/quotes:crawler

# 태그 추가
docker tag myuser/quotes:crawler myuser/quotes:latest

# Docker Hub 로그인
docker login

# 원격 저장소에 푸시
docker push myuser/quotes:latest

태그: docker python Dockerfile Containerization image-building

5월 28일 19:40에 게시됨