[Docker] Python 크롤러 프로젝트 Docker image로 EC2로 배포하기

2023. 4. 24. 15:35· #️⃣ Project 및 개발일지/개발일지
목차
  1. 로컬에서의 작업 
  2. EC에서의 작업

로컬 환경(Windows)에서 만든 Python 기반의 크롤러 프로젝트를 Docker image로 만들어 이를 EC2에서 실행하고자 한다. 

원래는 github 프로젝트를 clone하여 프로젝트를 가져와 이를 실행할까 생각했는데, 

   (1) 현재 프로젝트가 100% 완성되지 않아서 수정으로 여러번 배포가 될 것이기도 하고,

   (2) 크롤링을 위해서 환경 구축하는데 시간을 줄이고자

docker image화 하여 배포하는 것으로 선택하였다. 


로컬에서의 작업 

프로젝트 환경 구성은 다음과 같다. 

주요 정보들은 config 폴더에,

실행 결과는 result 와 prev_result 폴더에,

로깅으로 기록되는 로그 파일은 logs 폴더에, 

그리고 나머지 .py 파일은 클래스 및 test 코드 이다. 

 

 

1. requrements.txt 만들기

해당 프로젝트에 쓰이는 라이브러리를 pip freeze 명령어를 이용하여 requrements.txt에 저장하자.

pip freeze > requirements.txt

명령어를 실행하면 다음과 같이 pip으로 설치된 모든 라이브러리 목록이 저장된 것을 확인할 수 있다.  

 

 

2. Dockerfile 만들기

프로젝트와 파이썬 버전 등을 포함하여 기본 Dockerfile을 작성해보자.

#./Dockerfile 
FROM python:3.10.10

WORKDIR /app

# Install dependencies
COPY requirements.txt ./
RUN pip install -r requirements.txt

# Copy project files
COPY . .

# Set environment variables
ENV PYTHONPATH "${PYTHONPATH}:/app"

# Start the crawler
CMD ["python", "crawler.py"]

나는 여기에 덧붙여 selenium을 동작하기 위해 chrome과 chromedriver를 설치해야 하기에 설치하는 명령어를 더 추가하여 아래의 Dockerfile을 만들었다.

#./Dockerfile 
FROM python:3.10.10

WORKDIR /app

