로컬 환경(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
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에 다 작성해놓았기 때문에 따로 환경 구축을 할 필요는 없다.
바로 이미지를 실행해보자.
5. Docker run
docker run -it IMAGE명 bash
Docker run 명령어를 이용하면 이미지를 컨테이너화 하여 컨테이너 내부의 bash쉘로 접속할 수 있다.
실행 할때 i와 t같은 옵션도 붙일 수 있으니 공식 문서에서 옵션을 살펴 필요에 맞게 활용하자.