Programming Summary

[2023-05-22] Docker를 활용한 서버 이미지 빌드 및 AWS에 배포 본문

2022-23 Final Project

[2023-05-22] Docker를 활용한 서버 이미지 빌드 및 AWS에 배포

쿠키롱킹덤 2023. 5. 22. 15:23

프론트엔드와 협력 작업을 위해 내가 만든 서버를 프론트엔드가 접근 가능하도록 해주어야 했다. 내가 생각해낸 해법은 두가지였다.


1) 포트포워딩을 통해 내 컴퓨터로 연결 가능하도록 만들기

2) 클라우드에 서버 올리기


1) 포트포워딩을 통해 내 컴퓨터로 연결하기

sk 공유기를 사용하고 있는 나는 192.168.45.1을 통해 sk 브로드밴드에 접속할 수 있었다.

초기 설정은 id : admin, pw: (Router MAC주소 뒷자리 6자리)_admin이었다.

이를 통해 접속한 후 내부 포트 8080, 외부 포트 8001번은 열어 주어 포트포워딩을 해주었다.

하지만 접속이 되지 않았다. 방화벽의 인바운드 규칙을 변경해주었고, 포트포워딩을 해주었는데도 접속이 되지 않았다. 이유는 IPTV 모뎀 때문이었다. 외부 포트로 접속하여도 모뎀에 걸려 내 서버까지 도달하지 않는 것이었다. 모뎀 역시 id: admin, pw: (모뎀 MAC주소 뒷자리 6자리)_admin이었지만, 모뎀의 MAC 주소를 찾아내지 못해(아마 라우터를 분해해야 나올 것 같다) AWS에 올리는 방안으로 진행하기로 하였다.


 

2) 클라우드에 서버 올리기

 

AWS에 가입하고 EC2 인스턴스를 활용하여 인스턴스를 받아 실행시켰다. 그러나 이번엔 SSH가 문제였다. 무슨 일인지 SSH Client를 통한 인스턴스 접근이 되지 않았다.

 

connect to host ec2-(ip):ap-northeast-2.compute.amazonaws.com port 22: Connection timed out

 

해당 오류가 지속적으로 발생하였고, -vvv를 통해 로그를 확인해보니, 

 

debug3: Failed to open file:C:/Users/shinheeeul/.ssh/config error:2

debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2

 

config 파일을 찾지 못한다는 것이었다. 결국 이 에러는 해결하지 못하고 인스턴스를 AWS에서 실행시킬 수 밖에 없었다.

SSH를 통해 원격 접근이 불가능해지기도 하였고, 이번 기회를 통해 docker를 활용하여 서버를 컨테이너화 시키고 이를 AWS에 보내기로 하였다.

지난번에 docker를 설치하기도 하였으니, intellij의 docker 플러그인을 활용하기로 하였다.


2-1)  jar 파일 생성하기

gradle에서 Tasks/application/build의 bootJar를 통해 jar 파일을 생성해주었다. 해당 파일은 build/libs 파일에 생성이 되었다.


2-2) Dockerfile 생성하기

같은 위치에 Dockerfile을 생성해주었다.

FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

그리고 Dockerfile에 다음과 같이 입력해주었다. spring에서 17버전의 jdk를 사용하고 있어 openjdk를 17버전으로 설정해주었다.


2-3) 이미지 파일 생성하기(빌드)

그리고 프로젝트 터미널 창을 해당 위치까지 옮겨준 후, 

docker build -t [dockerhub ID/Repository Name] .

을 통해 프로젝트를 빌드해주었고, 이미지 파일을 생성하였다.

 

docker images

docker images를 통해 해당 docker가 제대로 추가된 것을 볼 수 있다.

docker run -p 8080:8080 [도커 허브 ID/이미지 이름]

위 명령어를 통해 이미지 파일을 실행해볼 수 있으나, 현재 내 프로젝트는 h2 DB가 연결되지 않은 상태로 에러가 발생한다. 이는 관해서는 밑에서 서술하기로 하고 해당 이미지 파일을 먼저 AWS 인스턴스로 보내주자.


2-4) 이미지 파일 push하기

docker push [dockerhub ID/Repository Name]

 위 명령어를 통해 dockerhub에 만든 이미지 파일을 등록 시켜주었다. 이 과정에서 docker Desktop에 로그인 해주지 않으면 "denied : requested access to the resource is denied" 에러를 발생시키니 docker에 로그인 해주고 해당 아이디를 입력해주도록 하자.


2-5) 이미지 파일 pull하기

 

이후 amazon ec2로 돌아가

sudo yum install docker -y

docker를 ec2에 설치해주었다.

sudo service docker start

이후 도커를 실행해주고

sudo usermod -aG docker ec2-user

인스턴스가 실행되면 바로 docker를 사용할 수 있도록 등록해주었다.

