일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 종만북
- Cloud Pub/Sub
- JavaScript
- 삼성SW역량테스트
- 수학
- 그리디
- 컴퓨터 구조
- 고속 푸리에 변환
- Air Table
- 생활코딩
- jpa
- BFS
- 삼성 SW 역량테스트
- 접미사 배열
- CI/CD
- ICPC
- 백준 1753번
- 다이나믹 프로그래밍
- REACT
- 우선순위 큐
- dp
- 이분탐색
- LCS
- 시뮬레이션
- 펜윅 트리
- 다익스트라
- r
- Cloud Run
- 데이터 분석
- Bit
- Today
- Total
코딩스토리
Spring 프로젝트로 Docker Image 만들기 본문
현재 진행 중인 프로젝트에서 Cloud Run을 사용하여 서버를 배포하려고 한다.
Cloud run은 앞선 포스팅에서 설명했듯이 컨테이너 기반의 Instance를 서버리스 형태로 실행하게 된다.
자세한 설명은 아래의 포스팅에!
https://kimtaehyun98.tistory.com/149
그렇기 때문에 Docker image를 생성하여 배포해야 한다.
차근차근 Docker Image를 생성해보자.
(물론 Docker 설치는 필수! 🙃)
1. DockerFile 생성
1) build -> jar 파일 생성
boot.jar 실행하면 아래와 같이 build 폴더에 libs가 생긴다.
이때 libs 폴더 안의 jar 파일의 위치를 기억해두자.
2) Dockerfile 만들기
스프링 공식 문서에 아래와 같이 써져 있다.
https://spring.io/guides/topicals/spring-boot-docker/
쉽게 말하면 Dockerfile을 보고 build 하겠다는 말이다.
각 명령어에 대한 설명은 아래와 같다.
FROM : Docker Image 생성 시에 기반이 되는 이미지. (JDK)
ARG : 컨테이너 내에서 사용하는 변수를 지정한다. (즉, JAR_FILE이란 변수를 선언하고 초기화시켜주는 과정)
COPY : JAR_FILE을 컨테이너 내부의 app.jar로 복사한다.
ENTRYPOINT : 컨테이너 시작 시에 실행되는 스크립트 (Spring이므로 Java를 실행하는 코드)
위의 명령어들은 가장 기본적인 것들이고 그 외의 추가적인 명령어는 아래의 공식 reference에 들어가 보면 찾을 수 있다.
https://docs.docker.com/engine/reference/builder/
위에서 FROM 부분에 jdk가 들어간다.
이때 jdk는 자신의 프로젝트에 맞게 쓰면 된다.
나는 jdk17을 쓰고 있고, 구글에 docker jdk 17 이런 식으로 검색하면 찾을 수 있다.
이때 뒤에 alpine이 붙는 것들을 확인할 수 있다.
alpine은 기본 이미지에 비해 불필요한 라이브러리 등이 포함되어 있지 않기 때문에 경량화되었고, 보안이 강화되었다고 한다.
중요한 건 경량화인데 이 부분 때문에 주로 사용한다.
(실제로 그냥 openjdk 17 치면 COMPRESSED SIZE가 200MB 이상임을 확인할 수 있다.)
자신의 프로젝트 jdk를 확인하는 방법은 Intellij 기준 File -> Project Structure -> Modules에 가보면 확인 가능하다.
3) docker build
bulild 명령어는 아래와 같다.
docker build -t "내가 생성할 Docker 이미지 이름" "프로젝트 내의 Dockerfile 위치"
(-t 명령어는 docker 이미지 이름 지정할 수 있게 해준다.)
이때 반드시 Dockerfile과 jar가 같은 경로에 있어야 한다!
(나는 libs 폴더에 들어가 생성된 jar 파일을 Dockerfile이 있는 곳으로 옮겨 주었다.)
이제 build를 해보자.
나 같은 경우에는 아래와 같이 build하였다.
docker build -t kimtaehyun98/conopotserver ./docker --platform linux/x86_64
// 여기서 ./는 현재 dir 위치이고 나는 root dir 밑에 docker 폴더를 만들어서 관리하기 때문에 위와 같이 입력
// 뒤에 platform을 명시해 준 이유는 M1 맥북 이슈로 빌드에 실패함!
참고로 docker 이미지 이름 부분을 소문자로만 작성해야 한다. 그렇지 않으면 아래와 같은 에러를 만날 수 있다.
또 자신이 M1 맥북이라면 위의 코드처럼 꼭 platform을 넣어주어야 한다. 안그러면 아래와 같은 오류를 만나게 된다.
(M1 칩이 아직도 이렇게 에러가 많은데 M2 칩은... 🤬)
이렇게 위의 명령어에 맞게 치면 build가 완료된다.
image가 생성되었는지 확인하려면 아래의 명령어를 입력해보면 된다.
docker images
생각보다 용량이 많이 크다 😭
4) docker run
빌드가 완료되었으면 이제 실행시켜보자.
docker run -p 8080:8080 kimtaehyun98/conopotserver
// docker run -p "외부 포트번호":"컨테이너 내부 포트번호" "이미지 이름"
// 외부 포트번호는 사용하고 있지 않은 포트 번호를 쓰면 되고, 나는 Spring 프로젝트이기 때문에
// 8080 포트로 통일시켜주었다.
Spring Application이 잘 실행되고 있음을 확인할 수 있다.
실제로 해당 서버에 접속해보자. (이렇게 테스트를 위한 Controller 하나 쯤 만들어두면 참 좋은 것 같다..!)
잘 실행되고 있음을 확인할 수 있다.
중지시키고 싶다면 docker app 들어가면 현재 실행되고 있는 container가 뜬다. 여기서 중지시키면 된다.
뭔가 내가 Docker를 언젠간 써보겠다고 막연히 생각은 했지만 실제 쓸 날이 이렇게 빨리 다가올진 몰랐다ㅎ..
또 제대로 Docker를 이해하기 보단 독학으로 조금씩 배워가고 있는 느낌이어서 뭔가 아쉬운 느낌이 든다ㅠㅠ
다음 포스팅에 Cloud Run에 배포하는 글을 쓴 뒤 Docker를 제대로 공부해볼까 생각중이다 😆
'Spring > Spring 공부' 카테고리의 다른 글
Spring 컨테이너와 Dependency Injection (0) | 2022.01.23 |
---|---|
HttpMessageConverter (0) | 2022.01.16 |
REST API (1) | 2022.01.16 |
좋은 객체지향 설계의 5가지 원칙 - SOLID (2) | 2021.07.08 |