🌠Development/CICD

[AWS] Springboot + Mysql을 docker-compose로 한번에 ec2에 배포해보자

구동엽 2025. 4. 30. 02:45

1. 서론

EC2 인스턴스를 만들었고, 프리티어를 사용한다면 스왑 메모리를 설정하여 가상메모리까지 확보했을 것이다.

이제 docker-compose를 사용하여 Springboot와 mysql을 docker 컨테이너 내에서 동시에 실행시켜보자.

 

2. 로컬환경에서 세팅

2.1 application.properties 환경변수 설정

spring.application.name=

# MySQL #
spring.datasource.url=jdbc:mysql://db:3306/{docker-compose db이름}
spring.datasource.username=root
spring.datasource.password={docker-compose설정 비번}

# JPA #
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQLDialect

 

우리는 docker-compse.yml를 사용하여 mysql와 springboot를 동시에 띄우기 위해 application.properties에는 docker-compose.yml에 들어갈 정보와 동일하게 입력 후 build 해줘야한다.

 

2.2 Dockerfile 작성하기

FROM openjdk:17
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

 

springboot 루트 경로에 Dockerfile 명으로 파일 생성 후, 위 내용을 작성한다.

위 내용을 간단하게 설명하자면 Java 17 환경에서 내 Spring Boot 앱의 JAR 파일을 복사해, 8080 포트에서 실행하는 의미이다.

 

2.3 빌드하기

./gradlew build -x test

 

배포 글을 살펴보자면 ./gradlew build 을 수행하라고 하는데 ./gradlew build를 수행하면 테스트까지 수행하기 때문에 DB 연결에서 실패해 build에 실패하게 된다.

 

실패하는 이유는 docker-compose로 ec2환경 내에서 springboot + mysql을 동시에 띄워야하기 때문에

springboot의 properties 내용은 docker-compose와 동일하게 맞췄기 때문에 없는 mysql을 연결을 시도했기 때문에 build에 실패하게 된다. 

따라서 배포할 때는 위 명령어를 사용하여 테스트를 스킵한 뒤 빌드하면 된다.

 

 

2.4 도커 이미지 만들기

2.2스텝에서 Dockerfile을 만들었다면 docker로 build 후 dockerhub에 push 해보자

 

docker build -t [이미지이름]

 

build 후 도커 desktop으로 확인해보자

 

잘 올라왔다!

 

2.5 Docker Repository에 업로드

$ sudo push [이미지이름]

 

로컬에서의 환경은 이제 끝났다.

 

 

3. EC2 인스턴스 환경

3.1 EC2 인스턴스 만들기

https://dongyeop00.tistory.com/196

 

[AWS] 프리티어 ec2 인스턴스 생성해보기

1. 서론프론트와 백엔드를 개발 완료가 됐으면 로컬환경에서만 접속할 수 있는게 아닌, 외부, 외부 사람들이 접속해서 서비스를 이용하게 해보고 싶다. 로컬환경에서 ip와 포트 설정을 통해 Web Se

dongyeop00.tistory.com

.https://dongyeop00.tistory.com/197

 

[AWS] EC2 프리티어 t2.mircro 스왑 메모리(가상메모리)를 사용해보자

1. 서론개인 프로젝트 배포 시 서비스를 운영할 충분한 지갑사정이 여유롭지 않으면 EC2 프리티어를 사용하게 된다...하지만 프리티어를 사용할 수 있는 AMI는 램이 1GB밖에 되지않아 서버를 빌드

dongyeop00.tistory.com

프리티어를 사용중이라면 스왑 메모리를 사용해보자

 

4. EC2 배포

4.1 docker 설치하기

sudo apt update
sudo apt install docker.io
sudo apt install docker-compose
sudo systemctl start docker
sudo systemctl enable docker

 

설치가 완료됐다면

 

docker --version
docker-compose --version

 

위 명령어로 설치가 되었는지 확인해보자

 

4.2  docker-compose 작성

version: '3'
services:
  db:
    image: mysql:8
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: 비밀번호
      MYSQL_DATABASE: db이름
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    restart: always

  app:
    image: 이미지이름:태그
    container_name: springboot-container
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/db이름
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 비밀번호
    restart: always

volumes:
  mysql-data:
$ nano docker-compose.yml

위 명령어를 사용하여 docker-compose.yml을 작성한다.

 

db이름과 비밀번호는 springboot의 properties에서 작성한 값과 동일하게 해야된다.

 

위 작성 내용은 docker에서 mysql의 이미지를 다운받아 db이름과 비밀번호를 설정한다.

app이후 내용은 image에서는 docker repository에서 자동으로 이미지를 pull하여 실행한다.

따라서 EC2 환경에서 pull 할 필요가 없다.

 

4.3 docker-compose.yml 실행

$ sudo docker-compose up -d

위 명령어를 사용하여 mysql과 springboot를 동시에 실행한다.

mysql과 springboot를 동시에 실행 완료

 

$ sudo docker ps

 

 

$ sudo logs [스프링부트이름] ex)springboot-container

로그를 보니 db연결과 실행이 잘 됐다.

 

5. 인바운드 규칙 설정

 

나의 EC2 인스턴스의 인바운드 규칙 편집에서 8080 포트와 3306 포트를 열어준다.

 

6. springboot 접속

나의 EC2 인스턴스 퍼블릭 IPv4 주소/DNS로 포트 8080으로 접속해본다.

 

굿 ^^