(NCP, Django, Docker) Django REST Framework 서버 배포기 (2) - 프로젝트의 도커 이미지 생성 후 NCP 서버 배포

이상준·2024년 3월 10일

NCP-DRF배포기

목록 보기
2/3
post-thumbnail

목표

Docker 로 배포하기
지난 포스트에서 NCP서버를 열고 필요한 파이썬 버전 설치까지 진행하였다. 이제 이 서버에 내가 만든 django서버를 배포해보려고 한다.


서버 아키텍쳐

- python version : 3.11
- Django version : 5.0
- djagno rest framwork version : 3.14.0
- 사용한 NCP server 이미지 : Ubuntu 20.04


1. requirements.txt 만들기

  • 도커에 빌드할 python 패키지들을 한번에 설치하기 위해 requirements.txt로 만든다 -> 참고자료

2. Dockerfile 작성

도커파일이란?

  • 도커 이미지를 생성하기 위한 DSL으로서 몇가지 명령어들 커스텀 이미지를 만들 수 있게 한다.
  • 프로젝트 최상단 루트(manage.py 가 있는 디렉토리)에서 'Dockerfile' 이라는 파일을 생성한다.
  • Dockerfile 내용

3. Docker Image 생성 (docker build)

Docker image란?

  • 배포 컨테이너(Docker container)를 만드는 데 사용되는 일기 전용 템플릿.
  • 배포 컨테이너(Docker container)는 이런 템플릿에서 생성된 배포된 인스턴스이다.
  • Image가 콜라병의 레시피라면, container는 그 레시피를 보고 공장(docker)에서 찍어낸 콜라병이다.
  • Docker login
docker login
  • Docker build 명령어 실행
# docker build '옵션' '도커에 가입한 계정'/'프로젝트명':'버전' '경로'
docker build -t lsjmc0225/blink-was:0.1.0 .

이때, '.'은 현재 경로를 나타낸다.

  • build를 기다리기

4. build한 이미지 실행시키기

이미지를 실행은 이미지를 컨테이너화한다는 것과 같은 맥락이다.

# 내 로컬의 도커 이미지 모두 확인하기 
docker images
# 내 로컬에 있는 이미지 컨테이너로 만들어 실행시키기
docker run --name '컨테이너명' -d -p 'host 포트번호':'컨테이너 포트번호' '도커에 가입한 계정'/'프로젝트명':'버전'
# 현재 가동중인 컨테이너 목록 확인하기
docker ps -a

  • -d : 지속적으로 실행한다는 옵션
  • -p : 포트포워딩한다는 옵션
  • -a : 정지된 컨테이너 확인한다는 옵션
    컨테이너 목록 확인결과 STATUS에 Exited (1) 11 seconds ago라는 오류가 발생하였다.

4-1. Exited (1) 11 seconds ago 오류 해결

컨테이너 내에서 발생한 로그를 확인

docker logs '컨테이너명'

  • 확인 결과 해당 오류는 container 생성 후 DB를 migrate 하는 과정에서 발생한 것으로 보인다.
  • 이를 해결하려면 제대로 migrate 한 project 폴더를 다시 이미지화하여야한다.
  1. db.sqlite3 삭제
  2. 프로젝트 앱의 __init__.py 제외 모든 migrations 파일 삭제
  3. migration 다시 진행
# manage.py 가 있는 경로에서
python manage.py makemigrations
python manage.py migrate
  1. 기존 Docker container 삭제
# 컨테이너 확인
docker ps -a
# 컨테이너 삭제 (이때, 컨테이너가 종료되었는지 확인하세요)
docker rm '컨테이너명'
  1. 기존 Docker image 삭제
# 현재 이미지 확인
docker images
# 이미지 삭제
docker rmi '이미지명'
  1. Docker build
# docker build '옵션' '도커에 가입한 계정'/'프로젝트명':'버전' '경로'
docker build -t lsjmc0225/blink-was:0.1.0 .
  1. 빌드된 이미지 실행(컨테이너화)
# 내 로컬의 도커 이미지 모두 확인하기 
docker images
# 내 로컬에 있는 이미지 컨테이너로 만들어 실행시키기
docker run --name '컨테이너명' -d -p 'host 포트번호':'컨테이너 포트번호' '도커에 가입한 계정'/'프로젝트명':'버전'
# 현재 가동중인 컨테이너 목록 확인하기
docker ps -a

  • docker ps -a를 하였을 때 위의 사진처럼 STATUSUp n seconds라고 보이면 정상적으로 컨테이너가 작동중이라는 뜻이다.
  • 만약 이렇게 해도 되지 않으면 다시 docker logs '컨테이너명'을 이용해 로그를 확인하고 해결해야한다.

5. 컨테이너 작동 확인 후, 이미지 푸시하기

로컬에서 컨테이너가 작동하는 것을 확인했으므로 docker hub에 푸시하여 NCP서버에서도 활용가능하게 하자.

  1. 이미지 푸시하기
# 이미지 푸시
docker push '도커에 가입한 계정'/'프로젝트명':'버전'

  • 이미지 푸시 완료
  1. NCP에서 docker 설치하기
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" 
sudo apt update 
apt-cache policy docker-ce
sudo apt install docker-ce
  1. NCP에서 docker 로그인하기
sudo docker login
  1. 도커 이미지 pull 하기
sudo docker pull '도커에 가입한 계정'/'프로젝트명':'버전'
  1. 도커 이미지 실행하기 (컨테이너화)
docker run --name '컨테이너명' -d -p 'host 포트번호':'컨테이너 포트번호' '도커에 가입한 계정'/'프로젝트명':'버전'
# 컨테이너 실행 잘 됐나 확인
sudo docker ps -a
  • 정상적으로 잘 실행되었다.

5-1 만약 NCP에서 컨테이너가 작동함에도 불구하고 'public ip':8000 로 접근했을 때, 들어가지지 않는다면

NCP ACG inbound 규칙에 8000번 포트를 추가하자

  • 해당 서버에 적용된 ACG상에서 inbound 규칙에
    {프로토콜 : TCP, 접근소스 0.0.0.0/0, 허용포트 : 8000} 추가

이번 포스트에서 진행한 내용

이번 포스트에서는 docker를 이용해 로컬의 프로젝트를 서버에 배포하는 것까지 하였다. 그림으로 나타내면 밑의 사진과 같다

  • 다음 시간에는 본격적으로 구매한 도메인을 이용해 https 서버를 배포하는 것까지 진행하겠다.

0개의 댓글