Spring Boot Starter를 통해 Web 프로젝트 생성 후 간단한 Controller 생성
package com.springdocker.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SpringdockerdemoApplication {
@GetMapping("/")
public String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(SpringdockerdemoApplication.class, args);
}
}
잘 작동하는지 확인을 위해 메이븐 패키징으로 jar 파일을 생성
$ mvn package
패키징이 완료된 jar파일을 실행하여 잘 동작하는지 확인해보자.
$ java -jar target/spring-boot-docker-0.0.1-SNAPSHOT.jar
Dockerfile 생성
Docker 컨테이너로 이용하기 위해 도커 이미지를 생성해야함. 그러기 위해서 먼저 프로젝트 루트 경로에 아래와 같이 Dockerfile을 생성하자
FROM openjdk:8-jre
COPY target/spring-boot-docker-*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
- base가 되는 이미지가 필요한데 openjdk:8-jre를 베이스 이미지로 설정함
- Base가 되는 이미지를 COPY할 이미지를 설정
- ENTRYPOINT로 command를 java -jar app.jar 로 줌
도커파일을 이용해 이미지를 빌드
아래 명령어를 사용하여 Dockerfile을 이용해 이미지를 빌드해보자.
$ docker build -t spring-boot-docker .
- . 은 현재 경로에 도커파일이 있음을 알려줌
빌드가 완료됐으면 이미지가 잘 생겼는지 확인해보자.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spring-boot-docker latest f60364dd13c7 15 seconds ago 265MB
kyeongho/docker101tutorial latest ffd4a1c7ad5c 27 minutes ago 26.5MB
docker101tutorial latest ffd4a1c7ad5c 27 minutes ago 26.5MB
node 12-alpine 057fa4cc38c2 7 days ago 89.3MB
openjdk 8-jre b1b24a1b2834 4 weeks ago 265MB
python alpine 8ecf5a48c789 4 weeks ago 78.9MB
nginx alpine 7d0cdcc60a96 5 weeks ago 21.3MB
위와 같이 Dockerfile을 이용해 spring-boot-docker 이름의 이미지를 생성완료했다. 그리고 잘 동작하는지 확인해보자.
$ docker run -d -p 8080:8080 spring-boot-docker
- -d 옵션을 통해 이미지가 백그라운드에서 실행될 수 있게 해준다.
- -p 포트매핑 옵션을 통해 컨테이너의 포트가 OS의 포트와 연결될 수 있게 해준다.
이후 브라우저를 통해 8080 포트에 접근해보면
위와 같이 잘 동작이 되는 것을 확인할 수 있다.
maven docker plugin 활용
maven docker plugin 을 검색해보면 spotify와 fabric 두 가지가 나오는데 fabric이 좀 더 디테일하고 잘 만들어졌다고 합니다.
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.33.0</version>
<configuration>
<images>
<image>
<name>kyeongho/spring-boot-docker</name>
<build>
<dockerFileDir>${basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
</plugin>
참조 : fabric8io/docker-maven-plugin
- fabic의 document에 installation을 참고하여 설정해준다.
- name 태그에는 이미지 이름 앞에 자신의 user name을 적어준다.
- dockerFileDir 태그는 src/main/docker가 기본 루트로 설정돼있는데 보통 Dockerfile은 project의 root에 위치해있는 경우가 많기 때문에 ${basedir}라는 환경변수를 활용해 Dockerfile의 경로를 project의 기본 경로로 설정해준다.
설정이 끝났다면 아래 명령어를 활용해 플러그인이 잘 동작하는지 확인해본다.
$ mvn docker:build
동작이 끝난 후 도커 이미지가 잘 생성됐는지 확인 해보면
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kyeongho/spring-boot-docker latest 197863661358 11 seconds ago 281MB
spring-boot-docker latest 53f47420441e 13 minutes ago 281MB
kyeongho/docker101tutorial latest ffd4a1c7ad5c 5 hours ago 26.5MB
docker101tutorial latest ffd4a1c7ad5c 5 hours ago 26.5MB
node 12-alpine 057fa4cc38c2 7 days ago 89.3MB
openjdk 8-jre b1b24a1b2834 4 weeks ago 265MB
python alpine 8ecf5a48c789 4 weeks ago 78.9MB
nginx alpine 7d0cdcc60a96 5 weeks ago 21.3MB
메이븐 플러그인을 통해 keyongho/spring-boot-docker라는 이름의 이미지가 잘 생성된 것을 확인할 수 있다.
메이븐 패키지에 docker:build 끼워넣기
매번 mvn docker:build를 통해 이미지를 생성하기엔 번거로움이 있기에 mvn package만 해주면 메이븐 패키징과 함께 도커 이미지가 빌드되게 해줄 수 있다.
먼저 target 디렉토리에 있는 것들을 클린 패키징을 통해 깔끔하게 해주고 생성했던 도커 이미지를 삭제해주자.
$ mvn clean
$ docker rmi kyeongho/spring-boot-docker
그 후 pom.xml에 execution 태그를 추가 설정하여 메이븐 패키지 페이즈에 도커 빌드를 끼워넣어 함께 실행되게 한다.
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.33.0</version>
<configuration>
<images>
<image>
<name>kyeongho/spring-boot-docker</name>
<build>
<dockerFileDir>${basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker-build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
설정 후 mvn package를 통해 빌드하면 jar 파일이 먼저 생긴 후 도커 이미지가 빌드되어 생성되는 것을 볼 수 있다.
$ mvn package
로그를 보면 jar 파일 생성 이후 docker:build가 실행되는 것을 볼 수 있다. 그러면 이미지가 제대로 생성됐는지 확인 해보자.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kyeongho/spring-boot-docker latest 5cb55ec5f57a 17 seconds ago 281MB
spring-boot-docker latest 53f47420441e 28 minutes ago 281MB
kyeongho/docker101tutorial latest ffd4a1c7ad5c 5 hours ago 26.5MB
docker101tutorial latest ffd4a1c7ad5c 5 hours ago 26.5MB
node 12-alpine 057fa4cc38c2 7 days ago 89.3MB
openjdk 8-jre b1b24a1b2834 4 weeks ago 265MB
python alpine 8ecf5a48c789 4 weeks ago 78.9MB
nginx alpine 7d0cdcc60a96 5 weeks ago 21.3MB
kyeongho/spring-boot-docker라는 이름으로 이미지가 잘 생성된 것을 볼 수 있다.
이미지 실행 후에 동작을 확인해보면 아주 잘 동작하는 것을 확인할 수 있다!
$ docker run -d -p 8080:8080 kyeongho/spring-boot-docker
plugin을 활용해 공용 저장소에 push 하기
추가적으로 mvn docker:push 커맨드를 사용하면 생성된 image를 자신의 docker hub에 올릴 수도 있다.
$ mvn docker:push
이를 활용하면 검증된 패키지를 도커 이미지로 빌드할 수 있고, 해당 이미지를 공용 저장소에 push할 수 있다. 그러면 누구든지 어디서든 공용 저장소에서 해당 이미지를 받아 테스트를 하거나 배포를 할 수 있게 된다!
'Study > spring' 카테고리의 다른 글
SpringBoot를 활용한 Hibernate 연동 JPA Basic 실습 (0) | 2020.12.21 |
---|---|
자바 ORM 표준 JPA 프로그래밍(2) - JPA 시작 (0) | 2020.12.04 |
자바 ORM 표준 JPA 프로그래밍(1) - JPA란 무엇인가? (0) | 2020.11.18 |
자바 ORM 표준 JPA 프로그래밍(1) - SQL을 직접 다룰 때 발생하는 문제점, 패러다임 불일치 (0) | 2020.11.16 |
Spring Data JPA (0) | 2020.06.16 |