내일배움캠프 Spring 54일차(화) TIL - Docker

Skadi·2024년 3월 12일
0

AWS EC2에 스프링부트 애플리케이션 호스팅하기: Docker 사용법

이 글에서는 AWS EC2 인스턴스를 사용하여 Docker 컨테이너 내의 스프링부트 애플리케이션을 호스팅하는 과정을 단계별로 설명합니다.

1. 스프링부트 프로젝트에 Dockerfile 생성

먼저, 스프링부트 프로젝트 루트에 Dockerfile을 생성합니다. 이 파일은 도커 이미지를 빌드할 때 필요한 지침을 담고 있습니다.

# 베이스 이미지 선택 (예: OpenJDK 17)
FROM openjdk:17
# 애플리케이션 파일 복사 (빌드된 JAR 파일) build.gradle의 경우 build/libs 아래 존재
COPY build/libs/{생성된 파일}.jar {사용할 이름}.jar
# 도커 컨테이너가 시작될 때 실행할 명령어
ENTRYPOINT ["java","-jar","/{사용할 이름}.jar"]

2. application-docker.yml 생성

도커 환경에서 사용할 스프링부트 설정 파일을 생성합니다. 이 파일은 데이터베이스 연결 정보와 같은 환경 특정 설정을 담습니다.

# application-docker.yml
spring:
  datasource:
    url: jdbc:mysql://your-rds-url:3306/yourdatabase
    username: yourusername
    password: yourpassword
  jpa:
    hibernate:
      ddl-auto: update

3. EC2 인스턴스 생성하기

4. RDS 생성하기

5. EC2 인스턴스에서 Docker 설치

sudo yum update -y
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker {ec2-user}

6. Docker Image 빌드하기

  1. 터미널을 열고 스프링부트 애플리케이션의 루트 디렉토리로 이동합니다. 여기서는 해당 디렉토리에 Dockerfile이 위치하고 있다고 가정합니다.

  2. ./gradlew clean build를 통해서 기존의 jar파일에 새로운 내용을 덮어씌웁니다.

  3. 다음 명령어를 사용하여 도커 이미지를 빌드합니다. 이때, {이미지 이름}과 {태그}는 각각 빌드할 이미지의 이름과 태그(버전)로 대체합니다. 태그는 선택 사항이며, 생략하면 기본적으로 latest가 사용됩니다.

docker build -t {이미지 이름}:{태그} .
  • 예를 들어, 이미지 이름을 my-spring-boot-app으로 하고 태그를 1.0으로 설정할 경우, 명령어는 다음과 같습니다:
docker build -t my-spring-boot-app:1.0 .

7. Docker Image를 DockerHub에 Push

도커 이미지를 빌드한 후에 Docker Hub에 올리는 과정은 다음과 같습니다. Docker Hub에 이미지를 올리기 전에 Docker Hub 계정이 필요하며, Docker가 설치된 로컬 시스템에서 Docker Hub에 로그인해야 합니다.

  1. Docker Hub에 로그인하기

터미널 또는 명령 프롬프트를 열고, 다음 명령어를 입력하여 Docker Hub에 로그인합니다:

docker login

사용자 이름과 비밀번호를 입력하라는 메시지가 나타나면, Docker Hub 계정의 사용자 이름과 비밀번호를 입력합니다.

  1. 도커 이미지에 태그 지정하기

Docker Hub에 이미지를 올리기 위해서는 이미지에 태그를 지정해야 합니다. 태그는 {Docker Hub 사용자 이름}/{이미지 이름}:{태그} 형식을 따릅니다. 다음 명령어를 사용하여 이미지에 태그를 지정합니다:

docker tag {로컬 이미지 이름}:{태그} {Docker Hub 사용자 이름}/{이미지 이름}:{태그}

예를 들어, 로컬 이미지 이름이 my-spring-boot-app, 태그가 1.0, Docker Hub 사용자 이름이 exampleuser인 경우, 명령어는 다음과 같습니다:

docker tag my-spring-boot-app:1.0 exampleuser/my-spring-boot-app:1.0
  1. 이미지를 Docker Hub에 푸시하기

태그를 지정한 후, 다음 명령어를 사용하여 이미지를 Docker Hub에 푸시할 수 있습니다:

docker push {Docker Hub 사용자 이름}/{이미지 이름}:{태그}

위 예제에 따라, 명령어는 다음과 같습니다:

docker push exampleuser/my-spring-boot-app:1.0

이 명령어를 실행하면 Docker는 이미지를 Docker Hub에 업로드합니다. 업로드 과정이 완료되면, Docker Hub 웹사이트에서 업로드된 이미지를 확인할 수 있습니다.

  1. Docker Hub에서 이미지 확인하기

Docker Hub에 로그인한 후, "Repositories" 섹션을 방문하여 업로드된 이미지를 확인할 수 있습니다.

8. EC2에서 Docker Image 가져오기

EC2 인스턴스에서 Docker Hub에 올려진 이미지를 pull 받아오는 과정은 간단합니다. 이미 Docker가 설치되어 있다면, 다음 단계를 통해 이미지를 가져올 수 있습니다:

  1. 도커 허브에서 이미지 Pull 받기

