1. 개요

Spring Boot 애플리케이션을 Docker 이미지로 배포하는 방법을

maven 플러그인을 사용하는 법과 docker build 명령어를 사용하는 법으로 나누어 설명한다.

 

2. Maven 플러그인 사용

1) Dockerfile 작성

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD RestAPI-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

 

2) pom.xml 수정

  • spotify에서 제공하는 docker client 플러그인을 추가한다.
...
<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
    <imageName>devopsmgmt/rest-api</imageName>
    <dockerDirectory>src/main/docker</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>
...
  • imageName: 도커 이미지 이름을 기재함.
  • dockerDirectory: Dockerfile이 있는 위치를 기재함.

 

3. docker build 

1) maven 빌드

bash-4.2$ mvn clean package
 

2) Dockerfile 작성

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/RestAPI-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • jar 파일 위치를 Dockerfile 위치 기준으로 알맞게 지정해야 함.

 

3) docker 이미지 빌드 

bash-4.2$ docker build -t rest-api-test .
Sending build context to Docker daemon 44.51 MB
Step 1/4 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/4 : VOLUME /tmp
 ---> Using cache
 ---> f00f5d59ca15
Step 3/4 : ADD target/RestAPI-0.0.1-SNAPSHOT.jar app.jar
 ---> 2d94f3672a37
Removing intermediate container 6212bf6ebc44
Step 4/4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
 ---> Running in 0d339e37d49a
 ---> 2cd7d4dde0eb
Removing intermediate container 0d339e37d49a
Successfully built 2cd7d4dde0eb

 

4. 빌드 시 유의사항

root가 아닌 유저로 빌드할 경우, 다음과 같은 에러가 발생할 수 있다.

[maven 플러그인 사용할 경우]

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project RestAPI: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Permission denied -> [Help 1]
 
[docker build 명령 사용할 경우]
bash-4.2$ docker build -t rest-api-build .
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=rest-api-build&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied
 
해결을 위해서는 다음 두가지 방법을 참고한다.
 
1) 사용중인 유저를 docker 그룹에 추가
bash-4.2$ usermod -aG docker <user> 
bash-4.2$ systemctl restart docker
 
2) docker.sock의 권한 변경
bash-4.2$ cd /var/run
bash-4.2$ ls -al docker.sock
srw-rw----   1 root root              0 Jan 28 18:14 docker.sock
bash-4.2$ chmod 666 docker.sock
bash-4.2$ ls -al docker.sock
srw-rw-rw-   1 root root              0 Jan 28 18:14 docker.sock