글의 길이가 길어서 2개의 게시글로 나누었습니다. (1)편
https://yourhyeony.tistory.com/61
5. docker-compose.yml 작성
version: '3'
services:
db: # MySQL 컨테이너
image: mysql:8.0.22 # MySQL 8.0.22 이미지 사용
container_name: my01 # 컨테이너 이름 지정
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
# 캐릭터셋 유니코드로 변경하고 비밀번호 관련 설정...
ports:
- "3306:3306" # 3306번 포트 사용
volumes:
- ./db/:/docker-entrypoint-initdb.d/ # db설정 적용(스키마 생성 sql 코드 들어있는 파일)
environment:
MYSQL_ROOT_PASSWORD: "qwer1234" # 루트 비밀번호 설정
MYSQL_DB: "testdb" # 접속할 데이터베이스 이름
platform: linux/x86_64 # M1칩 호환성
healthcheck: # MySQL컨테이너의 실행이 완료될때까지 다른 컨테이너의 실행을 막는 역할
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 1m30s
timeout: 30s
retries: 10
start_period: 30s
nginx: # Nginx 웹서버 컨테이너
image: nginx:latest
container_name: ng01
ports:
- "80:8080" # 80번으로 들어오는 요청을 8080번으로 포트 포워딩
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx 설정 적용
- ./client/build:/var/www/client # React 프로젝트(client)의 빌드 파일 마운트
depends_on: # server와 client 컨테이너가 실행된 후 실행하도록 실행 순서 지정
- server
- client
client: # React 프론트엔드 프로젝트
image: node:18
container_name: re01
working_dir: /client # 프로젝트 폴더로 이동
command: bash -c "
yarn install &&
yarn build"
# 프론트엔드 프로젝트 빌드 실행. 이 컨테이너는 빌드가 끝나면 종료된다.
volumes:
- ./client/:/client # 클라이언트 폴더 마운트
depends_on:
- db
server:
build:
context: ./server # 빌드할 파일 위치
dockerfile: ./Dockerfile # Dockerfile 실행
container_name: dg01
working_dir: /server
command: bash -c "
python3 manage.py makemigrations account &&
python3 manage.py makemigrations playlist &&
python3 manage.py makemigrations model &&
python3 manage.py migrate &&
gunicorn --bind 0.0.0.0:8000 server.wsgi:application -w 16 --threads 8 -t 300"
# 데이터 마이그레이션 실행 및 Gunicorn을 이용한 Django 서버 실행
volumes:
- ./server/:/server # 서버 폴더 마운트
expose:
- "8000" # 8000번 포트 오픈
depends_on:
db:
condition: service_healthy # db 컨테이너가 실행될때까지 기다리는 작업
최대한 주석처리를 했지만 주석에 넣지 못한 것들을 자세하게 설명하려고 한다.
1) db 컨테이너
- platform을 사용하는 이유
https://yourhyeony.tistory.com/56
[Docker-compose, MySQL] M1 환경에서 MySQL 이미지 이용하기
In particular, the mysql image is not available for ARM64. You can work around this issue by using a mariadb image. 이 오류는 컨테이너화 한 뒤 팀원분들에게 공유하면서 발생했던 오..
yourhyeony.tistory.com
- healthcheck를 사용하는 이유
https://yourhyeony.tistory.com/54
[MySQL, Docker] MySQL ERROR 2002/2003/2005
며칠간 삽질했다... 나는 백엔드로 Django를 사용하고, 데이터베이스로 MySQL을 사용하는 프로젝트를 하고 있었기 때문에 docker-compose를 이용해서 MySQL 컨테이너를 만들어야 했다. 그러나! docker-compose
yourhyeony.tistory.com
2) server 컨테이너
- gunicorn의 옵션을 사용하는 이유
https://yourhyeony.tistory.com/58
[Gunicorn] gunicorn worker timeout
Gunicorn을 이용해서 웹 서버를 돌리는데, WORKER TIMEOUT을 마주했다. 실행 시간이 너무 오래 걸려서, 자동으로 끝내버린다. 나의 경우 AI모델을 실행해야 해서 특히 더 오래 걸렸다(거의 1
yourhyeony.tistory.com
- migration을 app마다 따로 하는 이유
한번에 하면 오류가 발생했습니다. playlist라는 앱은 account 앱에 영향을 받는데, account를 무조건 먼저 마이그레이션 실행하지 않아서 종종 오류가 나더라고요. 그래서 먼저 실행합니다.
- migration과 gunicorn을 이용한 서버 실행 명령어는 Dockerfile에 넣으면 되는 것 아닌가?
https://yourhyeony.tistory.com/60
6. AWS 인스턴스 생성하기 (t2 프리티어)
1) aws에서 프리 티어를 이용하여 t2 micro 인스턴스를 생성
- 만약 기본 VPC가 없다면 스스로 vpc와 subnet을 만들어야 하고,
이 때 퍼블릭 주소를 설정하지 않으면 퍼블릭 주소를 자동으로 할당받지 못한다.
참고할 만한 블로그입니다.
AWS 기본 VPC 만들기
AWS에서 사용한 모든 서비스를 삭제/종료 하였는데도 계속 소액이 과금이 되서 계정에 존재하는 모든 서비스를 다 삭제하였다. 하지만 삭제 한 후 계정 내부 구성이 아무것도 없어서 EC2 서비스를
velog.io
- 인스턴스를 생성할 때 스토리지 용량 설정이 있다.
사진 파일을 잃어버렸는데.. =_=
인스턴스 생성 화면에서 천천히 내리며 찾아보면 보인다.
만약 따로 설정 안 해두면 ssd 용량을 8GB만 준다.
이것을 프리 티어에서 최대한 사용할 수 있는 30GB로 변경한다.
(변경하는 이유가 밑에 나온다).
- 인스턴스 접속 방법은 공식 문서를 참고!
ip: ec2-user@(퍼블릭 ipv4 DNS)
2) 배포 과정중에 발생한 오류
- command failed with exit code 137
RAM용량이 부족해서 발생하는 오류이다. 나는 AI모델을 가져오면서 발생했었다.
이 오류는 어떻게 수정하지? 우리는 프리 티어에서 벗어나서 굳이 돈을 쓰고 싶지 않았다...
이것저것 탐색하다가 스왑 메모리를 활용하는 블로그를 찾게 되었다.
블로그에서도 공식 문서를 소개하고 있으니 두 가지 글 중에 편한 글을 찾아 보면 된다.
스왑 메모리를 활용해서 RAM의 크기를 늘려줬고, 잘 실행할 수 있었다.
- error 28 no space left on device
스토리지 용량이 부족해서 발생하는 오류이다. 바로 위에서 스토리지 설정을 언급한 이유...!
나는 이 설정을 바꾸어야 인스턴스의 스토리지 용량이 바뀐다는 것을 많은 시간이 지나서야 알았지만...
처음부터 넉넉하게 설정해서 오류가 발생하지 않도록 하자!
3) 터미널로 도커 설치는 어떻게?
### Docker ###
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 $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
docker --version
### docker-compose ###
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
각각 docker와 docker-compose를 설치하는 명령어이다.
docker-compose의 경우 버전을 잘 신경써서 다운받을 수 있도록 한다!
설치 버전을 확인했을때 버전이 출력되면 정상적으로 설치된 것이다.
4) docker-compose up 실행
- docker-compose up을 실행하면 도커 컨테이너가 실행된다.
- 단, 이것은 터미널을 종료하면 같이 종료되기 때문에 nohup을 이용해서 컨테이너가 계속 실행되도록 한다.
- nohup docker-compose up과 같이 추가해서 빌드 및 실행하면 웹서비스가 나타난다!
5) 접속 방법
- 두 가지 방법으로 접속할 수 있다.
- 퍼블릭 IPv4주소(12.34.567.890)
- 퍼블릭 IPv4 DNS(ec2-12-34-567-890.ap-northeast-2.compute.amazonaws.com)
- 이 둘 중 어떤 방법을 사용해도 된다.
- 도메인 적용하면 당연히 달라지겠지만, 도메인을 적용하지 않으면 저 둘 중 1개의 url을 활용한다!
이상으로 AWS EC2에 배포 끝!
'Computer Science > Setup' 카테고리의 다른 글
[SSH, AWS EC2, CMD] Windows cmd로 ec2에 ssh 접속하기 (0) | 2025.02.14 |
---|---|
[Nginx, Docker-compose] HTTPS 설정, https, wss 연결하기 (with Let's encrypt) (0) | 2025.02.14 |
[Docker, AWS, Django, Nginx, Gunicorn, React, MySQL] AWS EC2 이용해서 서버 세팅하기 (1) - db, nginx, dockerfile 작성 (0) | 2022.10.10 |
[Python, Django, MySQL] 장고에서 MySQL 데이터베이스 사용하기 (0) | 2022.08.18 |
[JSP] Ubuntu 환경에서 Tomcat MariaDB 서버세팅 (1) | 2022.08.12 |