Docker를 알아본 이유

현재 저의 배포방식은 배포 서버는 AWS EC2 ( 가상환경은 AMI 2023 )를 사용하고 있고 DB는 AWS RDS를 사용하여 Spring Boot JAR파일로 배포하여 내장된 톰캣 서버째로 배포하고 있습니다. 

 

1. 이떄 갑자기 서버환경을 바꿔서 Ubuntu를 사용하거나, 다른 서버에서 서버를 돌린다고한다면 어떻게 해야할까요?

그렇다면, 서버에 다시 JAVA를 설치하고, GIT을 CLONE && PULL 한뒤 배포를 위한 deploy.sh 를 생성해야합니다.

서버 종류(Ubuntu, debian, CentOS ... 등등) 에 따라서 조금씩 언어나 환경이 다를 수 있습니다. 이때, 관련 소요가 많이 들 수 있습니다.

 

Docker를 사용한다면, 

Docker Hub에 Docker Image를 Push 하고, 단순히 해당 가상환경에( 저는 AWS EC2 AMI 2023 )에 Docker만 설치한뒤 Docker Hub에서 Image를 PULL받아온뒤 Docker RUN 을 하면 끝납니다. ( 물론, 사용할 Docker Image에는 그에 맞는 환경세팅을 해줘야합니다. )

 

어떻게 Docker를 사용함으로써 위의 예시처럼 간단해질까요?

Application의 종속성( 예로들면, JDK Verison )을 하나의 Container ( 일종의 컴퓨터 ) 로 패키징하기에 다른곳에서 실행해도 똑같은 Container에서 실행하는것이니 가능합니다. 그럼으로써, 개발자의 배포 관련한 공수가 줄어들 것 입니다. 

 

또한 지금은 해당 내용에 대해 알아보지는 않을 것이지만, 이후에 Kubernetes를 활용하여 여러개의 Docker Container Instance를 생성하고 Cluster 내에서 분산하여 실행함으로써 서비스의 안정성을 늘릴 수 있을 것 입니다. ( 해당 내용은 이후에 알아볼려고합니다. 일단은 정리해보았습니다. Docker와 Kubernetes를 거의 하나의 Set로 사용하여 분산시스템을 운용하는 경우가 많아보입니다. )

 

현재로써는 배포환경의 일관성을 위해 Docker를 활용하여 일관된 개발 환경 Setting을 제공한다고 이해하면 될 것 같습니다.

( Kubernetes를 활용하여 Docker Container들을 자동으로 컨트롤하여 서비스 운용에 대한 소요를 최소화하고 안정성을 높이기 위함이 궁극적으로 기업에서 사용하는 목표이지만, 이후에 다뤄볼려고 합니다. )

 

도커 사용해보기

도커 사용전 필요한 Settings

  • AWS EC2 AMI 2023 혹은 가상환경 Server
  • 기본적인 UNIX 명령어 사용법

1. 아래의 링크에 가서 도커를 설치합니다. 그리고 DockerHub를 이후에 사용하기 위해 회원가입까지 해야합니다. 

https://www.docker.com/

 

Docker: Accelerated, Containerized Application Development

Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

 

 

 

2. 도커가 설치되었다면 CMD 창에 들어가서 올바르게 설치되었는지 확인하기 위해

docker --version

docker version 확인

이렇게 되면 Local에 설치가 끝났습니다.

 

 

 

3. 가상환경에도 똑같이 Docker를 설치해줍니다.

저는 AMI 2023이기에 sudo yum 대신 sudo dnf를 사용하였습니다. (각자 환경에 맞게 사용하시기 바랍니다.)

sudo dnf install docker -y  // docker를 설치합니다.

docker  // docker가 잘설치되었는지 확인

sudo service docker start // docker 서비스를 시작해봅니다.

sudo usermod -aG docker ec2-user  // putty 시작 후 바로 접속할 수 있게 Setting합니다. 

docker images  // 인스턴스 재시작 후 images가 올바르게 나온다면 완성입니다.

이로써 EC2에 docker 설치는 완료되었습니다.

 

 

 

3. Spring Boot에  [\seminar-hub\Dockerfile] 을 생성합니다. ( seminar-hub는 제 프로젝트 이름입니다. 루트에 파일을 생성하시면 됩니다. )

