Programming/CI, CD

Docker - 초간단 Docker 사용법 (Spring, EC2)

잇(IT) 2023. 12. 14. 09:33
- Docker

 

Docker는 컨테이너 기반 가상화 기술을 사용하여 애플리케이션을 패키징하고 배포하는 오픈 소스 플랫폼이다.

Docker를 사용하면 코드를 컨테이너 이미지로 패키징하고, 이미지를 독립적으로 실행 할 수 있다.

Docker의 주요 특징은 1. 이식성 2. 빠른 배포 3. 확장성 4. 자동화 의 장점이 있다. 주요 특징을 가지고 소프트웨어 개발 및 배포 프로세스를 단순화하고, 애플리케이션의 이식성과 확장성을 향상시키는 데 도움이 된다.

 

https://www.docker.com/

 

Docker: Accelerated Container Application Development

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

www.docker.com

 

Docker를 사용하기 위해선 우선 docker을 환경에 맞게 설치해준다. (docker 설치 및 환경 설정에 대해서는 따로 찾아보길 바란다.)

 

jar 파일 생성

 

bootJar를 실행하게 되면

 

build/libs에 jar 파일이 생성된다. 해당 파일은 Java 애플리케이션을 실행하기 위한 파일이다.

 

Dockerfile 생성

 

FROM amazoncorretto:17

WORKDIR /app

COPY build/libs/review-0.0.1-SNAPSHOT.jar /app/review.jar
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh

ENTRYPOINT ["/app/entrypoint.sh"]

 

FROM  amazoncorretto:17 : 베이스 이미지를 지정하는 부분이다. amazoncorretto:17은 Java 17을 실행할 수 있는 환경을 제공한다.

WORKDIR /app : 이후 작성되는 명령어들이 /app 디렉토리 내에서 실행됨을 의미한다.

COPY build/libs/review-0.0.1-SNAPSHOT.jar /app/review.jar : bootJar를 통해 build된 JAR 파일을 Docker 컨테이너 내의 /app 디렉토리로 복사한다. 해당 JAR 파일은 Docker 컨테이너 내에서 실행될 Java 애플리케이션을 포함한다.

COPY entrypoint.sh /app/entrypoint.sh : 호스트 시스템에서 entrypoint.sh라는 스크립트 파일을 Docker 컨테이너 내의 /app 디렉토리로 복사한다. 이 스크립트는 컨테이너가 시작될 때 실행된다.

RUN chmod +x /app/entrypoint.sh : entrypoint.sh 스크립트 파일에 실행 권한을 부여한다. 스크립트 실행을 가능하게 만들어준다.

ENTRYPOINT ["/app/entrypoint.sh"] : 컨테이너가 시작될 때 실행될 명령을 정의한다. 여기서는 entrypoint.sh 스크립트를 실행하도록 설정되어 있다. 해당 스크립트는 Java 애플리케이션을 실행하는 등의 작업을 수행한다.

 

 

 

- docker build

docker build -t review-api ./

 

위 명령어를 통해 Docker 이미지를 생성한다.

 

docker images

 

위 명령어를 통해 현재 생성되어 있는 docker image들을 확인 할 수 있다.

 

docker run -it -p8080:8080 review-api

 

docker run : 도커 컨테이너를 실행하기 위한 명령어다.

-it : 터미널과 상호작용할 수 있는 셸을 제공한다. 즉, 터미널에서 실행하겠다는 의미를 가진다.

-p8080:8080 : 호스트와 컨테이너 간의 포트 매핑을 정의한다. 호스트의 8080포트와 컨테이너의 8080포트를 연결한다는 뜻이다. 즉, 컨테이너 내부의 애플리케이션은 호스트의 8080 포트를 통해 외부와 통신할 수 있게 된다.

review-api : 실행할 도커 이미지의 이름이나 ID를 작성한다.

 

- docker-compose.yml

version: "3.8"

services:
  review-api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:8080

 

위 코드는 Docker Compose를 사용하여 Docker 컨테이너를 관리하는 설정 파일이다.여러 컨테이너로 구성된 멀티 컨테이너 애플리케이션을 쉽게 관리하기 위한 도구다.

 

version: "3.8" : Docker Compose 파일의 버전을 지정한다.

services : Docker Compose에서 관리할 서비스(컨테이너)를 정의한다. 위 코드에선 review-api라는 서비스를 정의하고 있다.

review-api : 서비스의 이름이다.

build : 컨테이너를 빌드할 때 사용할 설정을 지정한다. context와 dockerfile을 사용하여 컨테이너를 어떻게 빌드할지를 설정할 수 있다.

context: . : Dockerfile 및 빌드에 필요한 파일이 있는 디렉토리를 현재 디렉토리(.)로 설정한다.

dockerfile: Dockerfile : 사용할 Dockerfile의 이름을 지정한다. 현재 디렉토리에 있는 Dockerfile을 사용하겠다는 것을 의미한다.

ports : 호스트와 컨테이너 간의 포트 매핑을 설정한다.

8080:8080 : 호스트의 포트 8080과 컨테이너의 포트 8080을 연결한다. 이렇게 설정하면 호스트의 8080 포트로 들어오는 요청이 컨테이너의 8080 포트로 전달된다.

 

docker-compose up --build

 

위 코드를 터미널에서 실행하면 마찬가지로 Docker에 의해 애플리케이션이 실행된다.

 

- docker run / docker-compose up

 

 1. docker run : 단일 컨테이너 실행하는데 사용된다. 컨테이너의 옵션과 설정을 지정해야 한다. 모든 설정을 수동으로 처리해야 한다. build와 실행이 별도의 단계로 나뉘어 있다.

 

2. docker-compose up : 멀티 컨테이너 애플리케이션 관리에 사용된다. Docker Compose 설정 파일에 정의된 모든 컨테이너를 시작하고 관리하는 데 사용된다. yml 파일에 정의하므로 설정을 파일에 저장하고 관리하기 쉽다. 또한 이미지의 빌드와 컨테이너 실행을 한 번에 처리한다.


AWS EC2에서 docker 사용

 

* AWS EC2가 생성되어 있다고 가정을 한다. 이미지는 amazon-linux를 사용한다.

 

# git, docker, jdk 설치
$ sudo yum install -y git docker java-17-amazon-corretto

# docker-compose 설치
$ sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

# 도커 실행
$ sudo systemctl start docker

# git clone
$ git clone 레포지토리

# 자바 애플리케이션 빌드
$ ./gradlew bootJar

# 서버 실행
$ sudo docker-compose up --build

# 서버 백그라운드 실행
$ sudo docker-compose up -d --build

 

위 코드들을 순서대로 진행하게 되면 이전에 Docker를 설치하고 빌드 후 docker를 실행하는 과정과 동일하다고 생각하면 된다.

728x90