Docker DB연결 API 배포

배지원·2022년 11월 7일
0

Docker

목록 보기
4/5

이전에 진행했던 EC2 + docker 설치과정 이후에 추가적으로 진행함
Docker Mysql 연동

1. EC2 8080포트 오픈

  • 현재 서버 포트 번호 확인

  • EC2에서 8080포트 열기


2. Maven 설치

  • 관리자 권한으로 해야하기때문에 sudo su를 입력하여 관리자 권한으로 입력
apt update
apt install maven

  • 설치 했으면 루트로 이동
cd ~

3. Docker 파일 설치, 빌드

(1) Git Clone(사용할 코드 데이터가 저장된 레포지토리 클론)


  • 클론한 폴더로 이동하는데 이때 중요한것은 pom.xml파일이 있는 위치로 이동해야 한다.

현재 나의 경우에는 SpringBoot-Study/git/SpringBoot파일 안에 존재하므로 SpringBoot파일로 이동해야한다.


(2) 도커 파일이 현재 없으므로 만들어야함 일단 현재 위치에 아래 코드를 입력하여 빔으로 이동

  • Dockerfile에는 OS Dependency의 값들을 넣는다.(ex. jdk가 17이면 여기에서 수정하면 됨) 즉, 우리가 개발한 어플리케이션을 컨테이너 형태로 만드는 것이다.
vim Dockerfile

빔에서 i 입력하여 INSERT상태로 변경한 후 아래의 코드 붙여넣기

FROM openjdk:11-jdk-slim		// openjdk가 11버전이다
VOLUME /tmp
ADD /target/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]	    // java로 jar형식인 파일을 실행한다

그 후 esc를 눌러 insert상태에서 빠져나온 후 Shift + zz 를 눌러 vim저장후 빠져나옴

그 후 현재 폴더 리스트를 출력하면 Dockerfile이 있는걸 확인 할 수 있음


(3) 도커를 빌드하기 위해 .jar를 생성해줘야함 따라서, 현재 위치에 아래 코드를 입력함

mvn package

만약 테스트 과정에서 오류가 발생하는 상황이라면 위의 코드가 아닌 아래코드를 사용함(테스트 생략)

mvn -DskipTests=true package

package를 하고 파일 리스트를 출력했을때 target 파일이 생성되어있고 target파일안에 jar파일이 있다면 정상동작이 된 것이다.


jar로 Docker 없이 리눅스에서 프로젝트 실행하기

  • jar파일을 실행시키면 정상적으로 실행되고 웹 페이지도 열린다.
java -jar [jar파일 이름]


  • 이때 만약 포트번호를 8080이 아닌 다른 번호로 사용하고 싶다면
export SERVER_PORT=8888  // 포트번호를 바꾼후
java -jar [jar파일 이름]  // jar 파일 실행

(4) 도커 빌드(image만 생성하는 것)

이때, template 뒤에 점( . ) 앞뒤로 한칸씩 띄워줘야 함!!!!! (복사 붙여넣기하면 안될 수도 있으므로 직접 치는것을 권장함)

docker build -t springboot-jdbc-template . 

빌드 후에는 정상적으로 실행됬는지 확인하기 위해서는

docker images

를 입력하여 springboot-jdbc-template가 있는지 확인한다. 있다면 정상동작이 된것이다.

docker image : 도커가 실행되기 전 상태(도커 빌드는 image만 생성하는 것이므로 도커를 실행시키기 위해서는 run을 사용해야함)

docker container : 도커가 실행된 후 상태


docker ps를 통해 현재 실행중인 컨테이너를 확인할 수 있고 mysql과 연동중이기 때문에 mysql만 작동중인 것을 확인할 수 있다.


(5) docker run(도커 실행해서 Container 띄우기)

도커를 실행시키기 위해 run을 사용하여 동작시킴

docker run springboot-jdbc-template

그런데 포트번호를 정하지 않고 도커를 동작만 시켜서 접근할 수가 없다. 즉, 포트넘버도 지정해준다.

(1) 일반적인 실행
docker run -p 8080:8080 springboot-jdbc-template

(2) git에 올린 application.yml과 환경변수가 동일(8080로 받는 것을 8081로 변경해주면 된다.)
docker run -p 8080:8081 springboot-jdbc-template


(6) docker로 띄운 페이지 접근하기

  • 아마존 EC2로 띄운 서버의 퍼블릭 IPv4 DNS 주소에 swagger ui를 통해 접근할 수 있다.
IPv4 DNS 주소:8080/swagger-ui/

현재 서버가 아마존 EC2이므로 핸드폰으로도 해당 주소로 접속이 가능하다.


하지만, swagger ui에서 API통신은 되지 않는다. 그 이유는 Intellij 에서도 설정했었던 EC2 서버 주소인 Environment Variable값과 DB정보를 함께 등록해줘야 한다.

(1) docker 실행
docker run -p 8080:8080 springboot-jdbc-template

(2) Environment Variable 값
SPRING_DATASOURCE_URL=jdbc:mysql://아마존 IPv4 DNS 주소/likelion-db

(3) DB 정보(비밀번호)
SPRING_DATASOURCE_PASSWORD=1q2w3e4r  springboot-jdbc-template

-------------------
위의 3개를 한번에 묶어서 작성(서로 다른 값을 묶을때는 -e를 넣어 사용)
(4) 최종 커맨드
docker run -p 8080:8080 -e 
SPRING_DATASOURCE_URL=jdbc:mysql://아마존 IPv4 DNS 주소/likelion-db -e SPRING_DATASOURCE_PASSWORD=password springboot-jdbc-template

EC2와 DB정보까지 모두 넣어 docker run하고 난 뒤 swagger를 통해 id값을 입력하게 되면 DB에 저장되어 있는 해당하는 데이터를 출력해 준다.



전체적인 흐름

  • Dockerfile을 생성해서 설정값을 넣고 build하여 image를 생성한 후 이를 run하여 컨테이너에 올려 실행한다.



4. 수정사항 반영하기

  • 만약 Docker run까지 다하고 코드를 수정해서 git에 push했을 경우 수정사항을 다음과 같이 반영할 수 있다.

(1) 수정사항을 github에 push
(2) 코드 수정사항 업데이트함
(pom.xml파일이 있는 위치 즉, 내가 사용할 프로젝트 폴더 안에서 수행해야함)

git pull 

(3) jar파일 새로 생성(코드가 수정됬으므로)

mvn package

(4) 이미지 덮어씌워 빌드

docker build -t springboot-jdbc-template . 

(5) 이미지 실행

docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://아마존 IPv4 DNS 주소/likelion-db -e SPRING_DATASOURCE_PASSWORD=password springboot-jdbc-template
profile
Web Developer

0개의 댓글