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