쿠버네티스 - docker

존스노우·2024년 8월 7일
0

docker

도커 컨테이너는 도커 이미지를 기반으로 실행되는 독립적인 프로세스

  • 높은 이식성: 어떤 환경에서도 동일하게 실행 가능

  • 가벼움: 가상 머신보다 리소스 사용이 적음

  • 빠른 시작/중지: 게스트 OS 부팅 없이 빠르게 실행

  • BORA (Build Once, Run Anywhere): 한 번 만든 이미지로 어디서나 실행

도커 이미지란?

도커 이미지는 컨테이너를 생성하기 위한 템플릿

구성

  • 애플리케이션 코드
  • 런타임 환경
  • 시스템 도구
  • 시스템 라이브러리
  • 설정 파일
  • 직접 생성: Dockerfile을 작성하여 빌드

이미지와 컨테이너의 관계

  • 이미지는 정적인 템플릿 - > 요리 레시피
  • 컨테이너는 이 이미지를 기반으로 실행되는 동적인 인스턴스 -> 레시피로 만든 실제 요리

컨테이너라는 이름의 유래와 의미

물류 산업의 컨테이너에서 유래
표준화된 크기의 상자로, 다양한 물건을 담아 쉽게 운송할 수 있음

  • 도커 컨테이너와의 유사성

  • 표준화: 어디서나 동일하게 작동하는 환경을 제공

  • 독립성: 내용물(애플리케이션)을 외부 환경과 분리

  • 이동성: 다양한 환경(서버, 클라우드 등)으로 쉽게 이동 가능

  • 효율성: 자원을 효율적으로 사용하고 빠르게 배포 가능

'옮기는' 의미의 중요성

  • 개발 환경에서 테스트 환경, 프로덕션 환경으로의 쉬운 이동

  • 클라우드 간, 서버 간 애플리케이션 이동의 용이성

  • "Build Once, Run Anywhere" 개념 실현

  • 도커 컨테이너는 애플리케이션과 그 실행 환경을 담아 쉽게 '옮기고' 실행할 수 있게 해줌

  • 컨테이너는 애플리케이션과 그 실행에 필요한 모든 환경을 포함하는 패키지

도커 컨테이너 설계 시 주의해야 할 점

  • 한 컨테이너에 한 프로세스
    이유: 단일 책임 원칙을 따르며, 관리와 스케일링이 용이함

  • 변경 불가능한 인프라 구현
    의미: 환경 변경 시 기존 환경을 수정하지 않고 새로운 환경을 생성
    방법: 필요한 모든 것을 이미지에 포함시킴

  • 경량 이미지 사용
    이유: 빠른 배포와 효율적인 리소스 사용을 위함

  • root 외의 사용자로 실행
    이유: 보안 강화를 위함

DockerFile

도커 파일의 기본 구조

  • FROM: 기반 이미지 지정
  • COPY: 로컬 파일을 컨테이너로 복사
  • RUN: 빌드 시 실행할 명령어
  • USER: 실행 계정 지정
  • ENTRYPOINT: 컨테이너 실행 시 실행할 명령어

기반 이미지 선택 시 고려사항

  • 알파인 리눅스: 경량화된 이미지, 많이 사용됨
  • Distroless: 특정 런타임만 포함된 최소화 이미지
  • scratch: 가장 기본적인 이미지, 디버깅 어려움
  • UBI: 레드햇 지원 이미지, 기술 지원 필요시 유용

도커 파일 작성 원칙

  • 필요한 최소한의 구성요소만 포함
  • 보안을 고려한 사용자 권한 설정
  • 명확하고 재현 가능한 빌드 과정 정의

이미지 크기의 중요성

  • 이미지 크기는 5MB에서 210MB까지 다양함
  • 작은 이미지는 빠른 배포와 효율적인 리소스 사용에 유리

ENTRYPOINT와 CMD의 관계

  • ENTRYPOINT: 변경이 적은 기본 명령어
  • CMD: 자주 변경되는 인수나 기본값
  • 실행 시 $ENTRYPOINT $CMD 형태로 동작

이미지 빌드

빌드 명령어

  • docker image build -t [이미지이름]:[태그][도커파일 위치]
  • docker image build -t sample-image:0.1

빌드 과정

  • 도커 파일의 각 명령어가 순서대로 실행됨
  • 각 단계마다 중간 컨테이너가 생성되고 삭제됨

결과 확인

  • docker image ls 명령어로 생성된 이미지 확인
  • 기반 이미지도 함께 다운로드되어 로컬에 저장됨

이미지 크기

  • 생성된 이미지는 기반 이미지보다 약간 더 큼
  • sample-image가 기반 이미지보다 7MB 더 큼

멀티 스테이지 빌드

문제점

  • 기본 빌드 방식은 컴파일 도구 등으로 인해 이미지 크기가 커짐 (예: 377MB)

해결책 : 멀티 스테이지 빌드


  • 빌드 단계와 실행 단계를 분리
  • 빌드 결과물만 실행용 이미지로 복사
  • 이미지 크기 대폭 감소 (예: 377MB → 13.1MB)
  • 보안 향상 (불필요한 도구 제거)
  • 빌드 속도 향상 가능 (병렬 처리)

구현 방법

  • 여러 FROM 구문 사용
  • COPY --from 명령어로 이전 단계 결과물 복사

ENTRYPOINT ["./go-app"]

  • 컨테이너가 시작될 때 실행할 기본 명령을 정의
  • 컨테이너를 실행 가능한 애플리케이션처럼 사용할 수 있게 함
  • 현재 디렉토리에 있는 'go-app'이라는 실행 파일을 실행하라는 뜻

도커 레지스트리로 이미지 업로드

  • 도커 레지스트리 선택 (예: Docker Hub)
  • 이미지 이름 형식 지정: [레지스트리 주소]/[사용자명]/[이미지명]:[태그]
  • docker login 명령어로 레지스트리에 로그인
  • docker image tag 명령어로 이미지 태그 변경
  • docker image push 명령어로 이미지 업로드
  • 필요시 docker logout으로 로그아웃
profile
어제의 나보다 한걸음 더

0개의 댓글