오늘은 AWS EC2 인스턴스를 생성하고, Docker 컨테이너를 배포하여 외부에서 접근 가능하도록 설정하는 방법을 정리해보려고 한다.
이 글에서는 AWS EC2에서 Docker를 활용한 애플리케이션 배포부터 네트워크 보안 설정까지, 가장 간단하고 효율적인 방법을 소개할 예정이다.
💡 배포 목표: AWS EC2 (t2.medium)와 Route 53을 이용한 Docker 컨테이너 배포하기
배포 순서
- EC2 인스턴스(t2.medium) 생성 및 보안설정
- Docker 및 Docker Compose 설치
- Docker Compose를 이용한 웹 애플리케이션 컨테이너 배포
- Route 53을 사용한 도메인 연결(nest-dev.click) 및 외부 접속 설정
먼저 AWS 콘솔에서 로그인 후 ec2 인스턴스를 시작하여 생성해 주었다.
여기서 aws 아이디는 같이 최종 프로젝트를 진행 중인 팀원들과 함께 배포를 진행하고 있기 때문에 관리자 권한을 받은 IAM유저로 로그인을 진행하였다.
참고로 현재 설정 중인 인스턴스 유형은 유료이다.
프리티어인 유형은 최종 전 프로젝트 때 사용했지만, 너무 잦은 서버 에러 때문에 불편을 겪어 최종 프로젝트에서는 유료를 사용하기로 했다...(돈이 좋다 역시..🙃)
✅ 인스턴스 기본 설정
이름 | 원하는 이름 지정 (예: docker-app-instance) |
AMI | Ubuntu Server 22.04 LTS |
아키텍처 | amd64 (x86_64) |
인스턴스 유형 | t2.medium |
키 페어는 SSH 보안을 위한 것으로, 실제 운영 환경에서는 필수 설정이다. 테스트 목적이라면 생략 가능하지만, 보안상 SSH 키 페어 생성을 권장한다.
✅ 인스턴스 네트워크 설정
아래는 현재 설정한 EC2 인스턴스의 보안 그룹 설정한 캡처 사진이다.
- SSH (22) 접근:
원격 터미널 접속을 위한 필수 설정이며, 실무 환경에서는 접근 가능한 IP를 특정 IP로 제한하는 것이 권장된다. - HTTP (80) 접근:
웹 애플리케이션이 80 포트를 사용할 경우 필수 설정이다. 일반적으로 HTTP 웹 서비스 접근을 위한 기본 포트다. - Docker 컨테이너 앱 (8080) 접근:
Docker로 구동한 앱 서비스의 기본 접근 포트로, 설정한 컨테이너의 포트(예: 8080)에 맞춰 설정한다.
AWS EC2 인스턴스를 성공적으로 생성했다면, 우리는 쉽게 말해 AWS라는 업체에서 컴퓨터 한 대를 임대받은 것이다.
일반적으로 우리가 새로운 컴퓨터를 구매했을 때 게임을 하기 위해선 게임 설치 등 사전 작업이 필요하다.
마찬가지로 EC2 인스턴스를 활용하여 애플리케이션을 배포하려면, 인스턴스 내에 필요한 소프트웨어를 설치하고 환경 설정을 해줘야 한다.
우리의 목적은 Docker 컨테이너를 활용하여 애플리케이션을 배포하는 것이므로, 아래와 같은 단계를 진행하면 된다.
인스턴스 Shell 접속하기
우리가 생성한 ec2에 접속하려면 먼저 AWS EC2 콘솔에서 생성한 인스턴스의 퍼블릭 IP 주소를 확인하여, 터미널에서 SSH를 통해 원격으로 접속이 가능하지만 나는 그냥 AWS의 EC2 Instance Connect를 통해 웹상에서도 쉽게 접속하는 것을 좋아한다.
SSH를 통해 원격으로 접속하는 방법
ssh -i "내키페어.pem" ubuntu@[퍼블릭_IP_주소]
해당 인스턴스에 ID를 클릭하여 우측 상단에 연결 버튼을 클릭하면,
이런 페이지가 나온다 따로 설정할 것 없이 연결 버튼을 누르자
연결 버튼을 누르면 이렇게 인스턴스에 접속하게 된다.
EC2 내부 환경에 접속했다면, 이제 순서대로 명령어를 입력하면 된다.
1. EC2 내부 환경 최신화하기
새로운 컴퓨터를 쓰기 전에 운영체제를 최신화하는 것과 같은 개념이다.
sudo apt update
sudo apt upgrade -y
2. Docker 설치 및 환경 구성하기
Docker는 우리의 애플리케이션을 컨테이너로 배포하고 관리하기 위한 핵심 도구이다.
sudo apt install docker.io -y
sudo apt install docker-compose -y
설치 후 Docker 버전을 확인하여 제대로 설치되었는지 점검한다.
도커 버전들이 나오는 것을 확인할 수 있다.
3. 소스코드 및 Docker Compose 설정 파일 가져오기
애플리케이션을 실행하려면 미리 작성된 Docker Compose 파일을 가져와야 한다.
git clone [내 Git 저장소 URL]
cd [내 저장소 폴더명]
git checkout [배포할 브랜치명]
예를 들어.
git clone https://github.com/myuser/myapp.git
cd myapp
git checkout main
4. Docker Compose 설정 및 컨테이너 실행
이 파일은 내가 직접 설정해 놓은 docker-compose.yml 파일이다.
version: '3.8'
services:
mysql:
image: mysql:8.0.36
container_name: mysql-nest
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
command:
[ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--lower_case_table_names=1' ]
ports:
- "3307:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- nest-network
redis:
image: redis:alpine
container_name: redis
ports:
- "6379:6379"
networks:
- nest-network
nest_app:
build:
context: .
dockerfile: Dockerfile
container_name: nest-app
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: ${DB_URL}
SPRING_DATASOURCE_USERNAME: ${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
SECRET_KEY: ${SECRET_KEY}
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
TOSS_SECRET_KEY: ${TOSS_SECRET_KEY}
CLIENT_SECRET: ${CLIENT_SECRET}
networks:
- nest-network
volumes:
mysql-data:
networks:
nest-network:
이 파일은 MySQL, Redis, Spring 기반 Nest 애플리케이션을 하나의 네트워크 내에서 Docker로 실행하기 위한 구성이다.
- Docker Compose 버전: 3.8
- 실행 서비스:
- MySQL (DB)
- Redis (캐시/세션)
- Nest App (Spring 기반 애플리케이션)
- 공통 네트워크: nest-network
- MySQL 데이터는 볼륨(mysql-data)을통해 지속적으로 저장
✅ 컨테이너 실행
Docker Compose를 활용하여 컨테이너를 쉽게 띄울 수 있다.
sudo docker-compose up -d
컨테이너가 정상적으로 실행되었는지 상태를 확인한다.

이제 브라우저에서 EC2의 퍼블릭 IP 주소로 접근하여 실제로 웹 애플리케이션이 정상적으로 작동하는지 확인하면 된다.
예시:
http://[퍼블릭_IP_주소]:8080
접근이 잘되고 있는 것을 알 수 있다.
EC2 인스턴스를 생성하고 Docker 컨테이너를 배포한 뒤, 외부에서는 보통 IP 주소로 접근할 수 있다.
하지만 사용자들은 나의 개방 IP 주소를 기억하기 어렵기 때문에, 사용자도메인을 활용하면 사용자들이 쉽게 접근할 수 있다.
이때 사용하는 AWS 서비스가 바로 Route 53이다.
이 내용은 다음 포스팅에서 다룰예정이다.
📌 최종 요약정리
✅ EC2 인스턴스 (t2.medium) 설정
✅ Docker, Docker Compose 설치
✅ 소스 코드 클론 및 Docker 컨테이너 실행
✅ EC2 보안 그룹 설정으로 포트 접근 허용
✅ Route 53을 통한 도메인 연결
이 과정을 통해 AWS EC2 인스턴스를 활용하여 Docker 컨테이너 기반 웹 애플리케이션을 도메인으로 접근할 수 있게 성공적으로 배포하였다.
'Spring' 카테고리의 다른 글
Spring - AWS SES를 활용한 이메일 알림 기능 구현 (3) | 2025.06.27 |
---|---|
AWS Route 53으로 도메인 연결하기 (5) | 2025.06.24 |
Spring - 엔티티를 직접 Response로 반환할 경우 (1) | 2025.06.20 |
Spring Boot + Redis + Docker 연결 문제 트러블 슈팅 (1) | 2025.06.20 |
인기 검색어에 Redis 캐싱과 TTL적용 (8) | 2025.06.12 |