TIL-25. docker로 배포하기

solarrrrr·2021년 11월 29일
0

Today I Learned

목록 보기
25/74
post-thumbnail

대략적인 순서

  1. aws에서 rds 생성, ec2 서버 생성

  2. 로컬 작업 프로젝트 my_settings.py에 db 정보를 rds 걸로 변경
    (host엔 엔드포인트, user와 password엔 rds 정보)

    로컬 db를 sql로 덤프 떠서 rds로 보내야 한다.

mysqldump -u root -p holla > holla.sql

그리고 aws rds로 보내려면 아래처럼 하면 된다.

mysql holla_backend < holla.sql -h 
holla-backend.cosncfpvaiz4.ap-northeast-2
.rds.amazonaws.com -u root -p

그런데 이때 unknown database가 뜰 수 있다.
rds에 db를 만들어둔 뒤 해당 db명으로 import 해야 한다.
나는 rds 생성 시 holla_backend라는 이름으로 생성해 뒀기 때문에 위 명령문에서 db 이름을 바꿔서 해결했다.

  1. m1용 도커 설치하고 로컬 프로젝트 최상위에(manage.py 있는 곳)
    dockerfile 생성(vi dockerfile)
FROM python:3 
#기반이 될 이미지

# 작업디렉토리(default)설정
WORKDIR /usr/src/app 

## Install packages
#현재 패키지 설치 정보를 도커 이미지에 복사
COPY requirements.txt ./ 

#설치정보를 읽어 들여서 패키지를 설치
RUN pip install -r requirements.txt

## Copy all src files
#현재경로에 존재하는 모든 소스파일을 이미지에 복사
COPY . . 


## Run the application on the port 8080
#8000번 포트를 외부에 개방하도록 설정
EXPOSE 8000   


#CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
#gunicorn을 사용해서 서버를 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "holla.wsgi:application"]  
  1. 이미지 빌드하기(m1용 명령어)
docker buildx build --platform=linux/amd64 -t 도커 계정명/프로젝트명:0.1.0 .

이미지 빌드할 때 필요한 모듈을 자동으로 설치하므로
이미지 빌드 전 프로젝트 폴더 내에 있는 requirement.txt를 잘 작성해 놓아야 한다.

이미지 빌드 진행 시 m1의 경우 warnning이 뜬다. 호스트와 로컬의 버전이 다르다는 식으로 뜨는데
말 그대로 경고창만 보여주고 빌드는 정상적으로 된다.

  1. 빌드된 이미지 실행
docker run --name 컨테이너명 -d -p 8000:8000 도커 계정명/프로젝트명:0.1.0

이미지 실행 후 docker ps -a 명령어로 정상적으로 돌아가고 있는지 확인이 가능하다.
여기서 status에 exited가 떠 있으면 빌드된 이미지에 문제가 있는 것이니 삭제 후 다시
시도하자.

docker run -it 도커 계정명/프로젝트명:0.1.0 /bin/bash

이 명령어를 사용하면 이미지를 기반으로 컨테이너를 실행하게 되고
process 등 여러 가지 정보를 토대로 문제 상황을 확인할 수 있다.
하지만 수정을 하려면 이미지 자체를 다시 빌드해야 한다.

docker rm $(docker ps -a -q) # 컨테이너 전체 삭제
docker rmi $(docker images -q) # 이미지 전체 삭제
docker stop 컨테이너명 # ps 명령어로 확인한 컨테이너를 중지시킬 수도 있다. (실행 중엔 삭제 안 되니 중지해야 함)
  1. docker에 이미지 push
    깃헙에 푸시하는 것처럼 도커에 방금 생성한 이미지를 푸시한다.
docker push 도커 계정명/프로젝트명:0.1.0

여기서 오류가 나올 수 있는데 일단 터미널 내에서 도커에 로그인해야 하고
로그인할 때도 오류가 나올 수 있는데 내 경우엔 이미지 이름과 도커 계정명이 달라서 그랬다.
위에 써놓은 대로 이미지 생성시 도커 계정명/프로젝트명으로 작성해서 해결했다.

docker login # docker logout

비밀번호로 로그인 시 보안을 위해 토큰을 사용하라고 하지만 일단 login successed가 뜨면 성공이다.

이제 EC2 서버에 배포하기 단계!

  1. 터미널로 ec2 서버에 접속(내 경우 ec2 서버의 환경을 우분투로 설치했던 기억이 있다.)
ssh -i bong.pem 유저네임@퍼블릭 dns

pem은 ec2 서버 생성 시 받은 키 파일이다. 보관 잘 해야 함.
키 파일이 있는 경로에서 위 명령어 입력하면 우분투 리눅스 환경으로 ec2 서버에 접속된다.

간혹 ec2 로그인 시 아래와 같은 에러 메시지가 나올 때가 있다.

Got permission denied while trying to connect 
to the Docker daemon socket at
unix:///var/run/docker.sock: Post
"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth": 
dial unix /var/run/docker.sock: connect: 
permission denied

이럴 땐 아래 명령어를 입력해 주면 된다.

sudo chmod 666 /var/run/docker.sock
  1. ec2 서버에 도커 설치하기
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. 도커에 푸시했던 이미지, ec2 서버에 pull 받기
sudo docker pull 도커 계정명/프로젝트명:0.1.0

docker images -a 명령어로 pull 한 이미지 확인 가능

  1. 이미지 실행하면 배포 완료.
sudo docker run --name '컨테이너명' -d -p 8000:8000 도커 계정명/프로젝트명:0.1.0
  • 컨테이너명은 임의로 지정이 가능하다.
  • docker ps -a로 실행 중인 컨테이너 확인이 가능하다.
  • 간혹 리스폰스 에러가 날 때가 있는데 보통 이미 컨테이너가 실행 중이거나
    이미지에서 사용할 포트가 열려 있을 때 발생한다.
  • 이때는 아래 명령어로 해결 가능하다.
  • sudo lsof -i:8000 # 포트 상태 확인
  • sudo kill -15 PID # 포트 죽이기
  • 이미지로 컨테이너 재실행

백엔드 배포가 끝난 뒤 프론트엔드에는
ec2 서버의 퍼블릭 ip를 전달하면 된다.

profile
몰입

0개의 댓글