docker pull [dockerhub ID/Repository Name]

그 후, 내가 push한 서버 이미지 파일을 pull을 통해 받아왔다.

sudo yum install java-17-amazon-corretto-devel.x86_64

이미지 파일을 실행시킨 jdk가 없다고 나오길래 인스턴스에서도 jdk 17버전을 설치해주었다.


2-6) docker-compose를 통해 h2와 spring boot 이미지파일 연결해주기

** 이전에 h2 이미지 파일을 설치해주고, JDBC URL과 연결을 해주어야 할 수도 있다.

 

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

다음 링크를 통해 먼저 docker-compose를 설치해준다.

최신 버전 확인 링크 : https://github.com/docker/compose/releases

 

Releases · docker/compose

Define and run multi-container applications with Docker - docker/compose

github.com

sudo chmod +x /usr/local/bin/docker-compose

docker-compose 권한 설정해주고

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

심볼릭 링크를 설정해주었다.

docker-compose -v

위 명령어를 통해 docker-compose가 잘 설치되었는지 확인해주자.

vi docker-compose.yml

그 후 docker-compose.yml 파일을 만들어주고

version: "3"
services:
  db:
    container_name: h2
    image: oscarfonts/h2:latest
    ports:
      - 1521:1521
      - 8081:81
    environment:
      H2_OPTIONS: -ifNotExists
    volumes:
      - ./h2/:/opt/h2-data
    restart: always
  redis:
    container_name: redis-local
    image: redis:alpine
    ports:
      - 6379:6379
    volumes:
      - ./data/:/data
  app:
    container_name: test_app
    image: [dockerhub id]/[repository name]
    ports:
      - 8080:8080
    environment:
      SPRING_DATASOURCE_URL: jdbc:h2:tcp://h2:1521/flash
      SPRING_DATASOURCE_USERNAME: sa
      SPRING_DATASOURCE_PASSWORD: 
    depends_on:
      - db
      - redis

다음과 같이 생성해주었다.

app은 컴퓨터에서 image 파일을 받아왔으니 build할 필요없이 image 파일을 넣어주었고 redis와 h2 db 이미지 파일을 다운 받아 해당 컨테이너들에 의존하도록 설정해주었다.

 

docker-compose up -d

이제 docker-compose의 up을 통해 실행시켜주고 -d를 사용하여 백그라운드에서 작동하도록 만들어주자.

 


 

이제 잘 작동되는지 확인해보자.

docker ps 명령어를 통해 해당 docker들이 전부 실행되는 것을 볼 수 있고

포스트맨과 public ip를 이용해서도 서버에 접근 가능한 모습을 확인할 수 있다.

 


해당 작업을 통해 docker를 활용하여 spring 프로젝트를 컨테이너화 시켜 이미지 파일을 제작하고 aws에 올리는 법을 배울 수 있었다. 후에 다른 프로젝트를 진행할 때도 지금 포스트를 참조해서 진행하도록 하자


다음 링크들을 참조하여 진행하였다.

Spring Boot + Docker : https://aodtns.tistory.com/115

 

Spring Boot + Docker로 배포하기

서론 웹에 대해 아무것도 모를 때는 로컬에서는 실행되는 걸 확인했는데, 이걸 다른 사람이 확인하려면 나랑 똑같이 인텔리제이를 설치해서 실행해봐야 되는 건가 하는 의문이 있었다. 똑같은

aodtns.tistory.com

h2 이미지 파일 다운 : https://velog.io/@seungju0000/docker%EC%99%80-h2-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0

 

docker와 h2 연결하기

docker 설치 및 실행 가능 환경d : 도커 컨테이너를 백 그라운드로 실행p : 컨테이너와 로컬의 포트를 연결하는 옵션v : DB 저장 경로 (/Users/seungjulee/study/h2/makeHere 부분을 본인이 실제 저장할 경로를

velog.io

h2 + Spring Boot + Docker : https://velog.io/@seungju0000/docker-compose%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-spring-boot-h2-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0feat.redis

 

docker-compose를 이용하여 spring boot + h2 연결하기(feat.redis)

Dockerfile 먼저 어플리케이션 관련 설정을 만든다. docker-compose.yml 결과적으로 이렇게 되고, 하나하나 보도록 해보자. h2 먼저 이 설정은 내가 올린 이전 글의 옵션들을 docker-compose로 가져온 것이다.

velog.io

Docker Compose 설치 : https://soyoung-new-challenge.tistory.com/73

 

[Docker-Compose] 도커 컴포즈 설치 및 사용

이번 포스팅은 도커 컴포즈 설치와 사용방법 등을 다룬 내용입니다. 도커 설치 - 도커 컴포즈 설치 전, 도커를 설정하고 사용방법을 아래 포스팅을 통해 익힌다. - 도커 설치 포스팅 : https://soyoung

soyoung-new-challenge.tistory.com