[AWS] EC2 인스턴스 생성 및 고정 IP를 이용한 클라우드 서비스 배포 Feat. docker-compose

Mugeon Kim·2023년 7월 24일
0

서론


  • 프로젝트를 진행하면서 팀원들에게 EC2와 고정 IP 할당을 통하여 클라우드를 사용하여 쉽게 배포할 수 있는 방법을 공유하기 위하여 작성을 하였습니다.

  • Docker Composse를 이용하여 여러개의 도커 컨테이너로 부터 이루어진 서비스를 구축 및 네트워크 연결, 실행 순서를 자동으로 관리가 가능하여 일관성을 가지는 환경을 구축할 수 있다.

  • docker-compose.yml 파일을 작성하여 1회 실행하는 것으로 설정된 모든 컨테이너를 실행한다.

  • 일단 배포를 시작하기 이전에 docker-compose.yml에 대하여 설명을 하겠습니다.

  1. database
    1-2. config/mysql.cnf
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8mb4

1-3. Dockerfile

FROM mysql:8.0.22

ENV TZ=Asia/Seoul
  1. redis
    2-2. redis/Dockerfile
FROM redis:6

ENV TZ=Asia/Seoul
  1. Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java","-jar","./app.jar"]
  1. docker-compose.yml
version: "3.8"
services:
  study-redis:
    container_name: study-redis
    build:
      dockerfile: Dockerfile
      context: ./redis
    image: immunogen/study-redis
    ports:
      - "6379:6379"
  study-database:
    container_name: study-database
    build:
      dockerfile: Dockerfile
      context: ./database
    image: immunogen/study-database
    environment:
      - MYSQL_DATABASE=CStudy
      - MYSQL_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
    volumes:
      - ./database/config:/etc/mysql/conf.d
    ports:
      - "3306:3306"
  study-app:
    container_name: study-app
    build: .
    depends_on: # DB, REDIS 컨테이너가 실행된 다음 WEB을 실행시킨다.
      - study-database
      - study-redis
    image: immunogen/study-app
    environment:
      - SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
      - SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
    ports:
      - "80:8080"
    restart: always
  • docker-compose를 하기 이전에 database, redis의 버전 및 추가적인 설정을 먼저 작성을 합니다. 이후 base Path의 Dockerfile은 build를 하였을 때 jar파일을 생성을 합니다. 이때 app.jar로 설정을 하였는데 build에 추가적인 설정을 하지 않으면 프로젝트 이름.jar로 파일이 생성을 합니다. 우리는 이것을 막기 위하여 build 파일에 추가적으로 다음과 같은 설정을 추가를 합니다.
bootJar{
    archiveFileName = 'app.jar'
}
  • 이후 docker-compose를 살펴보면 database, redis를 생성을 하고 spring app을 container로 뛰운다. 이때 build를 하기 이전에 의존성을 추가하는데 database, redis를 먼저 실행을 하고 app.jar를 실행하게 만들었다.

본론


1. AWS EC2

  • AWS에 접속하여 서비스 > EC2에 들어온 뒤 인스턴스 시작 버튼을 클릭을 한다.
  • 일단 AWS Linux를 선택을 합니다.
  • 인스턴스 유형은 무료로 이용이 가능한 t2.micro를 선택을 합니다.
  • 키 페어는 rsa로 설정한

2. Elastic IP 할당

  • 탄력적 IP를 선택하고 탄력적 IP 주소 할당을 선택을 합니다. 이후 running ec2를 선택을 하고 할당을 합니다.
  • 이후 해당 EC2에 선택하고 탄력적 IP 할당을 보면 추가된 모습을 볼 수 있다.

3. SSH 클라이언트로 서버 접속

https://mobaxterm.mobatek.net/

  • mobaxterm을 설치하여 쉽게 SSH 연결을 할 수 있다.
  • Remote host에 탄력적 IP 또는 PUBLIC IP를 입력을 하고 Username에 ec2-user를 입력을 합니다.
  • 이후 private key에 ec2에 rsa로 암호화된 키를 선택을 합니다.

4. 보안 그룹 설정


5. Docker Compose 설치 및 배포

5-1. Git 설치

  • AWS Linux를 선택을 하면 Git을 설치를 해야됩니다.
#Perform a quick update on your instance:
$ sudo yum update -y

#Install git in your EC2 instance
$ sudo yum install git -y

#Check git version
$ git version

5-2. 도커, 컴포즈 설치 및 시작

//도커 설치  
$ sudo yum install docker
$ docker -v

// 도커 컴포즈 설치 
$ sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose   

// 도커 시작하기     
$ sudo systemctl start docker

// 실행 권한 적용   
$ sudo chmod +x /usr/local/bin/docker-compose    
$ sudo chmod 666 /var/run/docker.sock
$ sudo dnf install libxcrypt-compat
$ docker-compose -v

5-3. Docker Compose 파일이 존재하는 Github 소스 내려받기

$ git clone https://github.com/CStudyTeam/CStudy-backend.git

5-4. Docker 환경변수

  • 로컬에서 개발할 때, DB 계정 정보나 외부에 노출되면 안되는 값들을 따로 제외하여 관리하였고 이를 도커 컨테이너를 실행할 때 전달해주어야 하는데 이때 .ENV 파일을 사용할 수 있다.
$ vi .env   

SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=1234
  • .env 파일을 생성후 아래 명령어를 통해 값을 확인 가능하다.
$ docker-compose config    

5-5. JDK 설치 및 jar 파일 생성

# aws coreetto 다운로드
$ sudo curl -L https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -o jdk11.rpm

# jdk11 설치
$ sudo yum localinstall jdk11.rpm

# 권한
chmod +x gradlew

# 테스트 케이스 제외하고, jar 파일 빌드만 진행
$ ./gradlew clean build -x test

5-6. Docker 이미지 받고 Docker Compose 실행

$ docker-compose up --build

  • 위에서 적용한 Elastic IP를 통해 접속하게 되면, 정상적으로 애플리케이션을 접속하는 것을 확인 할 수 있다.
profile
빠르게 실패하고 자세하게 학습하기

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

글 잘 봤습니다.

답글 달기