IT/Cloud & DevOps

도커 이미지 만들어 보기

iamhyeon 2025. 4. 19. 19:09

💡도커 이미지


- 도커 이미지(컨테이너 이미지)는 앱을 실행시키기 위한 환경 설정부터 각종 파일까지 앱을 위한 모든 구성 요소를 하나로 패키징 한 파일이다 
- 도커 이미지를 실행시켜서 컨테이너를 만든다 

 

|  도커 이미지의 구조 (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 검색, 접속

https://start.spring.io/

 

 

✅ 프로젝트 설정 후, 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` 포트로 접속하여 스프링 프로젝트 실행 확인.


💡 Dockerfile 주요 명령어

명령어 설명 예시 
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 명령어를 도커 파일의 맨 아래에 두어야 한다.