Docker 에서 Java EE 앱 시작 명령어 구성 방법

DockerBeginner
지금 연습하기

소개

Docker 는 Java EE(Enterprise Edition) 애플리케이션을 포함한 애플리케이션 개발, 패키징 및 배포 방식을 혁신했습니다. 이 튜토리얼에서는 Docker 컨테이너 내에서 실행되는 Java EE 애플리케이션의 시작 명령어를 구성하는 과정을 안내하여 웹 애플리케이션의 원활한 배포 및 실행을 보장합니다.

Docker 컨테이너 소개

Docker 는 개발자가 일관되고 재현 가능한 방식으로 애플리케이션을 패키징하고 배포할 수 있도록 지원하는 인기 있는 컨테이너화 플랫폼입니다. 컨테이너는 애플리케이션, 종속성 및 필요한 런타임 환경을 캡슐화하는 경량, 독립적, 그리고 자체 포함된 단위입니다.

Docker 컨테이너란 무엇인가요?

Docker 컨테이너는 애플리케이션 코드, 종속성 및 구성을 단일, 휴대 가능하고 실행 가능한 패키지로 패키징하는 표준화된 소프트웨어 단위입니다. 컨테이너는 호스트 운영 체제 및 다른 컨테이너와 격리되어 일관되고 안정적인 애플리케이션 배포를 보장합니다.

Docker 컨테이너 사용의 이점

  • 일관된 환경: 컨테이너는 애플리케이션과 종속성이 함께 패키징되어 "내 컴퓨터에서는 작동하는데" 문제를 해결합니다.
  • 확장성 및 유연성: 컨테이너는 쉽게 확장하거나 축소할 수 있어 효율적인 리소스 활용 및 빠른 애플리케이션 배포를 가능하게 합니다.
  • 이식성: 컨테이너화된 애플리케이션은 기본 인프라에 관계없이 Docker 를 지원하는 모든 시스템에서 실행될 수 있습니다.
  • 개선된 효율성: 컨테이너는 경량이며 호스트 운영 체제의 커널을 공유하여 더 빠른 시작 시간과 감소된 리소스 소비를 가져옵니다.

Docker 아키텍처

Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 관리하는 역할을 합니다.

graph LD
    subgraph Docker Architecture
        client([Docker Client])
        daemon([Docker Daemon])
        client -- API --> daemon
        daemon -- Images/Containers --> storage([Docker Storage])
    end

Docker 설치 및 구성

Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 설치 과정은 운영 체제에 따라 다릅니다. 이 튜토리얼에서는 Ubuntu 22.04 를 예시로 사용합니다.

## Ubuntu 22.04에서 Docker 설치
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

Docker 설치가 완료되면 다음 명령어를 실행하여 설치를 확인할 수 있습니다.

docker version

이 명령어는 Docker 클라이언트와 데몬의 버전 정보를 표시합니다.

Java EE 애플리케이션의 시작 명령어 구성

Docker 컨테이너에서 Java EE 애플리케이션을 실행할 때는 애플리케이션이 컨테이너 내에서 제대로 시작 및 관리되도록 시작 명령어를 구성해야 합니다.

시작 명령어 이해

Docker 컨테이너에서 Java EE 애플리케이션의 시작 명령어는 일반적으로 Dockerfile 의 CMD 또는 ENTRYPOINT 지시문을 사용하여 정의합니다. CMD 지시문은 컨테이너가 시작될 때 실행될 기본 명령어를 지정하고, ENTRYPOINT 지시문은 컨테이너의 기본 명령어를 설정합니다.

다음은 Java EE 애플리케이션의 시작 명령어를 설정하는 Dockerfile 의 예입니다.

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-jar", "my-java-ee-app.war"]

이 예제에서 CMD 지시문은 java -jar my-java-ee-app.war 명령어를 실행하여 Java EE 애플리케이션을 시작하도록 지정합니다.

시작 명령어 사용자 지정

일부 경우 Java EE 애플리케이션의 시작 명령어를 사용자 지정해야 할 수 있습니다. 이는 Dockerfile 의 CMD 또는 ENTRYPOINT 지시문을 수정하여 수행할 수 있습니다.

예를 들어, Java EE 애플리케이션에 추가적인 명령줄 인수 또는 환경 변수가 필요한 경우 CMD 지시문을 다음과 같이 수정할 수 있습니다.

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-Xmx512m", "-Dmy.app.env=production", "-jar", "my-java-ee-app.war"]

