CI를 설정한데에 이어서 CD 환경을 만들기전 수동 배포를 먼저 진행해보았다.
위의 4단계를 생각하고 배포를 실행해보았다.
tool window의 gradle에서 bootJar를 실행해주었다.
그리고 나서 최상위 디렉토리의 build/libs에 jar파일이 생성된 것도 확인을 하였다.
# base-image
FROM openjdk:11
#COPY에서 사용 경로변수
ARG JAR_FILE=build/libs/*.jar
#jar빌드 파일 도커 컨테이너로 복사
COPY ${JAR_FILE} app.jar
#jar 파일 실행
ENTRYPOINT ["java", "-jar", "/app.jar"]
사전 작업으로 도커 파일을 작성해주었다.
docker build 실행시 적용될 옵션으로 추출한 jar 파일을 app.jar라는 이름으로 이미지안에 넣어줄것이다.
docker build -t movie_main .
다음은 위의 명령어를 실행하여 도커 이미지 파일을 생성해주었다.
movie_main이라는 태그 이름이며 뒤의 . 은 현재 디렉토리에서 docker 파일을 찾으라는뜻으로 이해하면 된다.
docker images #이미지가 생성되었는지 목록 확인
docker tag A B:0.0.2 #A 이미지를 B의 이미지, 태그명으로 변경
docker push. #도커 허브에 해당 이미지를 push
정상적으로 push가 되었다.
docker pull username/tag
위 명령으로 이미지를 pull한 뒤
docker run -d --name server -p 8080:8080 movie_main
나는 실행용 이미지를 구분하기 위해 다시 이미지 이름을 변경해주었다.
이렇게 실행을 하면 생성한 이미지로 컨테이너를 실행시킬수 있다.
그 후 서버주소로 들어가면 내가 구현한 서비스를 확인할 수 있다.
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
현재 m1맥을 사용중인데 서버와 로컬에서 이미지를 빌드할 때의 환경이 달라 발생하는 문제로 보인다.
docker build --platform linux/amd64 -t 7zrv/movie_main .
빌드뒤에 --platform linux/amd64 옵션을 붙여주어 이미지 빌드 환경을 서버와 똑같게
통합하여서 해결하였다.
run 명령으로 컨테이너를 실행시키고 서버주소로 접속하였으나
사이트에 연결할 수 없다는 메세지가 출력이 되었다.
서버도 정상 실행중이고 컨테이너 실행도 에러 메세지가 없어서 의아했다.
run 명령 실행시에는 에러가 없었으나 컨테이너가 종료되어 있었고
docker logs 컨테이너 이름
로그를 확인해보니 데이터베이스 연결 에러가 발생하고 있었다.
이번에도 환경변수가 문제인듯 했다 서버에 환경변수를 설정한 상태라 괜찮을줄 알았는데 현재는 jar가 아닌 이미지를 실행시키는것이므로 환경변수를 도커에 별도로 설정을 해주어야하는 상황이었다.
여러 레퍼런스를 참고하니 3가지 정도로 방법이 추려졌다
1번의 경우 value가 매우 길어 하나하나 입력하는게 비효율적이고 2번이 간단해보였지만 환경변수 파일을 어떻게 관리할지를 고민해야했다.
3번은 현재 컨테이너를 하나만 이용하는중 + 현재는 2번 방법과 크게 차이가 없다고 생각하였고
깃 액션을 사용하면 1, 2번을 자동화할 수 있겠다는 생각이 들어서 일단 2번 방법으로 테스트를 한 후 통과한다면 CD를 구현할 때 workflows에 설정을 넣어주면 되겠다는 생각이 들어 우선 2번 방법으로 테스트를 해보았다.
기존 컨테이너를 지워주고 env파일을 넣어서 다시 실행을 했다.
성공했다 이제 서버에 있는 환경변수 파일을 지우고 깃액션을 통해서 관리하고 자동배포를 구현하면 CI/CD의 기본적인 구성이 완료될 것 같다.
이제 도커를 사용한지 이틀정도 밖에 안됐지만(강의를 들은적 있으나 따라치기에 바빳다.) 개념, 사용법은 어느정도 눈에 들어오는것 같다. 물론 아직 얕은 배움인걸 알기에 도커 교과서라는 책을 빌렸다 읽어보고 부족한 부분을 찾아 고도화 시켜야겠다.
혼자서 배포를 해보는것도 처음인데 여러 방식이 있겠지만 배포 방법도 이해가 되었다
레퍼런스 없이도 현재 배포환경은 구성이 가능할 것 같다
다만 현재는 aws를 이용해서 편하게 배포를 하는 느낌이라 공부를 제대로 한 것인지는 확신이 들지않는다 바닥부터 구성해야하는 환경도 경험을 해보고싶다
이제 자동화만 구성을 하면 다시 예매 api 개발 -> 테스트 -> 프로젝트 완료로 끝이 보인다.