aws에서 rds 생성, ec2 서버 생성
로컬 작업 프로젝트 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 이름을 바꿔서 해결했다.
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"]
docker buildx build --platform=linux/amd64 -t 도커 계정명/프로젝트명:0.1.0 .
이미지 빌드할 때 필요한 모듈을 자동으로 설치하므로
이미지 빌드 전 프로젝트 폴더 내에 있는 requirement.txt를 잘 작성해 놓아야 한다.
이미지 빌드 진행 시 m1의 경우 warnning이 뜬다. 호스트와 로컬의 버전이 다르다는 식으로 뜨는데
말 그대로 경고창만 보여주고 빌드는 정상적으로 된다.
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 명령어로 확인한 컨테이너를 중지시킬 수도 있다. (실행 중엔 삭제 안 되니 중지해야 함)
docker push 도커 계정명/프로젝트명:0.1.0
여기서 오류가 나올 수 있는데 일단 터미널 내에서 도커에 로그인해야 하고
로그인할 때도 오류가 나올 수 있는데 내 경우엔 이미지 이름과 도커 계정명이 달라서 그랬다.
위에 써놓은 대로 이미지 생성시 도커 계정명/프로젝트명으로 작성해서 해결했다.
docker login # docker logout
비밀번호로 로그인 시 보안을 위해 토큰을 사용하라고 하지만 일단 login successed가 뜨면 성공이다.
이제 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
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
이 명령줄들을 그대로 한 줄씩 입력해 주면 된다.
sudo docker pull 도커 계정명/프로젝트명:0.1.0
docker images -a 명령어로 pull 한 이미지 확인 가능
sudo docker run --name '컨테이너명' -d -p 8000:8000 도커 계정명/프로젝트명:0.1.0
- 컨테이너명은 임의로 지정이 가능하다.
- docker ps -a로 실행 중인 컨테이너 확인이 가능하다.
- 간혹 리스폰스 에러가 날 때가 있는데 보통 이미 컨테이너가 실행 중이거나
이미지에서 사용할 포트가 열려 있을 때 발생한다.- 이때는 아래 명령어로 해결 가능하다.
- sudo lsof -i:8000 # 포트 상태 확인
- sudo kill -15 PID # 포트 죽이기
- 이미지로 컨테이너 재실행
백엔드 배포가 끝난 뒤 프론트엔드에는
ec2 서버의 퍼블릭 ip를 전달하면 된다.