DevOps, 배포

[DevOps] AWS EC2에 Docker 올리기 with Docker Compose

킹형준 2025. 2. 28. 03:49

 

 

[AWS] AWS EC2 시작하기

AWS EC2란?AWS EC2란 AWS에서 제공하는 가상 서버 서비스로, EC2는 Elastic Compute Cloud의 약자이다. 물리적인 서버를 직접 구매하거나 관리할 필요 없이 필요한 만큼의 "컴퓨팅 자원"(서버)을 임대하고 사

brothergiven.tistory.com

 

 

[Docker] Docker 시작하기

Docker란Docker는 애플리케이션을 "컨테이너" 라는 가벼운 가상화 환경에서 실행할 수 있도록 해주는 컨테이너 기반의 가상화 플랫폼이다. 애플리케이션을 개발하거나 실행할 때 다른 컴퓨터에서

brothergiven.tistory.com

이제 EC2, Docker 둘 다 기본적인 사용법을 익혔으니 Spring Boot 파일을 EC2 가상환경에 Docker로 올려보자.

 

Docker에는 Spring Boot 애플리케이션과 MySQL을 올릴꺼니까 EC2 인바운드 규칙에 8080, 3306을 포함시켜두자.

 

EC2 SSH 접속

Windows Powershell을 열고, EC2 인스턴스에 접속해보자.

ssh -i <private key 경로> ubuntu@<EC2-public-ip>

 

명령어를 입력하니, bash에서 원격으로 EC2 인스턴스에 접근할 수 있게 되었다.(windows powershell에는 권한 문제로 접속이 힘들어 git bash로 접속함)

 

EC2에 Docker/Docker Compose 설치

Spring Boot와 MySQL을 둘 다 올릴 것이니, Docker Compose도 함께 설치해주자.

 

- 패키지 업데이트

 

sudo apt update && sudo apt upgrade -y  # Ubuntu인 경우
sudo yum update -y  # Amazon Linux 2인 경우

 

 - Docker 설치

 

# Ubuntu
sudo apt install docker.io -y

# Amazon Linux 2
sudo amazon-linux-extras install docker -y

 

- Docker 서비스 시작 및 부팅 시 자동 시작 설정(이제 EC2 인스턴스 접속시 도커가 

 

sudo systemctl start docker

sudo systemctl enable docker

 

- Docker Compose 최신 버전 설치

 

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 실행 권한 추가
sudo chmod +x /usr/local/bin/docker-compose

# Docker Compose 버전 확인
docker-compose --version

 

Docker Compose란?

Docker Compose는 "다중 컨테이너 애플리케이션을 정의하고 관리할 수 있도록 돕는 도구" 이다. Docker는 결국 여러 개의 컨테이너를 실행시키고 있을 때 그 활용가치가 극대화 되므로 여러 개의 컨테이너를 실행시키고 싶은데, 설정 파일 하나를 통해서 여러 개의 컨테이너를 하나의 설정 파일로 정의하고, 한 번의 명령어로 빌드, 시작, 중지, 삭제 등의 작업을 손쉽게 수행할 수 있는 것이 docker compose의 장점이다.

docker-compose.yml

Docker Compose는 "하나의 설정파일로 여러 개의 컨테이너를 정의하는 것"이다. docker-compose.yml 파일은 여러 개의 컨테이너를 정의하기 위한 설정파일인데, 그렇다면 Dockerfile과의 차이는 무엇일까?

 

- Dockerfile

 

Docker 이미지를 빌드하기 위한 설계도의 역할로, 애플리케이션 실행 환경(베이스 이미지, 의존성, 실행 파일 복사)과 컨테이너 시작 명령어를 정의하여(ENTRYPOINT) 컨테이너를 실행할 수 있는 이미지를 build한다.

 

- docker-compose.yml

 

다중 컨테이너 애플리케이션을 위한 설정파일로, 여러 개의 컨테이너를 동시에 실행하고, 네트워크 연결을 설정하거나 컨테이너별로 환경 변수를 관리할 수도 있다. 이 때 올라가는 컨테이너는 Dockerfile을 참조하여 이미지를 빌드할 수도 있고, 이미 만들어진 이미지를 가져와 실행할 수도 있다.

 

Spring Boot와 MySQL을 둘 다 올리고 싶다!

 

이제 올려보자.

 

1. git 설치 및 프로젝트 클론

 

# Git 설치

sudo apt install git -y

 

# GitHub 저장소 클론

git clone https://github.com/username/my-app-project.git

 

# 프로젝트 디렉터리 이동

cd my-app-project

 

 

2. 환경 변수 파일 생성

 

echo "DATABASE_USER=myuser" > .env

echo "DATABASE_PASSWORD=mypassword" >> .env

echo "DATABASE_NAME=mydatabase" >> .env

echo "DATABASE_HOST=db" >> .env

echo "DATABASE_PORT=3306" >> .env

 

3. Docker Compose 설정 : docker-compose.yml

version: '3.8'

services:
  # Spring Boot 애플리케이션 서비스
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: spring-app
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?useSSL=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: ${DATABASE_USER}
      -SPRING_DATASOURCE_PASSWORD: ${DATABASE_PASSWORD}
    depends_on:
      - db
    networks:
      - app-network

  # MySQL 데이터베이스 서비스
  db:
    image: mysql:8.0
    container_name: mysql-db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: ${DATABASE_NAME}
      MYSQL_USER: ${DATABASE_USER}
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

# 데이터 영속화 볼륨 설정
volumes:
  mysql-data:

# 네트워크 설정
networks:
  app-network:

 

4. docker compose로 run

 

# Docker Compose 파일이 있는 디렉터리에서 실행

# -d: 백그라운드 모드로 실행

# --build: Dockerfile을 참조해 이미지를 빌드한 후 컨테이너를 실행

 

docker-compose up -d --build

우와

 

성공!

 

5. EC2 public ip로 접속해보자

 

 

성공!

'DevOps, 배포' 카테고리의 다른 글

[Docker] Docker 시작하기  (0) 2025.02.26
[AWS] AWS EC2 시작하기  (0) 2025.02.25