간단한 SpringBoot 프로젝트를 만들고, Dockerfile을 통해서 애플리케이션을 docker이미지 파일로 만들고, 실행해보고, docker hub에 remote로 푸시하는 방법에 대해서 알아보자
1. Sample 프로젝트 만들기
pom.xml
파일에 spring-boot-starter-web
web모듈을 추가하고 루트로 요청이 왔을때 hello world 바디를 리턴하는 간단한 프로젝트를 만들어 보자!
@RestController
public class HelloController {
@GetMapping("/")
public String home() {
return "hello world";
}
}
2. Dockerfile 만들기
Dockerfile은 인프라스트럭쳐의 프로비저닝(서버 환경 셋팅)이라고 생각하면 된다.
docker build
라는 명령어를 통해서 Docker가 Dockerfile을 읽어서 자동으로 도커 이미지를 빌드한다.
FROM adoptopenjdk/openjdk11
CMD ["./mvnw", "clean", "package"]
ARG JAR_FILE_PATH=target/*.jar
COPY ${JAR_FILE_PATH} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
- Dockerfile는 최상위 루트 프로젝트 경로에 위치한다. 파일 이름은
Dokcerfile
이라고 저장해야 한다. - Dockerfile에 정의한 순서대로 (recursive하게) 읽어서 Docker 데몬에 해당 명령어를 실행한다.
- 반드시
FROM
키워드로 시작해야 한다.- adoptopenjdk/openjdk11 버전을 pull 받는다.
- alphain 버전이 11버전에서는 아직까지 지원하지 않는다. alphain 버전은 20MB 정도 가벼운 버전이다.
CMD
키워드도 무조건 한번만 사용할 수 있다.- 여기에서는 mvnw(maven wrapper) 를 통해서 해당 프로젝트를 빌드를 한다 .
ARG
키워드는 Argument로 JAR_FILE_PATH 라는 변수명에 target/*.jar 경로를 담았다.COPY
키워드는 위에서 할당한 변수명을app.jar
이름으로 복사했다.ENTRYPOINT
는 java를 실행하는 parameter를 담았다.
자세한 내용은 Docker 레퍼런스를 확인 하자!
추가로 Spring Boot 진영에서 Dockerfile에 대해서 포스팅한 글이 있다. 더 다채롭게? 다양하게 JAVA_OPTION 이라든지, shell script로 실행한다든지, 다양한 방법들이 존재한다. 아래 사이트에서 확인하자! https://spring.io/guides/topicals/spring-boot-docker
3. Dockerfile로 이미지 빌드하기
$ docker build -t docker-example:0.0.1 .
- 해당 프로젝트에서 terminal을 실행시켜
build
명령어로-t
태그 옵션을 줘서 name:tag 줘서 빌드한다, - 해당 명령어(
build)
는 프로젝트 루트에 있는 Dockerfile을 읽어서, docker 데몬이 실행을 순차적으로 진행한다.
$ docker images #images 명령어로 docker이미지가 제대로 만들어 졌는지 확인한다.
## 다음과 같이 이미지가 만들어 졌다.
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-example 0.0.1 378107e4a39d 3 hours ago 454MB
$ docker run docker-example:0.0.1
- 다음과 같이 해당 이미지 파일을 실행하면, spring boot 프로젝트가 뜬다.
$ curl localhost:8080/
루트 경로로 요청하면,hello world
바디 값을 리턴한다.
4. IntelliJ의 docker 플러그인으로 활용하기
IntelliJ에서 Docker플러그인을 설치하고, IntelliJ GUI상에서 Docker 이미지, 컨테이너, 파일경로, 로깅과 같은 것들을 Context switching 없이 IntelliJ에서 사용하는 방법을 보여준다. 사실 Docker라는 명령어만으로도 충분하지만, IntelliJ에서 제공해 주는 편리한 플러그인 + 관리 포인트를 한군데로 하는것을 좋아하기 때문에 찾아보게 되었다.
더 자세한 내용은 IntelliJ의 Docker 플러그인에 대한 학습편을 살펴보자.
4.1. Docker 플러그인 설치
- 기본 설치되어 있다. 없다면 설치하자!
4.2. Docker Integration 설정 (with IntelliJ)
cmd + ,
설정 창을 연다.- Build, Execution, Deployment 의 Docker를 클릭한다.
- Docker for Mac을 (로컬에 이미 Docker를 설치했다는 전체하에) 선택한후 OK를 누른다.
4.3. Docker Connect
Docker Connect 하는 방법
- Docker를 설정한 후에, 다음과 같이 Service 영역에서 Docker가 연결이 되었다.
- Docekr를
우클릭
을 누르고,Connect
를 누르면, 로컬에 설치한 Docker와 연결을 맺는다. - 그리고 나면 다음과 같이 Docker
이미지들
, 실행중인컨테이너
들이 목록이 나온다.
4.4. Docker Push Image
Docker 이미지 푸쉬하는 방법
- 로컬에서 다운 받았던 Docker 이미지들 목록이 나온다.
- 우리는 위에서 만들었던
docker-example:0.0.1
이미지를우클릭
눌러서Create Container(컨테이너를 실행)
할 수도 있고,Push Image..
를 통해서 내 개인 계정의 Docker Hub에 올릴수 있다. - 지금 예제에서는 내가 만든 Docker이미지를 Docker Hub에 올려보도록 하자.
- 2번
Push Image...
를 클릭한다.
Push Image
- 다음과 같이 Push Image에 Repository 명과 Tag명을 입력한다.
- 그 전에 Docker Registry가 등록이 안되어있다면, 1번의
New
버튼을 눌러서 Registry를 등록하자 (username, passwrod)
- 그 전에 Docker Registry가 등록이 안되어있다면, 1번의
- OK 버튼을 클릭한다.
- docker hub로 push가 되고, 다음과 같이 자신의 Docker hub에 해당 이미지가 올라간것을 확인 하자!
4.5. Docker Hub에서 확인
Docker Hub에서 확인
5. 정리
- 간단한 SpringBoot 프로젝트를 만들고, Dockerfile를 설정하고, Dockerfile을 읽어서 자동으로 build해서 docker-exampel 이미지를 만들었다.
- 만들어진 이미지를 단순한 docker command line이 아닌, IntelliJ의 Docker 플러그인과 연동해서 조금더 쉽게 사용하는 방법도 알아봤다.
📚 Related Posts
- Spring WebFlux 테스트 방법
- Spring과 MongoDB 연동 실전 가이드
- SpringBoot, MongoDB 시작하기
- Spring Boot 서버 타임존 설정 방법
- SpringBoot CommandLineRunner, ApplicationRunner 초기화 방법
- Jackson, LocalDateTime Serialization, Deserialization 이슈
- Spring Boot, Dockerfile로 이미지 생성, 배포하기
- SpringBoot RabbitMQ 연동하기
- Junit5 정리
- Spring Sentry(에러 트래킹 서비스) 적용하기
- [Spring] 빈 주입하는 방법 && Best Practice
- Thymeleaf 실무에서 자주 사용하는 것들
- Thymeleaf Collection 정보 화면에 렌더링하기
- Spring, JPA를 이용한 REST API 만들기
- [Spring] MultipartFile을 이용한 파일 업로드
- [Spring] 모델 검증(validation)
- [Spring]HandlerMethodArgumentResolver 인터페이스
- [Spring] DispatcherServlet에 대해서 알아보자
- [Spring] MVC 만들어 보기
- [Spring] 메세지 컨버터
- [Spring] MVC 살펴보기
- [Spring] @ConfigurationProperties를 이용해서 properties값들을 클래스로 관리하기
- [Spring] Profile 설정하기
- [Spring] SpringApplication를 통한 코딩
- [Spring Boot] 스프링 부트 3가지 특징
- [Spring] @SpringBootAppllication 어노테이션에 대한 고찰
- [Spring] bean circular dependencies (빈 순환 참조)
- [Spring]Bean에 대해서 알아보자
- SpringBoot, JPA, H2를 이용한 간단한API 작성
- [Spring] Spring Data Common 프로젝트 살펴보기