본문 바로가기
SpringBoot

[Springboot+Docker+AWSLightsail]애플리케이션 배포하기

by devebucks 2020. 7. 25.
728x90

안녕하세요. 이번 글은 제가 너무나 해보고 싶었던 Springboot+Docker+AWS조합으로 애플리케이션을 배포하는 공부를 해보려고 합니다. 유튜브 영상을 통해서 따라서 구현을 해보았고, 궁금한 점들은 Docker 공식문서와 AWS LightSail 문서를 참고했습니다.

 

사실, Docker를 굳이 쓸 필요는 없었습니다. 하나의 서버에 여러 개의 애플리케이션을 실행하거나 관리하는 규모가 큰 애플리케이션이 아니기 때문입니다. 여기서는 공부해 보고 싶어서 사용해 보았습니다.

1. [IntelliJ] Springboot에 docker 배포 설정하기

pom.xml에서 <finalName>태그를 추가합니다. 이 태그에 추가한 이름이 Maven 패키징을 하고 떨어지는 jar파일의 이름이 됩니다.

<project>
	<build>
    	<dependencies></dependencies>
    	<plugins>
        	<plugin></plugin>
        </plugins>
	<finalName>spring-docker-app</finalName>
    </build>
</project>

 

Springboot Application pom.xml

 

2. [IntelliJ] Springboot Application Maven Build를 해줍니다.

intelliJ에서 Maven탭에서 Lifecycle 폴더 하위에 clean과 install을 선택하고, Maven Build버튼을 눌러줍니다.

 

IntelliJ오른쪽 Maven 탭

 

Maven Build가 성공하면 다음과 같은 로그가 뜹니다.

IntelliJ콘솔 빌드 성공 로그

프로젝트 경로에 target파일을 보면, pom.xml에 <finalName>으로 지정해 주었던, 이름의 jar파일이 보입니다.

 

IntelliJ프로젝트 계층에서 Target파일 계층

 

3. [IntelliJ]Springboot 프로젝트 밑에 Dockerfile파일을 생성하고 다음을 작성합니다.

Dockerfile을 애플리케이션 프로젝트 하위 경로에 만들어주는데, 개념은 다음과 같습니다.

Docker 문서 발취.

도커 문서를 보면, Dockerfile텍스트 파일에 대한 설명이 나옵니다. Dockerfile은 Dockerfile에 쓰여 있는 명령어를 순서대로 모두 실행해서 자동으로 images를 배포하는 명령어만을 적어놓은 텍스트 파일입니다.

프로젝트 바로 밑에 경로에 Dockerfile을 생성

 

Dockerfile에 다음을 입력합니다.

FROM openjdk:11       					//배포 jdk버전
ADD target/spring-docker-app.jar spring-docker-app.jar  //타겟 패키지jar 지정
EXPOSE 8085           					//접근 포트
EXTRYPOINT ["java", "-jar", "spring-docker-app.jar"]    //docker 이미지가 컨테이너 올라갈 때, 어플리케이션 실행 명령어

명령어의 설명은 다음과 같습니다.

- openjdk11 환경의 layer를 만듭니다.
- 만들어진 layer를 target/spring-docker-app.jar를 spring-docker-app.jar로 추가합니다.
- containers에 접근하는 포트를 설정합니다.
- 마지막으로, java -jar spring-docker-app.jar명령어를 실행하면서, docker images인 Maven Build 애플리케이션 패키지인 jar를 실행합니다.

 

4. [Local_Terminal] 로컬 PC에 Docker 설치하기

Docker 설치

Docker 3분 만에 기본 개념 끝내기

 

5. [Local_Terminal] Docker 명령어 입력

로컬 터미널에서 애플리케이션 패키징 jar파일을 Dockerfile을 참조해서 Docker images로 빌드하는 명령어를 입력합니다.

docker build -f Dockerfile -t 도커허브닉네임/스프링부트<finalName> .
//ex) docker build -f Dockerfile -t dockerNickName/Spring-docker-app .

명령어가 정상적으로 성공하면 다음과 같습니다.

 

docker images 명령어로 빌드된 이미지 목록을 확인할 수 있습니다.

로컬 터미널에서 docker images

이제 빌드한 이미지를 Docker hub로 push 해보겠습니다.

 

6. [docker hub] 회원 가입하고, Repository를 생성해줍니다.

dockerhub에 접속하고, 로그인도 해줍니다. 

그리고 repository를 신규로 생성합니다.

dockerhub repository 페이지입니다. 현재 repository에는 tag가 존재하지 않습니다.

 

7. [Local_Terminal] 터미널에 로그인을 해줍니다.

docker login

 

8. [Local_Terminal] Docker hub로 push 해 줍니다.

로컬 터미널에서 다음 명령어로 로컬에 있는 애플리케이션 Maven build 패키징 jar파일을 DockerHub의 Repository로 push 해줍니다.

docker push 도커허브유저이름/프로젝트이름

 

9. [AWS_LightSail] AWS LightSail 시작하기

클라우드 서버인 LightSail에는 Docker hub에 있는 빌드된 images를 실행만 하게 됩니다.

AWS에 LightSail 인스턴스를 생성합니다. 

 

 

iterm2(터미널) 들어가서, AWS LightSail에 ssh로 접속하기 위해서 다음 명령어 입력합니다.

ssh ec2-user@ip -i pem경로/이름.pem -o StrictHostKeyChecking=no

 

10. [AWS_LightSail] LightSail에 Docker를 설치합니다.

AWS LightSail에 Docker 설치하기

 

Amazon ECS의 Docker 기본 사항 - Amazon Elastic Container Service

경우에 따라서는 ec2-user가 도커 데몬에 액세스할 수 있는 권한을 제공하기 위해 인스턴스를 재부팅해야 할 수도 있습니다. 다음 오류가 표시될 경우 인스턴스를 재부팅해 보십시오. Cannot connect t

docs.aws.amazon.com

1. sudo yum update -y

업데이트 성공 화면

2. 최신 Docker Community Edition 패키지를 설치합니다.
$ sudo amazon-linux-extras install docker

설치 완료 화면
jdk와 postgresql이 사용가능 상태로 표기됩니다.

3. docker를 실행시킵니다. 
$ sudo service docker start
4. sudo를 사용하지 않고 명령어를 입력할 수 있게, user를 등록합니다.
$ sudo usermod -a -G docker ec2-user

5. ssh 터미널 창을 껏다가 다시 ssh 터미널 창을 키시면 sudo 명령어 없이도 docker 명령어를 제한없이 사용할 수 있게 되었습니다.

6. 다음 명령어로 도커가 실행 중인 컨테이너를 확인합니다. 
$ docker ps

 

 

11. [AWS_LightSail] Docker Container를 실행시킵니다.

Dockerhub에 빌드된 이미지를 AWS LightSail의 Docker로 실행해 줍니다.

docker run -d -p 80:8085 도커허브닉네임/spring-docker-app:latest

 

 

 

 

 

에러가 발생했습니다.

에러 내용.

error during connect: Post http://docker:2375/v1.39/auth: dial tcp: lookup docker on x.x.x.x:53: no such host

에러 원인.

Docker hub에서 로그인을 안 해서 그랬습니다. 

 

에러 해결방법

docker login으로 docker hub계정으로 로컬 터미널에서 로그인하고, push 명령어를 진행하면 됩니다.

 

 

 

 

감사합니다.

 

... 끗

 

728x90

댓글