본문 바로가기
Docker

[Docker] docker image & container

by goblin- 2024. 10. 28.

스프링 프로젝트를 Docker로 다루고 관리하기 위해 필요한 이미지 생성, 빌드, Docker Hub 활용, Dockerfile 최적화와 Docker 컨테이너 관리 방법에 대해 설명하겠습니다.

 

3. Docker 이미지 다루기

 

Docker 이미지 생성과 빌드

 

스프링 프로젝트의 Docker 이미지를 생성하려면 Dockerfile을 사용하여 애플리케이션을 빌드하고 실행할 환경을 정의합니다.

 

1. Docker 이미지 생성:

Docker 이미지는 프로젝트 디렉터리에 작성된 Dockerfile을 바탕으로 생성됩니다.

예를 들어, 스프링 애플리케이션을 빌드한 .jar 파일을 Docker 이미지로 포함하려면, Dockerfile에 .jar 파일을 복사하고 Java 명령어로 실행하도록 설정해야 합니다.

2. 이미지 빌드 명령어:

Dockerfile이 작성된 디렉터리에서 다음 명령어를 사용해 이미지를 빌드합니다.

docker build -t my-spring-app .

-t 옵션을 통해 이미지에 이름과 태그를 지정할 수 있습니다.

 

Docker Hub와 이미지 검색

 

1. Docker Hub:

Docker Hub는 공용 Docker 이미지 저장소로, 이미 만들어진 다양한 이미지를 다운로드하고 사용할 수 있습니다. 예를 들어, openjdk, mysql, nginx와 같은 이미지를 Docker Hub에서 다운로드하여 스프링 프로젝트에 필요한 환경을 빠르게 설정할 수 있습니다.

2. 이미지 검색과 다운로드:

Docker Hub에서 이미지를 검색하려면 다음과 같은 명령어를 사용합니다.

docker search openjdk
docker pull openjdk:17-alpine  # 예시: Java 17을 포함한 가벼운 Alpine Linux 이미지 다운로드

 

Dockerfile 작성과 최적화

 

Dockerfile을 작성할 때 이미지 크기를 줄이고 빌드 속도를 빠르게 하기 위해 최적화가 필요합니다.

 

1. Multi-Stage Build 사용:

스프링 프로젝트의 경우, Multi-Stage Build를 사용하여 최종 .jar 파일만 포함된 가벼운 이미지를 생성할 수 있습니다. 이를 통해 빌드 도구나 소스 파일을 제외하여 최종 이미지의 크기를 줄일 수 있습니다.

# Stage 1: Build
FROM openjdk:17 AS build
WORKDIR /app
COPY . .
RUN ./gradlew build  # 프로젝트 빌드 실행

# Stage 2: Production
FROM openjdk:17-alpine
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

 

2. 캐시 최적화:

변경 가능성이 큰 부분(예: 애플리케이션 파일)은 Dockerfile의 하단에 배치하여 캐시를 최대한 활용할 수 있습니다.

자주 변하지 않는 종속성을 먼저 설치하도록 Dockerfile을 작성하면 캐싱이 더 효율적으로 이뤄집니다.

 

이미지 관리 (태깅, 삭제, 이미지 레이어 이해)

 

1. 이미지 태깅:

docker build -t my-spring-app:1.0 .처럼 태그를 통해 이미지의 버전을 관리할 수 있습니다.

2. 이미지 삭제:

불필요한 이미지는 docker rmi <이미지 ID>로 삭제하여 Docker 디스크 공간을 확보할 수 있습니다.

3. 이미지 레이어 이해:

Docker는 각 명령어마다 새로운 레이어를 생성하며, 이 레이어가 캐싱됩니다. 예를 들어 COPYRUN 명령어는 각각 하나의 레이어를 만듭니다.

레이어 캐싱 덕분에, 일부만 변경해도 모든 레이어를 다시 빌드할 필요 없이 변경된 레이어만 빌드합니다.

 