FROM openjdk:17-jdk-slim   
ADD /build/libs/*.jar docker-seminar-hub-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/docker-seminar-hub-0.0.1-SNAPSHOT.jar"]

각 줄 순서에 맞는 주석입니다.

  • 본인의 컴퓨터 JDK 버전에 맞는 JDK를 설치합니다. ( JRE가 아닌 JDK이여야합니다, JRE는 Java 실행환경이고, JDK는 개발도구입니다.  )
  • ADD /build/libs.*.jar ~ : /buid/libs의 *.jar 인 확장자 파일을 Docker 이미지를 Build할떄 해당 JAR을 docker-seminar-hub-0.0.1-SNAPSHOT.jar 라는 이름으로 Docker 이미지 내에 추가합니다. 이로써 해당 JAR을 이미지 내에 가지게 됩니다. 
  • ENTRYPOINT [] :  JSON 배열 형태로 작성합니다. 
    • "JAVA" : Java 가상 머신을 실행시킵니다.
    • "-jar" : Java 애플리케이션을 실행할때 JAR 파일을 지정하는 옵션입니다.
    • "/docker-seminar-hub-0.0.1-SNAPSHOT.jar" : 실행할 JAR파일의 경롸 이름을 나타냅니다. Docker 컨테이너에서 사용될 JAR 파일입니다.
    • 위의 조건 외에도 본인이 원하는 조건을 넣으면 됩니다. 예시로 들면 Spring Profiles의 active 환경을 나타낼 수도 있습니다.

 

 

 

4. Spring Boot를 아래의 명령어로 빌드하여 snapshot을 만듭니다.(JAR을 생성)

./gradlew build

 

 

 

5. Docker Hub에 들어가서 1번에서 만들었던 Docker 아이디에 로그인합니다.

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

DockerHub는 저희가 저장할 Docker Image의 저장소입니다. 일종의 GitHub Repository 처럼 Docker Image Repository 라고 생각하시면 됩니다.

그리고 GitHub처럼 저장소를 생성하면 됩니다. 저는 Public으로 생성하였습니다.

 

 

 

5. Local로 돌아와서 Spring Boot Terminal에 DockerHub의 Repository 에 본인의 Docker Image를 넣어줍니다.

docker build -t 본인Docker계정/DockerRepository (도커허브아이디/dockerRepository)

docker images   // 올바르게 Image가 생성되었는지 확인합니다.

docker push 본인Docker계정/DockerRepository (도커허브아이디/dockerRepository)
  • dockerbuild를 통해 Docker Image를 생성합니다. 아까 생성한 DockerFile이 이떄 실행됩니다.
  • docker Push  명령어를 통해 우리가 Docker Hub에 생성한 Repository에 저장됩니다.

 

 

6. 이제 Local말고 가상환경에서 우리가 PUSH 한 DockerImage 를 저장소에서 Docker pull을 해옵니다.

sudo docker pull 본인Docker계정/DockerRepository

docker images

sudo docker run -d -p 8080:8080 본인Docker계정/DockerRepository
  • 가상환경에서 docker를 pull 해온뒤 docker images로 잘 pull 되었는지 확인합니다.
  • docker image 를 -d 옵션을 통해 백그라운드로 실행시킵니다.
  • 이떄 8080:8080 은 호스트와 컨테이너 간의 포트 매핑을 하기 위함입니다. ( 호스트의 포트 ) : ( 컨테이너 내의 애플리케이션이 실행되는 포트), 즉 호스트의 포트 8080 로 들어오는 요청은 컨테이너의 8080 포트로 전달되는 것입니다. 
    • 이떄 1234:8080 으로 할경우 호스트의 포트 1234 로 들어오면 컨테이너의 8080 으로 매핑해준다는 의미입니다.

 

 

 

7. 올바르게 되었다면 

(서버 DNS 혹은 IP) : 8080/ 
ex) aws.12.25.23123123123.com:8080/

위의 링크를 통해 접속할 수 있습니다.

 

 

 

더 추가해야할점들

이제 Docker Image를 Docker Hub에 올리고, 

가상서버에서 해당 Docker IMAGE를 PULL 한뒤 Docker Run을 통해 해당 JAR을 본인이 원하는 서버환경에서 사용할 수 있게 되었습니다.

이후에는 Jenkins를 활용하여 개발자가 PUSH를 하면 Docker Hub에 Docker Push를 하여 Docker Image를 넣고 EC2에서 해당 Docker를 PULL한뒤 자동으로 배포하는 과정까지 정리해보겠습니다.

 

+ Recent posts