docker로 간단한 배포를 진행할 겁니다. hello world 만들어서 배포하기 이런 거 말고 ec2를 활용한 실전 배포를 할 겁니다,
저는 인텔리 제이로 들어가서 docker 파일을 만들 겁니다. 이클립스에서 하셔도 상관없습니다.
먼저 jar 파일을 만듭시다.
https://cbh2031.tistory.com/84
apt-get install docker.io 독 커를 설치하십시오
플러그인도 docker 설치하시면 더 보기도 편합니다.
dockerfile를 작성합시다.
위치는 최상위 위치에 있어야 합니다.
# 최신 11-jdk 이미지로 부터 시작
FROM openjdk:11-jdk
# jar 파일 경로
ARG JAR_FILE=target/*.jar
# 앞에는 HOST OS의 현재 폴더를 의미
# 뒤에는 컨테이너의 현재 폴더(WORKDIR)를 의미
COPY ${JAR_FILE} app.jar
# 안해도 되지만, 하는게 좋습니다.
# 이 컨테이너는 8080 포트를 사용한다는 의미 입니다.
EXPOSE 8080
# docker run 명령에서 실행항 명령어
ENTRYPOINT ["java","-jar","/app.jar"]
# java 옵션 처리
# ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]
#타임존 아시아 서울 적용
ENV TZ=Asia/Seoul
실행시키면 됩니다. 참고로 jar 파일은 보이기 편하게 위치를 옮겼고 경로도 그렇게 바꿨습니다 원래 target 파일 맨 밑에 생성됩니다. 경로나 파일 위치 옮기지 마시고 그냥 dockerfile 실행시키십시오
독거 파일 실행시킬 때도 똑같이 터미널이랑 같은 환경으로 실행시킵니다 혹여나 docker image 생성할 때 오류가 보이면 무조건 그걸 수정하셔야 배포 때 문제가 없습니다. 저는 이걸로 4일을 날려 먹었습니다. 대부분 jar 파일 문제, db 연결과 끊겨서 jpa 가 테이블을 못 만들어서 코드실행이 불가능한 경우가 많습니다.
docker 랑 aws DB 서버통신 문제는 일단 배포까지 완료하고 나서 상태를 봐야 할 경우도 있습니다. 이경우는 좀 귀찮아집니다.
db가 문제 시면 https://cbh2031.tistory.com/82
해당 글을 참고하셔서 아마존 RDS랑 프로젝트랑 연결하셔서 jar-> docker image를 만들어야 합니다.
컨테이너 밑에 클릭하시면 기존 로컬 작업처럼 컴파일러에 스프링 이모티콘도 나오고 그런 것들이 그대로 나올 겁니다. 그것도 찍으려는 대 갑자기 랙걸려서 안보여주네요
이렇게 나오고 정상적으로 컴파일러처럼 Started 가 나와야 합니다. 참고로 docker file로 실행시키면 이미지 이름을 멋대로 올리기 때문에 저는 그냥 잘돌아가는지 확인만하고 이미지 빌드를 이름을 지정해서 따로 한번더 합니다.
docker hub에서 레포지토리를 만들어야 합니다. docker hub에 들어가셔서 로그인하고 레포지토리 만들기를 누르시고 누 만드시면 화면과 같이 나옵니다.
잘 만들어지는 걸 확인했으면 다시 터미널에 돌아와서 docker build -t 아이디/레포지토이름 를 칩니다
독커 허브에 푸시를 를 해서 허브에 집어넣고 다시 AWS로 집어넣어야 합니다
명령어 docker push 아이디/레포지토리이름
뒤 태그이름은 빼고 넣으셔도 됩니다
이제 AWS 인스턴스에 들어가야 합니다 각자 준비한 AWS 인스턴스 리눅스에 들어갑시다 저는 우분투 오라클 리눅스입니다.
putity를 사용했으며 그 외 여러 가지 각자의 방법으로 ec2 리눅스로 들어가는 방법이 있습니다. https://cbh2031.tistory.com/78
이건 제가 사용하는 방법입니다. 들어와서 root 권한자로 로그인해야 합니다 sudo passwd root를 입력하고 비밀번호를 치
신다음 root 계정을 생성합니다. 그리고 su root을 입력하시고 비밀번호를 마저 치시면 다음과 같은 화면이 나옵니다
apt-get update , apt-get upgrade 실행시켜 리눅스를 최신버전으로 바꿔 놓습니다. 글자가 많으면 느려지거나
튕길 수도 있으니 clear 쳐줘서 깨끗하게 만든 다음 작업을 합시다.
그리고 배포 서버 리눅스에 docker를 설치해야 합니다 apt-get install docker.io
AWS ec2 리눅스 서버에서 docker hub에 담아놨던 배포용 이미지들을 가져와야 합니다
docker pull (독커허브아이디/독커허브레포지토리)
그리고 이미지로 아이디를 확인해야 실행시킬 수 있으니 docker images 를입력해서 docker image id를 확인합시다
마지막입니다 이제 이미지를 컨테이너 화 시키면서 서버포트 8080을 주입해서 외부에서 jar파일을 실행시킨 서버에 들어올 수 있게 할 수 있습니다.
docker run -d -p 80:8080 (이미지 아이디) -d( 포트로 들어와서) -p(이쪽 포트로 보내준다)
ex ) docker run -d -p 80:8080 01d56c 뒤쪽 아이디는 5자리만 입력해도 인식을 합니다.
docker ps를 사용해 컨테이너가 잘 실행되고 있는지 확인합시다.
가끔가다가 db나 무슨 문제가 생겨서 10초 실행하다 정지하는 현상이 있습니다. docker ps 한 30초 동안 계속 확인하십시오 만약 ps로 입력하다 없어지면 docker ps -a 을 입력하면 정지한 컨테이너까지 다 확인 가능합니다.
이제 인스턴스에 받은 주소를 입력하면 배포한 프로젝트 화면이 나옵니다.
만약 로컬 에선 오류가 안 걸리지만 배포 중 오류가 걸리면 서버단에서 로그를 봐야 합니다. 대개 웹사이트 로그에서 볼 수 있고 더 정확한 건 서버 배포 리눅스에 들어가서 로그를 확인하는 방법이 있습니다. 저는 docker 컨테이너 로그를 건드려서보는 방법을 선택하긴 합니다. 그걸로 thymeleaf 오류를 잡은 적이 있습니다.
docker logs <container_id>
그리고 docker 컨테이너로 즉시 안들어가셔도 외부에서 아이피를 조회한다음 다른 컨테이너끼리 연결을 할수 있습니다
리눅스 공부할때 mysql 아아피를 조회할려고 하였을때 버전업이 되면서 오류가 났던 일이 있는대 이때
docker inspect -f "{{ .NetworkSettings.IPAddress }}" CONTAINER_ID 이걸 사용해서 내부 ip를 받아와 연결 시키면서 해결했던 일도 있었습니다.
가장 간단한 배포를 해봤습니다 여기서 더 한발 나아가 로컬 개발 환경에서 이미지 파일을 저장하였다면 이제 배포 시 이미지 파일 경로가 일치하지 않아 이미지가 깨지는 현상도 있을 수 있으니 이점 생각하시면서 개발을 하시고 준비하시기 바랍니다. 여기서 더 다양한 배포 방법이 있습니다 일단 간단한 첫 배포는 이렇게 해보시고 더 복잡한 젠킨스나 기타 다른 배포방법이 적혀있는 블로그가 있다면 추천 부탁드립니다.
'AWS > 배포 관련' 카테고리의 다른 글
자바 기준 배포파일 만들기 jar (maven,Gradle) (0) | 2023.03.21 |
---|---|
ec2 인스턴스 만들기 (0) | 2023.03.21 |
배포를 위한 ec2 아마존 db RDS 연결 (0) | 2023.03.21 |
윈도우 에서 EC2 인스턴스 접속 (1) | 2023.03.15 |