터미널을 열고 다음 명령어를 사용하여 Docker Hub에서 원하는 이미지를 pull 받습니다:

docker pull {Docker Hub 사용자 이름}/{이미지 이름}:{태그}

예를 들어, Docker Hub 사용자 이름이 exampleuser, 이미지 이름이 my-spring-boot-app, 태그가 1.0인 경우, 명령어는 다음과 같습니다:

docker pull exampleuser/my-spring-boot-app:1.0

이 명령어는 exampleuser 사용자의 Docker Hub 저장소에서 my-spring-boot-app 이미지의 1.0 태그를 가진 버전을 EC2 인스턴스로 다운로드합니다.

  1. 이미지 확인하기

이미지 다운로드가 완료되었는지 확인하기 위해 다음 명령어를 사용하여 로컬 도커 이미지 목록을 확인할 수 있습니다:

docker images

이 명령어는 설치된 모든 도커 이미지의 목록을 보여줍니다. 여기에서 방금 pull 받은 이미지를 찾을 수 있어야 합니다.

  1. 도커 컨테이너 실행하기

다운로드한 이미지를 바탕으로 도커 컨테이너를 실행하려면, 다음 명령어를 사용합니다:

docker run -d -p {외부 포트}:{애플리케이션 포트} {Docker Hub 사용자 이름}/{이미지 이름}:{태그}

예를 들어, 애플리케이션이 내부적으로 8080 포트를 사용하고 외부에서는 80 포트로 접근하려면, 명령어는 다음과 같습니다:

docker run -d -p 80:8080 exampleuser/my-spring-boot-app:1.0

-d 옵션은 컨테이너를 백그라운드에서 실행하며, -p 옵션은 호스트와 컨테이너 간의 포트 매핑을 설정합니다.

이 과정을 통해 EC2 인스턴스에서 Docker Hub에 올려진 이미지를 성공적으로 pull 받아와 실행할 수 있습니다. 이제 EC2 인스턴스의 공개 IP 주소나 도메인을 통해 애플리케이션에 접근할 수 있습니다.

9. EC2에서 도커로 스프링부트 실행하기

EC2 인스턴스에서 스프링부트 애플리케이션을 도커 컨테이너로 실행하기 위해, docker run 명령어를 사용합니다. 다음은 이 명령어의 상세한 사용 방법입니다:

docker run -e "SPRING_PROFILES_ACTIVE=docker" -p 8080:8080 {도커 이미지 이름}:{태그}
  • -e "SPRING_PROFILES_ACTIVE=docker": 이 옵션은 환경 변수를 설정하여, 스프링 부트 애플리케이션이 docker 프로필을 사용하도록 합니다. 스프링 부트 애플리케이션에서는 다양한 환경(예: 개발, 테스트, 운영)에 따라 다른 설정을 적용할 수 있습니다. 여기서 docker 프로필은 애플리케이션이 도커 컨테이너 내에서 실행될 때 사용할 설정을 포함하고 있을 수 있습니다.

  • -p 8080:8080: 이 옵션은 컨테이너의 8080 포트를 호스트의 8080 포트에 바인딩합니다. 이는 외부에서 EC2 인스턴스의 8080 포트를 통해 애플리케이션에 접근할 수 있게 해 줍니다. 첫 번째 8080은 호스트(EC2 인스턴스)의 포트 번호이고, 두 번째 8080은 컨테이너 내부의 포트 번호입니다.

이 명령어를 실행하면, 도커는 이미지를 바탕으로 새로운 컨테이너를 생성하고, 해당 컨테이너 내에서 스프링부트 애플리케이션을 docker 프로필로 실행합니다. 이를 통해 EC2 인스턴스에서 스프링부트 애플리케이션을 손쉽게 실행하고 관리할 수 있습니다.

10. 마무리...(소감)

  1. 환경 설정의 복잡성: 예전에 Docker를 모를 때 스프링부트 호스팅을 할때는 EC2 인스턴스에 직접 자바를 설치하고, 설치된 자바 버전 문제를 해결하기 위해 환경 설정을 조정해야 하는 등 초기 설정 과정이 복잡했던 기억이 있다.. 또한, 필요한 도구들(예: Git)을 직접 설치하고 설정해야 했다.
  2. 보안 문제: 코드를 Git에서 직접 clone하거나 pull할 때, 중요한 정보(예: 데이터베이스 접속 정보)가 노출될 위험이 있었다. 이러한 정보를 안전하게 관리하는 것은 항상 중요한 과제였다.
  3. 퍼포먼스 : 과거 호스팅 경험과 비교하면 프로젝트 사이즈가 작아서 정확하지 않지만 Docker를 통한 호스팅과 직접적으로 자바를 설치하고 Github를 통해서 코드를 가져와서 실행시키는 것에 퍼포먼스 차이가 Docker를 통한 호스팅방법이 더 빠른것같다. (단순히 생각해도 필요한 내용만 가지고 있는 Docker가 더 빠른게 이상하지 않다.)

0개의 댓글