AWS에 접속 가능한 상태이고, Spring 프로젝트가 이미 하나 이상의 RequestMapping이 실행 가능한 상태라고 가정한 상태라고 가정합니다. Docker Image로 Spring 배포하는 법을 알아봅시다.
이 글은 도커에 대한 설명이나 Spring에 대한 설명을 포함하고 있지 않습니다. 오로지 배포하는 법만 알려드립니다.
Spring boot 프로젝트의 Docker 배포에 대한 공식 사이트 가이드는 링크는 여기를 참고해주시면 됩니다.
Docker 설치
아래의 링크의 설명대로 OS에 맞게 Docker를 설치해줍니다.
- Windows: https://www.docker.com/products/docker-desktop
- Docker Desktop 설치시 호환 되도록 Windows 버전 업데이트를 해주시는 걸 추천드립니다.
- Mac: https://hub.docker.com/editions/community/docker-ce-desktop-mac?utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=header
- 그 외 Linux 기반 OS : https://hub.docker.com/search?offering=community&operating_system=linux&q=&type=edition
docker image 만들기
1. Spring boot project 만들고 jar file을 생성하기
start.spring.io 에서 Spring 프로젝트를 만들어 줍니다.
jar file을 생성해줍니다.
- Maven
$ mvn package
- Gradle
$ ./gradlew build
2. 도커 이미지 만들어 주기
프로젝트 최상단 디렉토리에 Dockerfile를 만들어줍니다. (build.gradle이나 pom.xml과 같은 디렉토리 내)
docker 명령어의 디폴트 옵션 중 Dockerfile를 읽어 명령을 실행하기 때문에 이름은 꼭 이름을 "Dockerfile"로 만들어주세요.
Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/**-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
배포할 Docker Image를 관리하기 위해서는 Docker hub에 아이디를 생성 해주셔야합니다. (생성 링크: create one)
command나 bash를 실행해 Dockerfile 가 있는 디렉토리로 가서 아래 명령어를 실행해줍니다.
편의상 image 이름을 demo로 사용하였습니다. Docker build의 공식 설명은 여기를 확인해주세요.
$ docker build -t [당신의 도커 아이디]/demo .
docker image를 배포해줍니다.
$ docker push [당신의 도커 아이디]/demo
Server Instance에서 도커 컨테이너 배포
let’s connect again to our ec2 instance: -> 자신의 서버 인스턴스로 접속해주세요.
$ ssh -i /path/my-key-pair.pem ec2-user@<EC2 ip address>
1. Install docker on Server Instance
해당 서버에 Docker를 설치해주세요. 아래 링크 참고
https://hub.docker.com/search?offering=community&operating_system=linux&q=&type=edition
EC2 docker installing example
# 1. update yum
[ec2-user ~]$ sudo yum update -y
# 2. Install Docker
[ec2-user ~]$ sudo yum install docker -y
# 3. Start the Docker Service
[ec2-user ~]$ sudo service docker start
# 4. Add the ec2-user to the docker group so you can execute Docker commands without using sudo.
[ec2-user ~]$ sudo usermod -a -G docker ec2-user
어플리케이션 테스트 하기
Now you can run your application like this:
[ec2-user ~]$ docker run -p 80:8080 <Your Docker Hub account>/demo
더 나아가보자!
Build tool을 사용하여 도커 이미지 만들기
Build a Docker Image with Gradle
You can build a tagged docker image with Gradle in one command:
./gradlew bootBuildImage --imageName=springio/gs-spring-boot-docker
Build a Docker Image with Maven
To get started quickly, you can run the Spring Boot image generator without even changing your pom.xml (remember that the Dockerfile, if it is still, there is ignored):
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=springio/gs-spring-boot-docker
Docker 기본 명령어
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81c723d22865 springio/gs-spring-boot-docker:latest "java -Djava.secur..." 34 seconds ago Up 33 seconds 0.0.0.0:8080->8080/tcp goofy_brown
docker stop goofy_brown
docker rm goofy_brown
Using Spring Profiles
프로필 기능 사용하기
"prod"
docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 80:8080 -t lsmman/demo
"dev"
docker run -e "SPRING_PROFILES_ACTIVE=dev" -p 80:8080 -t lsmman/demo
Reference
- https://spring.io/guides/gs/spring-boot-docker/
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.htmlhttps://jrakibi.medium.com/deploy-your-application-with-ec2-docker-spring-boot-using-aws-cli-cb9f81260d29
- https://jrakibi.medium.com/deploy-your-application-with-ec2-docker-spring-boot-using-aws-cli-cb9f81260d29