📝 SK네트웍스 Family AI캠프 10기 17주차 회고록
📅 기간: 25.04.28 ~ 25.05.02

📌 이번 주는 어땠는지 돌아보며
- Docker Compose를 이용해서 MySQL, Django(Gunicorn), Nginx를 하나의 환경으로 구성했고, 정적 파일 공유랑 초기 마이그레이션 자동화까지 구현했다.
- AWS EC2 인스턴스에서 Docker 컨테이너를 실행하고 고정 IP(EIP)를 설정하는 방법을 공부하면서, 실제 배포 환경에서의 인프라 이해도를 높일 수 있었다.
- 마지막 미니프로젝트 팀이 드디어 결성됐고, 내가 팀장을 맡아 팀을 이끌기로 했다. 잘할 수 있을지 걱정도 되지만, 할 수 있는 최선을 다해보려고 한다.
📚 학습 내용 요약
📌 Docker 기반 웹 서비스 통합 및 EC2 환경 학습
✅ Docker Compose로 Django, MySQL, Nginx 연동
docker-compose.yml
을 작성해 Django(Gunicorn), MySQL, Nginx를 하나의 서비스로 묶었다.
- 각 컨테이너는
compose_net
이라는 브리지 네트워크로 연결돼서 서로 내부 통신이 가능하도록 했다.
- Django 컨테이너는
entrypoint.sh
스크립트를 만들어서 컨테이너 시작 시 자동으로 마이그레이션, static 파일 수집, superuser 생성까지 수행하도록 했다.
- Gunicorn을 이용해서 Django 앱을 WSGI 서버로 돌렸고, Nginx는 이걸
proxy_pass
로 연결해서 외부 요청을 처리하게 했다.
- 정적 파일은 Docker 볼륨을 이용해서 Django에서 Nginx로 넘겨 Nginx가 직접 서빙하게 했다.
- MySQL 컨테이너는 초기 DB와 사용자 계정을 환경 변수로 자동 설정하고 데이터는 볼륨으로 영속화했다.
✅ AWS EC2와 고정 IP(EIP) 학습
- Ubuntu 기반 EC2 인스턴스를 만들어서 Docker와 Docker Compose를 설치하고 로컬 환경과 동일하게 구성했다.
- 고정 IP(EIP)를 할당해서 외부에서 언제든지 접근 가능한 상태로 설정했다.
- 보안 그룹을 통해서 22번(SSH), 80번(HTTP), 8000번(Gunicorn 테스트용) 포트를 개방했고 접근 제어까지 설정했다.
- SSH 키 등록과 퍼미션 설정으로 원격 접속을 안전하게 관리했고 컨테이너 상태를 계속 확인했다.
🛠️ 트러블 슈팅
문제 1: Django 컨테이너가 MySQL보다 먼저 실행돼서 DB 연결 에러 발생
docker-compose up
실행할 때, depends_on
설정만으로는 MySQL 컨테이너가 완전히 준비되기 전에 Django 컨테이너가 실행될 수 있었다.
- 그래서 Django가 MySQL에 접속하려고 시도하면 아직 MySQL이 준비되지 않아서 아래 같은 에러가 발생했다:
django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'mysql_server'")
👉 depends_on
은 실행 순서만 보장할 뿐, 서비스가 완전히 준비됐는지까지는 보장하지 않는다.
🔧 해결 방법
Django 컨테이너가 DB 준비가 끝날 때까지 기다리게 .sh
스크립트를 수정했다
#!/bin/sh
sleep 10
python manage.py makemigrations --no-input
python manage.py migrate --no-input
python manage.py collectstatic --no-input
DJANGO_SUPERUSER_PASSWORD=$SUPER_USER_PASSWORD python manage.py createsuperuser \
--username $SUPER_USER_NAME \
--email $SUPER_USER_EMAIL \
--noinput
gunicorn config.wsgi:application --bind 0.0.0.0:8000
✅ 이 스크립트를 Dockerfile
의 ENTRYPOINT
로 등록해서 Django 컨테이너가 MySQL 준비가 끝난 뒤 실행되도록 했다.
✅ 요약
depends_on
은 실행 순서만 보장하고 실제 서비스 준비 상태는 보장하지 않음
- 일단
sleep
으로 간단히 대기하는 방법을 사용했는데, 간단하고 효과적이긴 하다.
- 앞으로는
nc
나 wait-for-it.sh
를 써서 더 정교하게 준비 상태를 체크하는 방법도 고려할 수 있다.
🔄 KPT 회고 (17주차)
✅ Keep
- Docker Compose와 Nginx, Gunicorn, Django, MySQL을 한 환경에서 잘 구성하고 구현까지 마쳤다.
- AWS EC2라는 낯선 환경에서도 끝까지 포기하지 않고 배포까지 진행했다.
- 문제가 생기면 바로바로 검색하고 문서를 확인하면서 해결하려고 노력했다.
❌ Problem
- AWS EC2, EIP 같은 개념이 처음이라 낯설었고, 보안 그룹이나 키 등록, 포트 설정 등이 조금 어려웠다.
- Docker 컨테이너 간의 의존성 문제 때문에 실행 오류가 많이 발생해서 디버깅에 시간이 꽤 걸렸다.
- 미니 프로젝트, 정처기 준비, 최종 프로젝트 압박이 동시에 몰리면서 집중하기 쉽지 않았다.
💡 Try
- EC2 같은 클라우드 환경에서 경험한 인프라 구성을 기반으로, 다음엔 CI/CD 자동화를 단계별로 실습해볼 계획이다.
- 장고 프로젝트를 Nginx와 함께 Docker 이미지로 만드는 것부터 시작해서 AWS에 직접 배포하는 것까지 실습해보고 싶다.
- 정처기 시험 대비는 별도의 시간을 정해서 효율적으로 준비할 생각이다.
✅ 마무리
- 이번 주는 부트캠프가 거의 끝나간다는 게 실감나면서 부담이 커졌던 한 주였다.
- AWS처럼 낯선 클라우드 환경은 처음이라 장벽처럼 느껴졌고, 도커 서비스가 제대로 안 돌아갈 때마다 좌절감이 들었다.
- 미니 프로젝트 리딩과 정처기 준비까지 겹치니까 "할 수 있을까?" 싶은 의문도 들었다.
- 그래도 포기하지 않고 계속 도전하고 있다는 것 자체가 성취라고 생각한다.
- 지금은 좀 느리고 힘들어 보일 수 있어도 하나씩 도장 깨듯 해결하면서 끝까지 나아가려 한다.
- 작은 성취들이 쌓이면 결국 큰 성장으로 이어진다는 걸 믿으면서 다음 주도 열심히 나아가보겠다.