4. Docker 컨테이너 관리

 

스프링 프로젝트를 포함한 Docker 컨테이너는 생성, 실행, 중지, 삭제 작업을 통해 관리할 수 있습니다.

 

컨테이너 생성, 실행, 중지, 삭제

 

1. 컨테이너 생성 및 실행:

Docker 이미지를 기반으로 컨테이너를 생성하고 실행하려면 docker run 명령어를 사용합니다.

예: docker run -d -p 8080:8080 my-spring-app

2. 컨테이너 중지 및 삭제:

실행 중인 컨테이너는 docker stop <컨테이너 ID>로 중지하고, docker rm <컨테이너 ID>로 삭제할 수 있습니다.

 

docker run 옵션 (포트 매핑, 볼륨 마운트, 환경 변수 설정)

 

1. 포트 매핑 (-p):

컨테이너의 포트를 호스트(로컬) 포트와 연결해줍니다.

예: docker run -d -p 8080:8080 my-spring-app호스트의 8080 포트를 컨테이너의 8080 포트에 연결합니다.

2. 볼륨 마운트 (-v):

호스트 디렉터리를 컨테이너에 마운트하여, 데이터가 지속적으로 유지될 수 있도록 합니다.

예: docker run -v /host/data:/container/data my-spring-app

3. 환경 변수 설정 (–env 또는 -e):

-e 옵션을 사용해 애플리케이션 설정을 외부에서 주입할 수 있습니다.

예: docker run -e SPRING_PROFILES_ACTIVE=prod my-spring-app

 

컨테이너 상태 및 로그 확인

 

1. 컨테이너 상태 확인 (docker ps):

docker ps로 현재 실행 중인 컨테이너 목록을 확인할 수 있습니다. 모든 컨테이너를 확인하려면 docker ps -a를 사용합니다.

2. 로그 확인 (docker logs):

애플리케이션 로그를 확인하여 문제를 진단하거나 상태를 모니터링할 수 있습니다.

예: docker logs <컨테이너 ID>

 

컨테이너 네트워크 설정 (bridge, host, none)

 

1. Bridge 네트워크 (기본 설정):

기본적으로 Docker는 bridge 네트워크 모드를 사용하여 컨테이너를 분리된 가상 네트워크에 연결합니다.

컨테이너 간 통신을 허용하며, 컨테이너끼리 같은 네트워크에서 이름으로 접근할 수 있습니다.

예: docker run --network bridge my-spring-app

2. Host 네트워크:

컨테이너가 호스트와 네트워크 네임스페이스를 공유하며, 컨테이너 내부의 포트가 호스트의 포트와 동일하게 동작합니다. 포트 매핑 없이 호스트 네트워크를 사용할 수 있습니다.

예: docker run --network host my-spring-app

3. None 네트워크:

네트워크를 비활성화하여 외부와 완전히 격리된 상태로 컨테이너를 실행합니다.

예: docker run --network none my-spring-app

 

요약

 

Docker 이미지를 생성, 태깅, 삭제하고 필요한 최적화 작업을 수행할 수 있습니다.

컨테이너는 생성, 실행, 중지, 삭제할 수 있으며, 포트 매핑, 볼륨 마운트, 환경 변수를 통해 유연하게 설정할 수 있습니다.

Bridge, Host, None 네트워크 모드를 통해 컨테이너의 네트워크 설정을 조정할 수 있습니다.

 

이런 방식으로 Docker를 사용하면, 스프링 프로젝트를 일관된 환경에서 실행하고 관리할 수 있습니다.

'Docker' 카테고리의 다른 글

[Docker] Docker Compose  (0) 2024.10.28
[Docker] Docker를 이용한 Spring 프로젝트  (0) 2024.10.28
[Docker] docker 기본명령어  (4) 2024.10.28
[Docker] CI/CD  (0) 2024.10.28
[Docker] docker의 기초  (0) 2024.10.28