- Docker
Docker는 컨테이너 기반 가상화 기술을 사용하여 애플리케이션을 패키징하고 배포하는 오픈 소스 플랫폼이다.
Docker를 사용하면 코드를 컨테이너 이미지로 패키징하고, 이미지를 독립적으로 실행 할 수 있다.
Docker의 주요 특징은 1. 이식성 2. 빠른 배포 3. 확장성 4. 자동화 의 장점이 있다. 주요 특징을 가지고 소프트웨어 개발 및 배포 프로세스를 단순화하고, 애플리케이션의 이식성과 확장성을 향상시키는 데 도움이 된다.
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를 실행하는 과정과 동일하다고 생각하면 된다.