EC2를 배포하는 방법에는 여러가지가 존재한다.
ec2+nginx와 ec2+docker 방식 중에 고민하다 후자를 선택했다.
Docker란? Docker 사용방법
- 일단 도커란 무엇인가?
간단히 리눅스 컨테이너를 만들고, 사용할 수 있는 컨테이너화 기술
이걸 이미지?라고 통칭하는 것 같다. - 도커 사용 방법
일단 docker 이미지 업로드로 먼저 시험해보자! 구글링 키워드 - docker 이미지 pull 실습
Docker Desktop을 깔아서 보면서 하면 좋다.
로그인할 때 github 이름으로 해야 함 주의 특히나 github 세미 이름..??
Youngseo-Jeon0313으로 하면 안되고 jeonyoungseo로 했어야 했다. 나중에 배포할 때에도 이름을 jeonyoungseo/umc3-server 이런 식으로 이름 슬래시로 지켜줘야 하는 게 있다.(뒤에 보면 알 수 있다!)
- 이 때 window를 사용한다면 docker를 위해 컴퓨터에 hyper-V라는 게 있어야 한다.
이 때 window home을 쓰는 경우 아래 것을 직접 만들어서 깔아야 한다. 구글링 키워드: window home hyber-V docker
LOCAL에서 DOCKER 실습하기
일단 깃허브에 commit할 때마다 적용이 되도록 하는 방법이 하나 있고(이거 구현하다가 실패. 다른 툴도 필요해보였다-Github Action이나 travis 등??ㅠㅠ 그리고 이렇게 하면 깃허브에 저장할 때마다 오류날 수도 있는데 그게 해결 안될 것 같아서 그냥 이걸로 안 함), build를 일일이 해서 docker에 이미지로 저장시킨 후에 ec2에서 가져다 쓰는 방법이 있다.
1. src 위에 Dockerfile을 만들어 다음 코드를 작성해야 한다.
FROM, ARG, COPY, ENTRYPOINT 등 Docker 명령어를 작성해야 한다. (아래 참고)
간단히 말하면 FROM은 build jdk 툴을 말하고(openjdk와 corrento로 나누어서 쓰는듯하다) ARG는 JAR파일을 만들어주는데 우리가 build를 하면 최상위 폴더에 build/libs/0.0.1-SNAPSHOT.jar파일이 생긴다. 그걸 가져와서 JAR FILE로 명시해주고 그걸 DOCKER상에 app.jar이라는 게 있는데 거기에 옮겨준다. 는 뜻!
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2. 트러블 슈팅
만약 q-Query를 사용한다면, build시 q-Query build를 먼저 해줘야 한다.
(구글링 querydsl build) build파일에서 initquery → cleanquery → others/buildqquery 순서이다.
3. 이후 ./gradlew clean build 해주면 0.0.1-SNAPSHOT.jar 파일이 생긴다.
4. 그러면 이제 docker image로 만들어줘야 한다. docker build -t jeonyoungseo/umc-server:0.1 .
→깃허브 아이디/[이름]:버전 . 이다
docker images →내가 지금까지 만든 image들을 확인할 수 있다. desktop에서도 가능 docker run -p 8080:80 jeonyoungseo/umc-server:0.1 → local 8080에서 돌릴 수 있다. 이 때 ec2 보안 인바운드 규칙 안에 내 ip주소로 해서 0부터 65535까지 그냥 허용해놓고 돌려야 한다.
EC2에서 DOCKER 실습하기
이제 ec2에 image를 던질 차례다! 이 때 ec2 실습 전에 local에서는 에러가 안 났는데 갑자기 에러 나는 것들이 있으므로 주의한다.
1. 일단 jpa 부분에 database: mysql /mariadb / h2 이런 식으로 명시를 해줘야 하고, hibernate 관련 부분도 추가해줘야 한다. (아래 그림에서 추가해준 부분에 해당)
2. useSSL을 false로 하고 Timezone 잘 넣기
?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
위에도 보이지만 db에 useSSL=false를 넣어줘야 한다.
3. RDS의 보안그룹 인바운드 규칙에 ec2 퍼블릭 ip주소를 넣어 줘야 한다. 이곳은 나를 구원해준 블로그 ♥
4. 그리고 jpa에서 update 가 아니라 create로 해줘야 한다ㅠㅠ! 이곳 또한 날 구원해준 블로그 ♥
5. ec2 배포 명령어는 다음과 같다. pem 이 있는 곳에 들어가서 ec2에 접속한 후 docker run한다. ec2의 8080에 넣어준다는 뜻! 이 때도 ec2 내에 있는 보안그룹을 잘 열어두자. 80, 432, 22 였나.. 이런 걸 다 열어야 해서 그냥 0.0.0.0/0 ip 주소에 해당하는 것을 0~65535까지 다 열어줬다. 0.0.0.0/0에 해당하는 ip 주소로 잘 열어야 한다.!
cd C:\Users\20wjs\Downloads
ssh -i "umc-key.pem" ubuntu@ec2-~~~-197.ap-northeast-2.compute.amazonaws.com
sudo su
docker run -p 8080:8080 jeonyoungseo/umc3-server:0.1
6. 그럼 이제 docker를 꺼도 작동할 수 있도록 하려면 백그라운드에서 docker가 작동하도록 하면 된다! (너무 궁금했던 부분) 첫 명령어 - docker run -d -p 8080:8080 --name umc3 jeonyoungseo/umc3-server:0.1 나중에 다시 run시키고 싶다면 docker stop 하고 다음 명령어 사용한다. docker run -d -p 8080:8080 jeonyoungseo/umc3-server:0.1
더 공부해볼 내용
- 많이 찾아봤는데 일단 주변에서는 docker로 잘 안하고 nginx로 배포를 많이 하는 것 같다. 자료가 nginx가 더 많아 보였다. nginx로 배포하는 방법도 공부해보면 좋겠다.
- Travis CI라는 툴이 있는데, github랑 연동시켜서 에러없이 자동으로 빌드되는 툴인 것 같았다. docker처럼 명령어 작성법도 공부해야 한다. 깃허브에서 오류가 뜨는 것도 잡아주는 것 같았다.
- Github action 도 찾아보면 좋겠다.
- ec2 메모리 문제
'BackEnd > DEVOPS' 카테고리의 다른 글
[Serverless|Cloud RUN] Google Cloud Run으로 JAVA WAR 파일 배포하기 (2) | 2024.01.02 |
---|---|
[DEVOPS] Linux 환경에서 ELK metricbeat를 사용한 시스템 모니터링 (0) | 2023.09.02 |
[Kafka] Kafka 이론 및 실습(Window10 Local 환경) (0) | 2023.08.11 |
[DEVOPOS | AWS | SPRING] application.yml 파일 환경변수 외부주입 - aws env 파일/intellij configuration (1) | 2023.06.09 |
[DevOps] Docker+Docker_compose+Github_Actions (5) | 2023.03.24 |