Docker

[도커] 1장 - 이미지, 컨테이너

초코chip 2024. 10. 23. 16:28

도커

  • 목적: 프로그램 다운과정을 간단하게 만들기 위해서

 

기존 방식

  • installer 다운 > installer 실행 > 프로그램 설치
    • 이 과정에서 서버, 패키지 버전, OS 등에 따라 프로그램 설치과정에서 에러가 발생

 

 

도커와 컨테이너

  • 도커 정의: 칸테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구 이며 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 컨테이너 정의:  다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줌
    • 이렇게 추상화한 컨테이너는 어떤 환경에서든 쉽게 
  • 컨테이너 찐 정의: 코드와 모든 종속성을 패키지화하여 응용 프로그램이 다른 컴퓨팅 환경에서 빠르고 안정적으로 실행되도록 한 SW 표준 단위

 

 

도커 컨테이너와 도커 이미지

  • 컨테이너 이미지: 응용 프로그램을 실행하는데 필요한 모든 것(코드, 런타임, 라이브러리 등..)을 포함하는 가볍고 독립적이며 실행 가능한 SW 패키지
    • 즉, 프로그램을 실행하는데 필요한 설정이나 종속성을 모두 포함
  • 이미지는 런타임에 컨테이너가 되고, 컨테이너가 실행을 해서 애플리케이션이 컨테이너 안에서 실행되는 구조
    • 즉, 도커 이미지를 이용해서 컨테이너를 생성 -> 컨테이너를 이용하여 프로그램을 실행하는 구조

도커 사용 흐름

CLI 명령어를 입력하면 도커 서버에서 중요한 일들을 다 처리한 후 해당 프로그램을 실행시켜주는 흐름 

  1. 도커 CLI에서 커맨드를 입력하면, 도커 서버(데몬)가 해당 커맨드를 받아 작업을 처리
    • 이미지 생성, 컨테이너 실행...
  2. CLI에서 요청한 이미지가 로컬에 cache가 되어있는지 확인
  3. 없다면, 도커 허브라는 곳에서 이미지를 가져오고 로컬 캐시에 보관
  4. 이미지를 받아와 해당 이미지를 통해 컨테이너를 실행
  5. 생성된 컨테이너는 이미지에서 받은 설정에 따라 프로그램을 실행

 

 

VS 가상화

  • 하이퍼 바이저 기반의 가상화: 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있도록 하는 SW
    • 또한, 하드웨어를 가상화하여 하드웨어와 각각의 VM을 모니터링하는 중간 관리자
    • 즉, 논리적으로 공간을 분할

  • 일반적인 SW처럼 호스트 OS위에서 실행, 하드웨어 자원을 게스트 OS에서 하이퍼바이저를 통해 요청하는 방식
  • 각 VM마다 독립된 가상 하드웨어 자원을 할당 -> 한 VM에서 오류가 발생해도 다른 VM에 전파X

 

이러한 가상화 기술에서 나온 컨테이너 가상화 기술

공통점 차이점
기본 하드웨어 격리된 환경 내에서 애플리케이션을 배치 컨테이너는 하이퍼바이저와 게스트OS가 불필요 -> 훨씬 가벼움

 

  • 컨테이너는 하나의 애플리케이션이 독립된 환경에서 실행되는 것처럼 보이게 하지만, 사실은 호스트(실제 컴퓨터)와 많은 부분을 공유
    • 즉, 이미지를 호스트 OS에서 실행 -> 커널을 공유
    • 예를 들어, 컨테이너에서 실행되는 프로그램들은 호스트에서 다른 프로그램들과 같은 공간을 공유 그래서 컨테이너에서 실행 중인 프로그램을 호스트에서 명령어로 확인 가능
  • 가상 머신은 완전히 독립적인 시스템처럼 동작
    • 하이퍼바이저라는 프로그램을 통해 하드웨어 자원을 나눠 사용.
    • 가상 머신은 호스트와 커널(운영체제 핵심 부분)도 공유하지 않음
    • 즉, 이미지를 게스트 OS에서 실행 -> 커널 공유x

 

그러면 도커에서는 컨테이너들을 어떻게 격리시키는가?

리눅스의 Cgroup과 namespace를 통해 컨테이너와 호스트에서 실행되는 프로세스 사이에 벽을 생성

  • C Group: 각 컨테이너가 사용할 수 있는 리소스(cpu, 메모리) 양을 제한
  • Namespace: 각 컨테이너가 보는 환경(프로세스, 파일)을 따로 분리






하드웨어 자원들이 큰데, 컨테이너만을 위한 것을 할당

 

엥 그러면 맥os/window에서는 어떻게 리눅스 명령어 사용함?

 

 

이미지로 컨테이너 만드는 과정

그렇다면 필요한 모든 것이란?

  • 컨테이너 안에서 프로그램을 시작시키는 명령어
  • 해당 프로그램의 파일 스냅샷( 디렉토리나 파일을 카피한 것 )

 

컨테이너 생성 과정

  1. Docker 클라이언트에서 이미지 실행: docker run <이미지>
  2. 도커 이미지에 있는 파일 스냅샷을 컨테이너 HDD에 복사
  3. 이미지에서 가지고 있는 명령어를 이용해 컨테이너 내에서 프로그램 실행


도커 설치 방법