💡도커 이미지
- 도커 이미지(컨테이너 이미지)는 앱을 실행시키기 위한 환경 설정부터 각종 파일까지 앱을 위한 모든 구성 요소를 하나로 패키징 한 파일이다
- 도커 이미지를 실행시켜서 컨테이너를 만든다
| 도커 이미지의 구조 (Layer 기반)
- 도커 이미지는 레이어(layer) 라는 개념으로 구성되어 있다
- 이미지가 변경될 때마다 새로운 레이어가 추가된다
- 이 레이어는 캐시로 재사용 가능해서 빌드 속도가 빠르다
예)
FROM ubuntu:20.04 # 베이스 레이어
RUN apt install curl # 새로운 명령 = 새로운 레이어
COPY . /app # 또 다른 레이어
| 도커 이미지는 아래와 같은 원리로 만들어진다
1. 가장 기본이 되는 빈 도커 이미지를 가져온다 (아무 프로그램도 설치되어 있지 않은 리눅스라고 보면 쉽다)
2. 여기에 앱 실행에 필요한 여러 라이브러리를 설치하고 앱 실행 파일을 복사해서 넣는다
3. 컨테이너가 실행되는 순간 실행될 명령어를 지정한다.
⚠️ 도커 설치 필요
2025.04.17 - [IT/Cloud & DevOps] - 도커 사용해보기
도커 사용해보기
🔶 도커 설치하기 2025.04.12 - [IT/Cloud & DevOps] - Windows 11 Home 에서 Docker 설치 Windows 11 Home 에서 Docker 설치🔶 Docker란 ?- 어플리케이션을 개발, 배포 및 실행하기 위한 플랫폼 및 도구 모음이다- 애플리
iamsh.tistory.com
🔶 간단한 Spring 프로젝트로 도커이미지 만들어보기
✅ spring initializr 검색, 접속
✅ 프로젝트 설정 후, GENERATE 클릭 후 다운로드 받기
✅ IntelliJ '커뮤니티 에디션' 다운로드, 설치하기 (무료)
✅ IntelliJ 실행 후 Spring Initializr로 생성한 프로젝트를 오픈한다.
✅ IntelliJ 상단 메뉴의 Settings에서 'Build, Execution, Deployment' 클릭
- 프로젝트 빌드를 위해 자바 설치와 환경 설정이 필요
- 자바 17 버전 설정 및 스프링 프로젝트 실행
- Gradle 메뉴에서 Gradle JVM을 자바 17 버전으로 세팅한다.
- 없으면 JDK 다운로드를 통해 자바 17 버전을 선택하고 다운로드 버튼을 클릭한다.
- Apply와 OK 버튼을 눌러 적용한다.
✅ 파일 메뉴에서 프로젝트 스트럭처를 선택하고, SDK를 17로 변경한 후 Apply와 OK 버튼을 클릭한다.
✅ 코끼리 모양 아이콘을 눌러 그래들 프로젝트를 새로 고친 후 프로젝트를 빌드한다.
✅ src > main > java 경로의 애플리케이션 파일을 열고 재생 버튼을 눌러 스프링 프로젝트를 실행한다. #️⃣1️⃣
=> 스프링 부트 프로젝트는 기본적으로 8080 포트로 열리며, 로컬호스트 8080에 접속했을 때 에러 페이지가 나올 수 있다
✅ 스프링 프로젝트의 도커 이미지 생성을 위해 자바 클래스를 작성한다.
| src > main > java > com.example.demo > HelloController.java
✅ HelloController.java 작성 후, #️⃣1️⃣처럼 스프링 프로젝트를 실행하고, localhost:8080 에 접속하면 아래와 같이 나온다.
✅ 스프링 애플리케이션이 정상적으로 실행되는 것을 확인한 후
=> 프로젝트는 정지
=> 도커 이미지를 생성하기 위해 jar 파일을 생성한다.
| build.gradle 파일에 booJar{...} 빌드 옵션 추가
| 우측 코끼리 아이콘 클릭 => 'Execute Gradle Task' 클릭
| gradle build 클릭
| 프로젝트 내 빌드 폴더의 libs 폴더에 빌드된 jar 파일이 저장된다.
✅ jar 파일을 복사하여 새로운 프로젝트 폴더에 저장한 후, 도커 파일을 생성한다.
- 파일 이름을 짧게 변경함 (demo.jar) (그냥 길어서)
✅ 도커 파일을 통해 jar 파일 실행 명령어를 작성한다.
FROM ubuntu:24.04
- Ubuntu 24.04 버전의 리눅스 환경을 만들어준다
- 베이스 이미지로 Ubuntu 24.04 버전을 사용한다
- 새로운 이미지를 만들 때는 특정 이미지를 바탕으로 만들게 되는데, 이런 이미지를 ‘베이스 이미지’라고 한다
RUN apt-get update && apt-get install -y openjdk-17-jdk
- 기본 리눅스 이미지에는 아무것도 설치되지 않아서, 직접 자바를 설치해야 한다.
- 'apt-get update' : 우분투에서 패키지 목록을 최신으로 갱신하는 명령어 / 패키지를 설치하기 전에 최신 버전 목록을 받아야 에러 없이 설치 가능하다
- 'apt-get install -y openjdk-17-jdk' : openjdk-17-jdk를 설치하는 명령어
- '-y' : "yes to all"이라는 뜻으로, 설치 중 사용자 입력 없이 자동으로 '예'를 선택하도록 해준다
WORKDIR /app
COPY ./demo.jar ./app.jar
- 'WORKDIR' : 컨테이너 안에서 작업할 폴더를 지정한다. (없으면 자동생성)
- 'COPY' : 호스트 머신의 파일을 컨테이너 내부 경로로 복사한다
- 컨테이너 안에서는 지정된 디렉토리 밑에서 명령어가 실행된다.
CMD ["java", "-jar", "app.jar"]
- 컨테이너가 실행될 때 기본으로 수행할 명령어 지정
- 명령어는 배열 형태로 설정하며, 배열의 각 항목은 한 칸 띄워 배열에 넣어야 한다.
=> 컨테이너가 실행되면 java -jar app.jar 명령이 자동으로 실행돼서 자바 애플리케이션이 실행된다
EXPOSE 8080
- 컨테이너 내부의 8080 포트에서 웹서버가 열림을 알림을 명시. (안적어도 되지만, 공유받을 사람을 위해 명시해주는 것)
✅ 도커 컨테이너 실행
docker build -t spring-demo-image .
- 현재 디렉토리에 있는 Dockerfile을 바탕으로 새로운 도커 이미지를 생성한다
- '-t' : 생성할 이미지에 태그(tag, 이름)를 붙이는 옵션
- '.' : 현재 디렉토리의 Dockerfile을 기준으로 빌드해라 (보통 Dockerfile은 프로젝트 루트 폴더에 있다)
✅ 생성한 도커 이미지를 실행
docker run -p 8001:8080 spring_demo_image
| 브라우저에서 `8001` 포트로 접속하여 스프링 프로젝트 실행 확인.
명령어 | 설명 | 예시 |
FROM | 베이스 이미지 설정 | FROM openjdk:17 |
LABEL | 이미지에 메타데이터 추가 (작성자, 설명 등) | LABEL maintainer="lee@dev.com" |
ENV | 환경 변수 설정 | ENV SPRING_PROFILES_ACTIVE=prod |
WORKDIR | 작업 디렉토리 설정 (해당 경로로 이동함) | WORKDIR /app |
COPY | 파일/디렉토리를 이미지에 복사 | COPY target/app.jar /app/app.jar |
ADD | COPY와 유사하지만, 압축파일 자동 해제 및 URL 지원 | ADD https://example.com/app.tar.gz /app/ |
RUN | 이미지 빌드 중 실행할 쉘 명령어 | RUN apt-get update && apt-get install -y curl |
CMD | 컨테이너 시작 시 기본으로 실행될 명령 | CMD ["java", "-jar", "app.jar"] |
ENTRYPOINT | CMD와 유사하지만, 기본 실행명령 고정 | ENTRYPOINT ["java", "-jar", "app.jar"] |
EXPOSE | 컨테이너에서 사용하는 포트 번호 명시 (실제 포트 개방 X) | EXPOSE 8080 |
VOLUME | 컨테이너 외부와 연결할 볼륨 마운트 지점 설정 | VOLUME ["/data"] |
ARG | 빌드 시점에만 사용하는 변수 선언 | ARG JAR_FILE=app.jar |
USER | 실행할 사용자 설정 (보안 목적) | USER appuser |
HEALTHCHECK | 컨테이너 상태를 체크하는 명령 | `HEALTHCHECK CMD curl --fail http://localhost:8080 |
SHELL | 기본 쉘을 변경 (sh → bash 등) | SHELL ["/bin/bash", "-c"] |
- ENV : 도커 이미지가 실행되는 동안 환경 변수를 설정할 때 사용된다.
이미지가 컨테이너로 만들어져 실행될 때도 해당 환경 변수가 유지된다.
- ARG : 도커 이미지를 빌드하는 과정에만 적용되는 환경 변수를 설정할 때 사용된다.
그러므로 빌드 시점에만 해당 변수가 필요할 때 사용한다.
=> 특정 환경 변수를 컨테이너 빌드 과정에서는 사용하지 않으나, 실행 중일 때 적용하고 싶다면, env 명령어를 도커 파일의 맨 아래에 두어야 한다.
'IT > Cloud & DevOps' 카테고리의 다른 글
컨테이너 레지스트리란? GCP Artifact Registry 로 실습해보기 (0) | 2025.04.20 |
---|---|
클라우드 환경에서 쿠버네티스 클러스터 만들기 (0) | 2025.04.19 |
도커 사용해보기 (0) | 2025.04.17 |
컨테이너 (0) | 2025.04.17 |
Kubernetes 쿠버네티스 (0) | 2025.04.15 |