# Install dependencies
RUN apt-get update && \
    apt-get install -y wget gnupg2 && \
    wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list && \
    apt-get update && \
    apt-get install -y google-chrome-stable && \
    rm -rf /var/lib/apt/lists/*

# Install ChromeDriver
RUN CHROMEDRIVER_VERSION=$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE) && \
    wget -q -O /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
    unzip /tmp/chromedriver_linux64.zip chromedriver -d /usr/local/bin/ && \
    rm /tmp/chromedriver_linux64.zip

# Copy project files
COPY . .

# Install Python dependencies
COPY requirements.txt ./
RUN pip install -r requirements.txt


# Set environment variables
ENV PYTHONPATH "${PYTHONPATH}:/app"

 

 

3. 이미지로 빌드하기

Dockerfile를 작성했으니 이미지로 만든다. 

이미지로 만드는 이유는 만든 이미지를 dockerhub에 올려, 이후 ec2에서 해당 이미지를 다운받아 바로 실행할 수 있도록 하기 위함이다.

docker build -t webtoon_crawler .

webtton_crawler 라는 이미지명으로 이미지를 빌드한다.

 

위의 명령어를 입력했다면 아래 명령어로 이미지를 조회해보자.

리스트에 webtoon_crawler가 잘 있다.

 

(추가로 해당 단계에서 docker image를 run하여 실행이 잘 되는지 확인해보는 것을 추천한다. 

docker hub에 올리기전에 해당 이미지가 정상적으로 잘 실행되는지 확인하는 것이 좋기 때문이다.

글쓴이의 경우 확인 안 하고  바로 올린다음 ec2 에서 다운로드 했는데 실행이 안되는것을 확인하고는... 위의 과정을 다시 처음부터 진행했다.....😂  image  빌드 후 꼭 실행해보자..!) 

 

 

5. DockerHub에 private으로 올려 배포할 예정이기에, 다음 설정이 필요하다.

(만약 외부 공개를 할거면 docker push 명령어로 바로 업로드 하면 된다.)

(무료 회원은 private repository를 오직 1개만  만들 수 있다. 이 점 유의하자!)

 

Dockerhub 사이트에 로그인 하여 Create Repository를 누른다.

그런다음 repository 이름을 설정하고 visibiility를 Private으로 설정한다.

create 버튼을 누르면 아래 화면으로 넘어온다.

'사용자명/repo이름' 으로 잘 생성된 것을 알 수 있다.

이제 만든 위의 repo에 아까 위에서 build한 이미지를 업로드해보자.

그 전에 build한 이미지의 이름을 repo의 이름과 동일하게 변경해야된다. 

 

 

4. 이미지 태그 지정 및 이름 변경

이를 아래 형식에 맞게 dockerhub에 업로드한다. 

먼저 docker에 로그인한후, 이미지 이름과 태그를 지정하여 push하면 된다.

docker login
docker tag <이미지 ID> <레지스트리 URL>/<이미지 이름>:<태그
# 예시 
docker tag c2522829c58b hmk9667/naverwebtoon_crawler:0.0.1

docker tag명령어를 이용하여 해당 이미지의 이름을 repo 이름으로 바꾼 후 태그를 붙여주었다.

 

 

5. 이미지 Push

이제 만든 dockerhub의 private repository에 이미지를 push할 차례이다.

docker push hmk9667/naverwebtoon_crawler:0.0.1

명령 실행 후 기다리면 잘 올라간 것을 확인할 수 있다. 

업로드 완료

자 이제 로컬에서의 작업은 모두 끝났다.! 

EC2로 넘어가서 docker hub의 이미지를 다운받아 크롤러 프로젝트를 실행시켜보자!

 

 


EC에서의 작업

1. 비어있는 EC2를 준비한다. 

(간단한 프리티어 버전 ec2를 만드는 방법은 아래 글에서 확인하실 수 있습니다.)

https://hyem207.tistory.com/83

 

[AWS] 쉽고 빠르게 프리티어 EC2 만들기

1. aws console 로그인 하고 검색창에 ec 검색후 '인스턴스 시작'하기를 누른다. 리전은 서울로 하여 트래픽과 동시에 비용을 줄이고자 함 (계정이 없다면 회원가입하기) 2. 이름 지정 하기 만들 ec2 서

hyem207.tistory.com

 

2. EC에 터미널 접속하여 아래 명령어로 Docker를 다운받고 시작하기

sudo apt-get update
sudo apt-get install docker.io
docker -v
sudo service docker start
sudo usermod -aG docker USER_NAME
newgrp docker

1) apt 업데이트

2) Docker  다운로드

3) Docker version을 확인하여 잘 설치되었는지 확인

4) Docker 실행

5) Docker 그룹에 sudo를 추가하여 도커를 바로 제어할 수 있도록 함 

6) 변경 사항을 적용하기 위해 사용자가 다시 로그인 해야되는데 newgrp 명령어로 현재 세션을 새 그룹 구성을 업데이트 한다.

 

3. docker 에  login하자

docker login

위의 명령어를 치고 Username과 password를 쳐서 로그인한다.

4. docker pull

위에서 올린 이미지를 pull한다!

docker pull yourusername/repositoryname:tag
# 예시 
docker pull hmk9667/naverwebtoon_crawler:0.0.1

이미지 빌드시 파이썬과 프로젝트 그리고 프로젝트에 필요한 드라이버 및 라이브러리들을 Dockerfile에 다 작성해놓았기 때문에 따로 환경 구축을 할 필요는 없다.

바로 이미지를 실행해보자.

image pull 완료

 

5. Docker run 

docker run  -it IMAGE명 bash

Docker run 명령어를 이용하면 이미지를 컨테이너화 하여 컨테이너 내부의 bash쉘로 접속할 수 있다. 

컨테이너 내부에 위치한 프로젝트 파일들

실행 할때 i와 t같은 옵션도 붙일 수 있으니 공식 문서에서 옵션을 살펴 필요에 맞게 활용하자.

 

 

 

 

저작자표시 비영리 동일조건 (새창열림)

'#️⃣ Project 및 개발일지 > 개발일지' 카테고리의 다른 글

[오류해결] Selenium 사용시 target frame detached (failed to check if window was closed: disconnected: Unable to receive message from renderer) 에러 - screen 사용  (0) 2023.05.03
[AWS EC2] SSH 연결: Permission denied (publickey) 오류 해결  (0) 2023.04.26
[Python] 에러 클래스의 메세지를 Slack chat으로 보내기  (0) 2023.04.24
[Spring] SpringBoot와 Spring 그리고, Gradle과 Maven 차이 등  (0) 2022.07.17
[Android&Nodejs] 카카오톡 연동 로그인  (0) 2022.02.13
  1. 로컬에서의 작업 
  2. EC에서의 작업
'#️⃣ Project 및 개발일지/개발일지' 카테고리의 다른 글
  • [오류해결] Selenium 사용시 target frame detached (failed to check if window was closed: disconnected: Unable to receive message from renderer) 에러 - screen 사용
  • [AWS EC2] SSH 연결: Permission denied (publickey) 오류 해결
  • [Python] 에러 클래스의 메세지를 Slack chat으로 보내기
  • [Spring] SpringBoot와 Spring 그리고, Gradle과 Maven 차이 등
HyeM207
HyeM207
"Reflections and Growth Through Records" 회고와 기록을 통한 성장으로
HyeM207
HYEM's Storage
HyeM207
  • ALL (115)
    • #️⃣ CS (Computer Science) (5)
      • Database (2)
      • SQL (2)
      • Git (1)
    • #️⃣ Data Engineering (43)
      • Airflow (18)
      • Spark (8)
      • Snowflake (2)
      • BI,DashBoard (4)
      • ELK Stack (2)
      • Hadoop (5)
      • Kafka (4)
    • #️⃣ Cloud&Container (16)
      • AWS (8)
      • GCP (1)
      • Docker (6)
      • Kubernetes (1)
    • #️⃣ Project 및 개발일지 (37)
      • Mini Project (5)
      • 개발일지 (9)
      • Algorithm 문제 풀이 (20)
    • #️⃣ 책 리뷰 (4)
    • #️⃣ 회고글&프로젝트 후기 (10)

공지사항

인기 글

최근 댓글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
hELLO · Designed By 정상우.v4.2.2
HyeM207
[Docker] Python 크롤러 프로젝트 Docker image로 EC2로 배포하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.