이미지와 레이어
- 이미지는 여러 개의 레이어로 구성되어 있음
- Layered File System을 사용하면 공간을 효율적으로 사용할 수 있음 -> 스토리지 및 네트워크 사용량 절약
- 또한 레이어 구조는 재활용에 유리
- 이미지의 레이어는 이전 레이어의 변경괸 내용들만 저장
- 이미지에서 한 번 저장된 레이어는 변경할 수 없음(변경 사항이 있으면 새로운 레이어로 저장해야함)
그림과 같이 컨테이너는 이미지를 공유해서 사용해 서로 다른 컨테이너로 만들어 질 수 있다
//이미지의 레이어 이력 조회
docker image history 이미지명
Layering : 각 레이어는 이전 레이어 위에 쌓이며, 여러 이미지 간에 공유될 수 있습니다. 레이어 방식은 중복 데이터를 최소화하고, 빌드 속도를 높이며, 저장소를 효율적으로 사용할 수 있게 해줍니다.
Copy-on-Write (CoW) 전략 : 다음 레이어에서 이전 레이어의 특정 파일을 수정 할 때, 해당 파일의 복사본을 만들어서 변경 사항을 적용합니다. 이렇게 함으로써 원래 레이어는 수정되지 않고 그대로 유지됩니다.
Immutable Layers (불변 레이어) : 이미지의 각 레이어는 불변으로, 한 번 생성되면 변경되지 않습니다. 이렇게 함으로써 이미지의 일관성을 유지하고, 여러 컨테이너에서 안전하게 공유할 수 있습니다.
Caching (캐싱) : 레이어를 캐시하여, 이미 빌드된 레이어를 재사용할 수 있습니다. 이는 이미지 빌드 시간을 크게 줄여주며, 같은 레이어를 사용하는 여러 이미지에서 효율적으로 작동합니다.
이미지 커밋
커밋 : 현재 컨테이너의 상태를 이미지로 저장
빌드 : Dockerfile을 통해 이미지를 저장
사용자가 직접 새로운 이미지를 만드는 방법
하나의 커밋은 기존 레잉어에 하나의 새로운 레이어를 추가하는 것
따라서 여러 레이어를 쌓으려면 커밋을 완료한 이미지를 새로운 컨테이너로 만들고 다시 두번째 레이어를 커밋하는 순서대로 여러 차례 커밋을 수행해야 함
//컨테이너 실행과 동시에 터미널 접속
docker run -it --name 컨테이너명 이미지명 bin/bash
//실행 중인 컨테이너를 이미지로 생성
docker commit -m 커밋명 실행중인컨테이너명 생성할이미지명
이미지 빌드
IaC(Infrastructure as Code): 인프라 상태를 코드로 관리
도커 데몬이 도커파일에 적힌 지시어를 사용해서 이미지를 자동으로 만들어주는 방법
//도커파일을 통해 이미지 빌드
docker build -t 이미지명 Dockerfile경로
기본 Dockerfile 지시어
//베이스 이미지를 지정(필수)
FROM 이미지명
//파일을 레이어에 복사
COPY 파일경로 복사할경로
//컨테이너 실행 시 명령어 지정
CMD ["명령어"]
이미지 Build 및 Push 실습
//이미지 빌드(.은 현재 위치를 말함)
docker build -t codrin2/buildnginx .
//빌드한 컨테이너 실행
docker run -d -p 80:80 --name build-nginx codrin2/buildnginx
빌드 컨텍스트
이미지를 빌드할 때 사용되는 폴더이며 이 폴더 안에 도커 파일과 카피에 사용할 파일들이 모두 들어있어야 함
.dockerignore를 통해 원하지 않는 파일을 제외하고 전달할 수 있음
이를 통해 빌드 과정에서 필요한 리소스를 효율적으로 관리할 수 있고 이미지가 빌드되는 시간을 최소화활 수 있음
Dockerfile 지시어
애플리케이션 빌드 : 소스코드를 실행 가능한 프로그램으로 빌드(소스 코드 -> 애플리케이션 프로그램 or 아티팩트)
일반적인 소프트웨어만 실행할 때는 실행 환경을 준비하고 실행할 프로그램만 준비하면 됨
하지만 개발한 소스 코드를 이미지로 빌드하려면 먼저 소스 코드를 애플리케이션으로 빌드하고 그 애플리케이션을 실행할 수 있는 환경을 준비하면 됨.
//베이스 이미지를 지정
FROM 이미지명
//빌드 컨텍스트의 파일을 레이어에 복사(새로운 레이어 추가)
COPY 빌드컨텍스트경로 레이어경로
//명령어 실행(새로운 레이어 추가)
RUN 명령어
//컨테이너 실행 시 명령어 지정
CMD ["명령어"]
//도커파일명이 Dockerfile이 아닌 경우 별도 지정
//케이스벼로 다른 도커 파일 빌드가 필요한 경우 사용
docker build -f 도커파일명 -t 이미지명 Dockerfile경로
//작업 디렉토리를 지정(cd)(새로운 레이어 추가)
WORKDIR 폴더명
//명령을 실행할 사용자 변경(su)(새로운 레이어 추가)
USER 유저명
//컨테이너가 사용할 포트를 명시
EXPOSE 포트번호
//이미지 빌드 시점의 환경 변수 설정
//도커 빌드 명령으로 이미지를 빌드할 때만 사용
ARG 변수명 변수값
//docker build --build-arg 변수명=변수값 으로 덮어쓰기 가능
//이미지 빌드 및 컨테이너 실행 시점의 환경 변수 설정(새로운 레이어 추가)
//도커 빌드뿐만 아니라 이 이미지를 컨테이너로 실행할때까지 지속적으로 유지
ENV 변수명 변수값
//docker run -e 변수명=변수값 으로 덮어쓰기 가능
//고정된 명령어를 지정
//사용자가 CMD를 bash로 덮어쓰기 해서 터미널로 들어오는 것도 관리 가능
ENTRYPOINT ["명령어"]
//컨테이너 실행 시 실행 명령어 지정
CMD ["명령어"]
- 파일 시스템의 내용을 변경하는 부분이 있으면 일반적으로 레이어를 추가
- 메타데이터에만 영향을 주는 부분은 레이어가 추가되지 않는다
멀티 스테이지 빌드
이미지를 빌드에 사용하는 이미지와 실행에 사용하는 이미지로 나눔 -> 실제로 애플리케이션이 실행되는 이미지의 크기를 줄일 수 있음
싱글 스테이지
# 빌드 환경 설정
FROM maven:3.6-jdk-11
WORKDIR /app
# pom.xml과 src/ 디렉토리 복사
COPY pom.xml .
COPY src ./src
# 애플리케이션 빌드
RUN mvn clean package
# 빌드된 JAR 파일을 실행 환경으로 복사
RUN cp /app/target/*.jar ./app.jar
# 애플리케이션 실행
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
멀티 스테이지
# 빌드 환경 설정
FROM maven:3.6 AS build
WORKDIR /app
# pom.xml과 src/ 디렉토리 복사
COPY pom.xml .
COPY src ./src
# 애플리케이션 빌드
RUN mvn clean package
# 두번째 단계: 실행 환경 설정
FROM openjdk:11-jre-slim
WORKDIR /app
# 빌드 단계에서 생성된 JAR 파일 복사
COPY --from=build /app/target/*.jar ./app.jar
# 애플리케이션 실행
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
'Docker' 카테고리의 다른 글
[Docker] 이미지와 컨테이너 (0) | 2024.03.12 |
---|