본문 바로가기
Spring Boot

SpringBoot , Docker를 이용한 Hello World 출력

by byeongoo 2020. 1. 2.

안녕하세요 그동안 스프링프레임워크를 사용하면서 직접 mysql, tomcat, jenkins 설치를 하고 그 위에 war 파일을 젠킨스를 통해서 배포를 진행하였습니다. 이렇다보니 서버를 확장할때마다 설치를 직접해주어야하는 문제가 있어 이번 기회에 Docker를 활용하여 aws 서버에 Docker 컨테이너를 실행하여 웹 어플리케이션 배포하는 방식을 적용해보려고합니다. 이번장에서는 Docker를 이용해서 Hello World를 출력해보는 예제를 진행해보겠습니다. 만약 도커의 기본개념을 알고 싶은분은 도커란? 포스팅을 참고해주세요

 

1. 프로젝트 생성

아래 캡처 사진들을 보면서 새로운 프로젝트를 하나 생성해봅니다. 저는 윈도우10환경에서 인텔리제이 Ultimate라는 통합개발환경(IDE)를 사용해서 진행하였습니다. 인텔리제이 community 버전은 웹 개발 환경을 따로 지원하는것 같지 않아서 학생계정으로 Ultimate버전을 설치하였습니다.

자바 버전으로 1.8을 선택하였고 Next를 클릭합니다. 

Group Id와, Artifact를 입력해 줍니다. Type으로 저는 Maven Project를 선택하였습니다. Next를 클릭합니다.

Dependencies에서 Web을 선택하고 Spring Web을 선택하고 Next를 클릭합니다.

마지막으로 오른쪽 하단에 Finish 버튼을 클릭합니다.

2. 소스 작성

이제 작성할 소스파일의 경로는 다음과 같습니다. 참고해주세요

POM.XML을 다음과같이 설정해줍니다. plugin에는 maven으로 도커를 build할 수 있는 io.fabric8을 설정해두었습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>me.whiteship</groupId>
    <artifactId>springdockerdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springdockerdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.26.0</version>
                <configuration>
                    <images>
                        <image>
                            <name>hoon/springdockerdemo</name>

                            <build>
                                <dockerFileDir>${basedir}</dockerFileDir> <!-- 기본 경로가  src/main/docker 까지 잡혀있음 basedir 환경 변수를 쓰면 프로젝트의 기본 디렉토리를 쓰게됨-->
                                <filter>@</filter>
                            </build>
                        </image>
                    </images>
                </configuration>
                <executions>
                    <execution>
                        <id>docker-build</id>
                        <phase>package</phase> <!-- 패키징 한다음에 끼어들어가라 -->
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

SpringdockerdemoApplication 소스를 작성합니다. 기본포트로 "/"로 접속할 경우 "Hello Spring Boot"메시지가 보이게합니다.

package me.whiteship.springdockerdemo;

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 Spring Boot";
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringdockerdemoApplication.class, args);
    }

}

이제 마지막으로 Docker 이미지 파일을 만들기 위해서 Dockerfile을 작성합니다. src폴더 밑에 Dockerfile을 만들고 다음과같이 작성합니다. 여기서 docker file의 COPY target/springdockerdemo-0.0.1-SNAPSHOT.jar app.jar 명령어에 springdockerdemo-0.0.1-SNAPSHOT.jar와 pom.xml 의 artifactid와 version정보가 일치해야합니다.

#실행하기 위한 환경만 필요하기 때문에 jre, 개발까지면 jdk
FROM openjdk:8-jre

#컨테이너 안에 jar 파일은 app.jar 될꺼임
COPY target/springdockerdemo-0.0.1-SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

이제 우측 상단의 Run Application 버튼을 선택해 웹 어플리케이션을 실행해봅니다. 

그리고 웹브라우저에 localhost:8080을 입력하고 들어가면 다음과 같은 화면을 볼 수 있습니다.

3. Docker 컨테이너 실행

여기서 맥북유저이신분들은 인텔리제이 IDE의 터미널창에서 진행하시면되지만 저는 윈도우 사용자라 AWS의 EC2 리눅스 서버에 깃허브를 이용해서 소스를 옮기고 진행하고있습니다. 

 

먼저  도커가 없으신분들은 도커를 설치해주시기 바랍니다.

sudo curl -fsSL https://get.docker.com/ | sudo sh

도커 설치를 완료하고 다음과 같은 명령어를 통해 도커의 버전을 확인할 수 있습니다.

docker version

이제 maven을 통해 도커파일을 빌드해봅시다.

sudo mvn docker:build

도커 파일을 빌드한 후 다음 명령어를 이용해서 도커의 이미지를 볼 수 있는데, 새로운 이미지가 생성된것을 확인할 수 있습니다.

docker images

4. 도커 컨테이너 실행

이제 만들어진 도커 이미지를 실행시켜 서버에 컨테이너를 올려봅시다. d옵션을 주면 백그라운드에서 서버가 돌아가도록하는 옵션이고, p명령어를 통해 서버의 포트와 도커 컨테이너안의 포트를 맞춰줍니다. 

sudo docker run -d -p 8080:8080 hoon/springdockerdemo 

다음의 명령어를 통해 실행중인 컨테이너를 확인해 볼 수 있습니다.

docker ps

정상적으로 명령어가 실행되었다면 이제 웹브라우저에 다시 접속해봅니다. aws 서버의 ip에 8080포트로 접속하니까 다음과 같이 로컬에서 실행했을때와 동일한 결과가 나옵니다!

5. 도커허브 이미지 파일 업로드

이렇게 생성한 도커 이미지 파일은 도커허브라는곳에 올려놓고 필요할때 마다 가지고와서 컨테이너를 서버에 올릴 수 있습니다. 실행중인 컨테이너를 커밋해봅시다.

docker commit CONTAINER IMAGE_NAME

예를들면 다음과 같은 형태이겠죠

docker commit d3fb2418acc8 hoon/springdockerdemo

도커허브에 가입을 하지 않았다면 https://hub.docker.com/ 가입을 진행해주시면됩니다. 그리고 test라는 repository를 생성해보겠습니다.

가입 이후 login을 합니다.

docker login

 docker user id에 변수를 지정해둡니다.

export DOCKER_ID_USER="goohoon"

 이제 도커 이미지에 태그를 달아둡시다.

docker tag hoon/springdockerdemo $DOCKER_ID_USER/test

docker images명령어를 통해 새로운 이미지가 생성된것을 확인할 수 있습니다.

마지막으로 tag가 적용되고있는 이미지를 도커허브에 push합니다. 서버에 "goohoon/test" repository에 이미지가 올라가는 것을 확인할 수 있습니다.

docker push $DOCKER_ID_USER/test

 

다음 내용으로는 mysql을 어떻게 컨테이너로 실행시켜 웹어플리케이션과 연동을할지 공부를 해볼 생각입니다. 틀린점이 있다면 말씀해주세요.

REFERENCE

https://www.youtube.com/watch?v=agbpWm2Ho_I 

https://nicewoong.github.io/development/2018/03/06/docker-commit-container/