필자는 개발만 하고 살았다. 아니, 개발만 하면서 살고 싶었다. 거지같은 배포, 운영, 절대 안해. 설마 내가 하게 되겠어? 오, 맙소사! 그렇게 됐다.
그러므로 이 글은 배포에 대한 지식이 기껏해야 한 1% 정도 함유된, 개발을 조리하는 시설과 같은 시설에서 만들어진 글이다. 주의! 영양가를 기대하지 마시오.
도커는 컨테이너 기반 가상화 플랫폼이다. 쉽게 말해, 응용 프로그램을 컨테이너라는 독립된 공간에서 실행하는 기술이다.
가상머신(VM)과 다른 점은 더 가볍고, 효율적인 자원 소비에 더불어 호스트의 운영체제 커널을 공유하기 때문에 운영체제의 부팅 과정이 없어 실행 속도가 매우 빠르다는 점이다.
우리는 이 준비된 스프링 프로젝트를 도커 이미지로 만들어 GCP의 이미지 저장소에 데려다 놓는게 목표이다.
우선 도커 이미지를 만들어내기 위해서는 Dockerfile을 만들어 이미지 생성에 대한 지시사항을 담아주어야 한다. 도커 파일은 프로젝트 폴더 바로 밑에 생성한다.
FROM openjdk:11-ea-jdk-slim
VOLUME /tmp
COPY build/libs/me-0.0.1-SNAPSHOT.jar me.jar
ENTRYPOINT ["java","-jar","me.jar"]
필자는 2.x Spring Boot를 사용 중이라 jdk 11을 사용했다. 이 글에선 도커파일 문법(...)은 자세히 다루지 않으니 궁금한 사람들은 따로 찾아봐도 좋을 것 같다.
도커파일을 작성해주었다면 아래 명령어로 .jar 파일을 만들어준다.
./gradlew clean build --exclude-task test
기존의 .jar 파일은 삭제하고 빌드하되, 테스트 코드는 빌드에서 skip하는 명령어이다.
...in the Gradle documentation.
BUILD SUCCESSFUL in XXs
위와 같은 성공 메세지가 떴다면 아래 명령어로 도커 이미지를 생성한다. 이제부터는 조금 힘이 든다. 무려 명령어를 지우고! 다시 내 것에 맞게 쓰기!라는 과정이 존재하기 때문이다.
docker build --tag [도커 username]/[생성할 이미지 이름]:[태그] .
자신의 도커 유저네임이 dockeruser고, 프로젝트가 mangheara라는 이름이라면 이런 식으로 명령어를 작성해주면 된다.
docker build --tag dockeruser/mangheara:0.0.1 .
도커로 push, pull을 받아와주고,
docker push [도커 username]/[생성할 이미지 이름]:[태그]
docker pull [도커 username]/[생성할 이미지 이름]:[태그]
아래 명령어를 통해 도커 컨테이너가 문제없이 실행된다면,
docker run [도커 username]/[생성할 이미지 이름]:[태그]
이런 반가운 로그가 콘솔에 출력될 것이다. 소중히 여겨주자, 힘들게 본 얼굴이니까...
GCP는 Google Cloud Platform의 약자로, 구글에서 제공하는 클라우드 컴퓨팅 서비스 플랫폼이다.
AWS나 Asure 등 다른 클라우드 컴퓨팅 서비스들도 있지만 굳이 GCP를 선택한 이유는...사실 별 거 없다! AWS 계정을 만드려면 해외 결제가 가능한 카드가 있어야 하는 데 필자는 (아직) 청소년이라 없고, Asure는 상대적으로 덜 유명해서 자료가 부족했다.
배포/운영 지식 1도 없는 입장에서 지금 있는 계정으로 충분히 서비스를 이용할 수 있고, 크레딧도 주고, 자료도 적지 않은 GCP는 최선의 선택지였다...!!
앞서 만든 도커 이미지를 GCP에 올릴 것이다.
우선 이미지를 올릴 GCP 프로젝트를 하나 준비한다. 프로젝트를 생성하는 것 자체는 어렵지 않으니 이 글에서는 생략한다.
우리가 필요한 것은 이미지가 올라갈 프로젝트의 id이다. 친절한 빨강 동그라미 씨를 따라가면 쉽게 얻을 수 있다.
프로젝트 아이디를 얻었다면 이제 내 프로젝트의 도커 이미지 저장소에 이미지를 푸시할 것이다. 우선 도커 이미지를 태깅하기 위해 아래 명령어를 콘솔에 입력해주자.
docker build -t gcr.io/[프로젝트 id]/[도커 이미지 name] .
프로젝트 id가 project-123456라면, 대강 이렇다.
docker build -t gcr.io/project-123456/dockeruser/mangheara
이제 이미지를 push해주기만 하면 되는데
docker push gcr.io/[프로젝트 id]/[도커 이미지 name]
unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request,
follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
우웩. 영어 울렁증인 나를 죽이기 충분한 길이의 오류 메세지다.
짧게 요약해 번역하자면 다음과 같다.
당신은 권한이 없으니 이쪽에서 자격 증명을 하십시오. 안그러면 당신의 컴퓨터를 터트리겠습니다.
역시 대기업의 협박. 너무 무서우니 빨리 자격 증명을 하도록 하자.
역시 대기업의 설명서. 한국어로 예쁘고 정갈하게 작성되어 있으니 눈이 편하다.
gcloud CLI 최신 버전(xxx.x.x) 설치 메뉴얼을 차례대로 따라가면 된다.
sdk 설치 절차를 마친 뒤 콘솔에 아래 명령어를 입력해 gcloud 로그인을 하자. 프로젝트가 생성된 그 계정으로 로그인 해주면 된다.
gcloud auth login
그 다음, 다음 명령어를 입력해서 설정을 마쳐준다.
gcloud auth configure-docker
그리고 아까 실패했던 이 명령어를 다시 입력해주면
docker push gcr.io/[프로젝트 id]/[도커 이미지 name]
앞서 만든 도커 이미지가 GCP에 정상적으로 올라간다.
이제 본격적으로 GCP에 배포를 해보자.
먼저 인스턴스를 만들어주어야 한다.
누르면 엄청나게 많은 옵션들과... 설정값과... 그런 배포 지식이 필요한 것들이 맞이해주지만... 그냥 싹다 무시하고 꼭 필수적인 것들만 설정할 것이다.
대강 이름과 리전(젤 싼걸로...) 머신 구성 또한 그리 비용이 크지 않는 걸로 설정해주었다.
머신 유형도 제일 싼걸로 설정해주었다!
그리고 제일 중요 별표 다섯개 쳐야하는 컨테이너 배포를 설정해주자.
컨테이너 배포 버튼을 누른 뒤 컨테이너 이미지란에 아까 생성한 이미지 이름을 넣어주면 된다.
gcr.io/[프로젝트 id]/[도커 이미지 name]
마지막으로 액세스 범위와 HTTP/HTTPS 트래픽을 허용하는 옵션을 켜주면 대략 설정은 끝이 난다.
추가로 방화벽 설정을 해주어야 한다.
방화벽 규칙을 만들어주자!
그 다음 아래와 같이 설정해주면 끝이다. 간단하다!
겸사겸사 외부 ip 주소를 고정해놔야겠다. 설정을 해두지 않으면 IP가 유동적으로 바뀌어 번거로워지니 설정을 잘 해놓자.
위의 설정들을 모두 끝내면 기다긴 배포가 끝난다.
외부 IP:8080에 접속하면 스프링 시큐리티 로그인 창이 날 반겨준다. 대강 배포는 끝낸 것 같다!
도커와 같은 컨테이너 기술의 배경 지식만 알고 있다가 이렇게 해보니 너무 어렵지만... 또 생각보다는 그렇게 복잡한 건 아니구나 했다.
글을 참고하면서 달리긴 했지만 시간이 지난 글이고, GCP 구성도 바뀌었는지 헷갈리는 부분도 많았다. 그래도 꿋꿋이 하니까 되긴 된다...
https://minkukjo.github.io/devops/2020/08/28/Infra-22/
https://minkukjo.github.io/devops/2020/08/29/Infra-23/