TIL

9_2.Docker 이미지 생성 및 docker hub 실습

꿀승 2025. 2. 18. 22:09
728x90
반응형
SMALL

학습내용

  1. Docker 이미지
  2. Dockerfile
  3. Docker 이미지 최적화
  4. Docker 이미지 푸시
  5. Versioning 및 태그

학습정리

1. Docker 이미지

  • 도커 이미지는 실행 가능한 애플리케이션을 포함한 패키지

  • 컨테이너를 실행하는데 사용

  • 테이너는 Docker 이미지를 기반으로 실행되며, 이미지에는 애플리케이션 코드, 라이브러리, 의존성 등이 포함

  • Layer 기반 구조로 구성되며, 동일한 레이어를 공유하여 효율적인 스토리지 사용 가능

  • 주요 명령어

    # 현재 시스템에서 사용 가능한 모든 Docker 이미지 목록 확인
    $ docker images
    
    # 특정 이미지 다운로드
    $ docker pull <이미지 이름>
    
    # 이미지 정보 확인
    $ docker inspect <이미지 이름>
    
    # 이미지 삭제
    $ docker rmi <이미지 이름>
  • 불필요한 파일 줄이기

    • .dockerignore 사용
      • Docker 빌드 과정에서 제외 할 파일과 디렉토리를 지정하는 역할

2. Dockerfile

  • Dockerfile은 Docker 이미지를 빌드하는데 사용 되는 스크립트 파일

  • 작성예제

    # 1️⃣ OpenJDK 17 기반 이미지 사용
    FROM openjdk:17-jdk-slim
    
    # 2️⃣ 작업 디렉터리 설정
    WORKDIR /app
    
    # 3️⃣ JAR 파일을 컨테이너로 복사
    COPY target/my-app.jar app.jar
    
    # 4️⃣ 컨테이너 시작 시 실행할 명령어
    CMD ["java", "-jar", "app.jar"]
    
  • Dockerfile로 이미지 빌드 및 실행

    # 현재 디렉토리에서 Dockerfile을 기반으로 이미지 빌드 (-t 옵션: 태그 지정)
    docker build -t my-app .
    
    # 생성된 이미지 확인
    docker images
    
    # Docker 컨테이너 실행
    docker run -d -p 8080:8080 my-app

3. Docker 이미지 최적화

  • 최적화 방법

    1. 불필요한 레이어 최소화
    2. 다단계 빌드 (Multi-stage build) 활용
    3. 경량 이미지 사용(alpine, scratch 등)
  • Multi-stage Build

    • 불필요한 파일이나 도구를 포함하지 않도록 최종 이미지를 최소화 하는 기법

    • Java 예시

      # 1️⃣ 빌드 단계 (Maven을 사용한 Java 빌드)
      FROM maven:3.8.7-openjdk-17 AS build
      
      # 작업 디렉터리 설정
      WORKDIR /app
      
      # 소스 코드 및 pom.xml 파일 복사
      COPY . .
      
      # 의존성 다운로드 및 패키징 (JAR 생성)
      RUN mvn clean package -DskipTests
      
      # 2️⃣ 실행 단계 (JRE만 포함된 이미지로 실행)
      FROM openjdk:17-jdk-slim
      
      # 작업 디렉터리 설정
      WORKDIR /app
      
      # 빌드 단계에서 생성한 JAR 파일만 복사
      COPY --from=build /app/target/my-app.jar app.jar
      
      # 컨테이너 실행 시 실행할 명령어
      CMD ["java", "-jar", "app.jar"]
      
    • node 예시

      # 1️⃣ 빌드 단계 (Node.js 애플리케이션 빌드)
      FROM node:16 AS build
      
      # 작업 디렉터리 설정
      WORKDIR /app
      
      # 의존성 파일 복사
      COPY package.json package-lock.json ./
      
      # 의존성 설치
      RUN npm install
      
      # 애플리케이션 코드 복사
      COPY . .
      
      # 애플리케이션 빌드 (만약 빌드가 필요하다면)
      RUN npm run build
      
      # 2️⃣ 실행 단계 (최종 이미지)
      FROM node:16-slim
      
      # 작업 디렉터리 설정
      WORKDIR /app
      
      # 빌드 단계에서 설치된 의존성 복사
      COPY --from=build /app/node_modules /app/node_modules
      
      # 애플리케이션 파일 복사
      COPY --from=build /app/dist /app/dist
      
      # 애플리케이션 실행
      CMD ["node", "dist/app.js"]
      

4. Docker 이미지 푸시

  • Docker Hub 저장소에 이미지 푸시

    # docker hub login
    docker login
    
    docker push {저장소유저명}/my-app:1.0.0
    
    docker pull {저장소유저명}/my-app:1.0.0

5. Versioning 및 태그

  • Docker 이미지 버저닝

    • 버저닝 처리방법

      # 기존 이미지에서 새로운 태그로 버저닝 추가
      docker tag <기존_이미지> <새로운_태그>
      docker tag my-app my-app:1.0.0
      
      # 빌드시에 태그로 버저닝 추가
      docker build -t my-app:1.0.0 .
  • 시맨틱 버저닝(Semantic Versioning)

    • 주버전(Major), 부버전(Minor), 패치버전(Patch) 로 구성
    • Major.Minor.Patch 형식으로 버저닝
      버전 형식 설명
      1.0.0 초기 릴리즈 버전
      1.1.0 기능(feature) 추가 (하위 호환 유지)
      1.1.1 버그 수정 (패치 버전)
      2.0.0 기존 기능을 변경하거나 호환되지 않는 수정

이슈사항

  • docker-compose 명령어가 실행이 안되고 docker compose로만 작동하는 경우 해결방법
    sudo rm /usr/local/bin/docker-compose
    sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose /usr/local/bin/docker-compose
    https://docs.docker.com/compose/install/

참고자료

728x90
반응형
LIST