이 예제에서 CMD 지시문에는 컨테이너가 시작될 때 Java 명령어에 전달되는 추가 JVM 옵션 (-Xmx512m) 과 사용자 지정 환경 변수 (-Dmy.app.env=production) 가 포함되어 있습니다.

시작 명령어 재정의

docker run 명령어를 사용하여 Docker 컨테이너를 실행할 때 시작 명령어를 재정의할 수도 있습니다. 이는 컨테이너 내에서 다른 명령어 또는 스크립트를 실행해야 하거나 애플리케이션에 추가적인 인수를 전달해야 하는 경우 유용합니다.

docker run -d -p 8080:8080 my-java-ee-app-image java -jar /app/my-java-ee-app.war --spring.profiles.active=dev

이 예제에서 docker run 명령어는 Dockerfile 에 정의된 시작 명령어를 재정의하고 특정 Spring 프로파일 (--spring.profiles.active=dev) 을 사용하여 Java EE 애플리케이션을 실행합니다.

Docker 에서 Java EE 앱 배포

Java EE 애플리케이션의 시작 명령어를 구성한 후 Docker 이미지를 빌드하고 배포할 수 있습니다.

Docker 이미지 빌드

Java EE 애플리케이션의 Docker 이미지를 빌드하려면 docker build 명령어를 사용할 수 있습니다. 현재 디렉터리에 Dockerfile 이 있다고 가정하면 다음 명령어를 실행할 수 있습니다.

docker build -t my-java-ee-app .

이렇게 하면 Dockerfile 의 지침에 따라 태그가 my-java-ee-app인 새로운 Docker 이미지가 생성됩니다.

Docker 컨테이너 실행

Docker 이미지를 빌드한 후 docker run 명령어를 사용하여 Docker 컨테이너에서 Java EE 애플리케이션을 실행할 수 있습니다.

docker run -d -p 8080:8080 my-java-ee-app

이 명령어는 my-java-ee-app 이미지를 기반으로 새로운 컨테이너를 시작하고 호스트의 포트 8080 을 컨테이너의 포트 8080 으로 매핑합니다.

배포 확인

Docker 컨테이너에서 Java EE 애플리케이션이 제대로 실행되고 있는지 확인하려면 다음 명령어를 사용할 수 있습니다.

## 실행 중인 컨테이너 목록

## 실행 중인 컨테이너의 로그 보기

## 웹 브라우저에서 애플리케이션 접근

docker ps 명령어는 Java EE 애플리케이션을 포함한 모든 실행 중인 컨테이너를 나열합니다. 그런 다음 docker logs 명령어를 사용하여 애플리케이션 로그를 보고 올바르게 시작되었는지 확인할 수 있습니다.

마지막으로 웹 브라우저에서 http://localhost:8080으로 이동하여 실행 중인 애플리케이션에 접근할 수 있습니다.

애플리케이션 확장

Docker 에서 Java EE 애플리케이션을 실행하는 주요 이점 중 하나는 애플리케이션을 쉽게 확장할 수 있다는 것입니다. 증가하는 트래픽이나 부하를 처리하기 위해 Docker 컨테이너의 여러 인스턴스를 실행할 수 있습니다.

애플리케이션을 확장하려면 Docker Compose 또는 Kubernetes 와 같은 컨테이너 오케스트레이션 플랫폼을 사용할 수 있습니다. 이러한 도구를 사용하면 원하는 수의 컨테이너 인스턴스를 정의하고 애플리케이션의 배포 및 확장을 자동으로 관리할 수 있습니다.

다음은 Java EE 애플리케이션의 확장 가능한 배포를 정의하는 Docker Compose 파일의 예입니다.

version: "3"
services:
  app:
    image: my-java-ee-app
    ports:
      - 8080:8080
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        order: rolling-update

이 예제에서 deploy 섹션은 애플리케이션을 3 개의 복제본으로 배포하고 롤링 업데이트 전략을 사용하여 업데이트를 수행하도록 지정합니다.

요약

이 튜토리얼에 설명된 단계들을 따르면, Docker 컨테이너에서 실행되는 Java EE 애플리케이션의 시작 명령어를 올바르게 구성하는 방법을 배우게 됩니다. 이 지식은 Docker 컨테이너의 강력함과 유연성을 활용하여 웹 애플리케이션의 원활한 배포 및 실행을 보장하는 데 도움이 될 것입니다.