ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker (3) - 이미지 빌드
    Infra/Docker 2024. 1. 24. 23:14

     

     

    1. 이미지와 레이어 

     

    - 도커 이미지는 저장소 공간을 효율적으로 사용하기 위해 레이어드 파일 시스템을 채택

    - 레이어드 구조가 재사용에 유리하다. 저장 및 전송에서 스토리지와 네트워크 사용량을 절약할 수 있다.

    - 또한 변경사항에 있어서 재활용이 유리하다. 동일한 부분은 하나로 공유하고 다른 부분만 가지고 있으면 된다.

     

    출처: 쉬운도커(데브위키) -인프런

     

    - 두개의 이미지이지만, html파일을 수정한 것 외에는 모두 동일하다면, 나머지 설정은 공유되고, 변경사항만 기록한다.

    - 이미지에 한번 저장된 레이어는 변경 불가하다 -> 변경시 새로운 레이어가 생긴다.

     

     

    2. 이미지 레이어와 컨테이너 레이어 

     

    출처: 쉬운도커(데브위키) -인프런

     

    - 컨테이너 실행 중 발생하는 모든 변경 사항컨테이너 레이어에 생긴다.

    - 컨테이너 레이어는 이미지 레이어에 영향을 주지 않는다. 컨테이너별로 가지고 있는 변경사항이다.

    - 즉, 컨테이너를 레이어의 변경사항은 공유되지 않으며. 컨테이너 삭제시 함께 날아간다.

     

    출처: 쉬운도커(데브위키) -인프런

     

    - 이미지 변경시 발생하는 레이어는 위와 같이 해쉬값을 공유한다.

     

    *이미지 레이어와 관련된 용어 (참고)

     

    Layering: 각 레이어는 이전 레이어 위에 쌓이며, 여러 이미지간 공유, 레이어 방식은 중복 데이터 최소화, 빌드 속도 높이며, 저장소를 효율적으로 사용할 수 있게 해준다.

    Copy-on-Write(CoW)전략: 컨테이너 레이어에서 이전 레이어 특정 파일 수정시, 해당 파일의 복사본을 만들어서 변경사항을 적용, 이를 통해 원래 레이어는 수정되지 않고, 그대로 유지 

    immutable Layers(불변레이어) : 이미지의 각 레이어는 불변으로, 한 번 생성시 변경 x 이를 통해 이미지의 일관성 유지 

    여러 컨테이너에서 안전하게 공유 

    Caching : 레이어를 캐시하여 이미 빌드된 레이어를 재사용할 수 있다. 이미지 빌드 시간을 크게 줄여준다.

     

    3. 이미지를 만드는 방법

     

    3.1 커밋

     

    현재 컨테이너의 상태를 이미지로 저장 

    출처: 쉬운도커(데브위키) -인프런

    docker commit -m 커밋명 실행중인컨테이너명 생성할이미지명
    
    docker commit -m "edited index" -c 'CMD ["nginx","-g","daemon off"]' mynginx (개인레지스트리)/commitnginx
    
    //이미지 레지스트리에 저장
    docker push (개인레지스트리명)/commitnginx

     

    3.2 빌드

     

    - Dockerfile을 통해 이미지 저장 

    - IaC(Infrastructure as Code): 인프라 상태를 코드로 보관하는 방식

    - 사람이 하나하나 변경사항을 만들고, 이를 이미지로 commit하는 방식은 실수 유발 가능성이 크다

    - IaC방식은 코드에 상세 작업내용이 기재됨 -> 프로그램이 코드를 읽어서 인프라를 관리 

      인프라 구축을 위한 소스코드만 공유하면 동일한 인프라 쉽게 구축할 수 있고, 버전관리도 쉽다.

    - Dockerfile은 이러한 IaC방식으로 이미지를 관리하는 방법이다.

     

    //도커 파일을 통해 이미지 빌드
    docker build -t 이미지명 Dockerfile경로
    
    //도커파일명이 Dockerfile이 아닌 경우 
    docker build -f 도커파일명 -t 이미지명 Dockerfile경로

     

    FROM 베이스 이미지 //보통 파일 시스템이 있는 이미지가 베이스다
    
    COPY 파일경로 복사할경로 //파일을 레이어에 복사 
    
    CMD ["명령어"] //이미지 메타데이터로 컨테이너 실행 시 명령어 지정
    
    RUN 이미지를 빌드하는 과정에서 사용할 CMD명령어 (새로운 레이어에 추가됨)
    
    WORKDIR 작업 디렉토리 지정 -> 다음 명령어들이 실행될 디렉토리 지정 
            WORKDIR다음에 나오는 지시어들은 WORKDIR을 기준으로 명령어 실행 
            cmd의 cd명령어와 같다. (새로운 레이어에 추가)
            
    USER 명령어를 실행할 사용자 (su)(새로운 레이어에 추가)
    
    EXPOSE 포트번호지시(컨테이너가 사용할 포트번호)
    
    ARG 변수명 변수값 : 이미지 빌드 시점의 환경 변수 설정 (빌드과정에서 덮어쓰기 가능)
                       docker build --build-arg 변수명=변수값
                       
    ENV 변수명 변수값 : 이미지 빌드 및 컨테이너 실행 시점의 환경 변수 설정 (레이어 등록)
    
    ENTRYPOINT ["명령어"] : 고정된 명령어 -> CMD의 prefix느낌
    FROM node:14
    WORKDIR /app
    COPY . . //빌드 컨텍스트에 전체 파일 /app에 저장
    RUN npm install
    ARG COLOR=red
    ENV COLOR=blue
    USER node
    EXPOSE 3000
    ENTRYPOINT ["npm"] //컨테이너 실행시 고정 실행
    CMD ["start"] // 파라미터 받아서 변경 가능

    - Dockerfile을 통해 이미지 빌드를 시도하면, 임시 컨테이너 만들어서 커밋을 통해 레이어 만들기를 반복해서 

      원하는 이미지를 만들어준다.

    - Build시도시 지정한 폴더를 도커 데몬에 전달하고, 그곳에 Dockerfile 및 여러 소스 파일을 읽어서 이미지 레이러를 만든다.

    - 이때 도커파일이 있는 이미지 빌드시 사용되는 폴더빌드 컨텍스트라고한다.

    - dockerignore를 지정해서 빌드시 포함하지 않을 파일을 지정할 수 있다.

    - 직접 제작한 어플리케이션은 소스코드를 다운받고, 실제로 실행할 수 있는 아티팩트로 만드는 애플리케이션 빌드 과정이 필요하다!  

    출처: 쉬운도커(데브위키) -인프런

     

    4. 멀티 스테이지 빌드

     

    - 이미지 중 빌드에 사용하는 이미지와 실행에 사용하는 이미지 나누기

    - 코드로 실행되는 파일은 빌드와 사용이 분리되는 경우가 있음 

     

    출처: 쉬운도커(데브위키) -인프런

     

    - 자바를 예로 들면, 빌드 도구 (메이븐)등으로 파일을 빌드를 한번만하면 다시 안하고, 애플리케이션 실행시점엔 필요없어짐!

    이를 나누어 하자 

     

    FROM mven:3.6 AS build ---빌드를 위해 사용하는 이미지 
    WORKDIR /app
    
    COPY pom.xml .
    COPY src ./src
    
    RUN mvn clean package
    
    FROM openjdk:11-jre-slim --from이 두개면 도커가 임시 컨테이너 두개 생성해서 함 
    
    WORKDIR /app
    
    COPY --from=build /app/target/*.jar ./app.jar --빌드 과정에서 생성된 파일 복사
    EXPOSE 8080
    CMD ["java","-jar","app.jar"]

     

    출처: 쉬운도커(데브위키) -인프런

     

     

    참조자료:

    https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%89%AC%EC%9A%B4-%EB%8F%84%EC%BB%A4/dashboard

     

    [2024 NEW] 개발자를 위한 쉬운 도커 강의 - 인프런

    현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근본적인 질문

    www.inflearn.com

     

    'Infra > Docker' 카테고리의 다른 글

    Docker (6) - 도커 볼륨  (0) 2024.01.25
    Docker (5) - 도커 네트워크  (0) 2024.01.25
    Docker(4) - 레지스트리  (0) 2024.01.24
    Docker (2) - 이미지와 컨테이너  (0) 2024.01.24
    Docker (1) - 가상화 기술  (0) 2024.01.24
Designed by Tistory.