[Docker] 선택이 아닌 필수

Hoochu·2026년 1월 26일

Docker

목록 보기
1/3
post-thumbnail

Docker란

리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼입니다.

가상화? 컨테이너?
Docker를 처음 듣는 분들은 이런 용어가 와닿지 않을 거라고 생각합니다.

가상화란 무엇일까?

가상화란 하나의 컴퓨터 자원(cpu, 메모리, 디스크)을 마치 여러 개인 것처럼 논리적으로 쪼개서 사용하는 기술을 뜻합니다.

쪼개면 여러개의 서버를 동시에 돌려 자원을 효율적으로 사용할 수 있고, 각 공간을 격리 시키기 때문에 각 공간이 서로의 영향(오류나 문제)을 받지 않을 수 있습니다.

Docker의 컨테이너 방식

이때 docker 의 컨테이너는 host의 리눅스 커널은 공유하고, 애플리케이션 구동에 필요한 라이브러리와 실행 파일만 최소한으로 담아 프로세스 단위로 격리하는 방식입니다.

전통적인 vm과 비교하자면, vm은 운영체제 OS 전체를 각각 실행하는 방식이고, docker는 host의 리눅스 커널 위에서 프로세스를 실행하는 것입니다.

예를 들어, 내 컴퓨터(Host)에 Docker를 설치하고 Ubuntu 컨테이너를 실행시키면 어떻게 될까요?

ubuntu가 설치되는 것이 아닌 컴퓨터(host) 내에 하나의 격리된 실행 공간을 만들어서 그 안에서 ubuntu 환경처럼 보이도록 구성합니다. 결과적으로 ubuntu 환경을 가진 프로세스 집합을 실행됩니다.


그렇다면, 왜 Docker를 써야할까? (=왜 프로세스를 격리시켜야할까)

서버나 개발 환경에서 이러한 문제를 겪은 적이 있지 않나요?

  • 라이브러리 버전 충돌
  • 다른 컴퓨터에선 실행되지 않는 문제
  • 특정 애플리케이션의 과도한 cpu/메모리 사용
  • 한 서비스의 오류가 다른 서비스까지 영향을 미치는 문제

이런 문제의 공통 원인은 모든 프로세스가 하나의 실행 환경을 공유한다는 점입니다.

이런 문제들을 해결하기 위해 사용하는 것이 docker 입니다.

docker를 사용하면 실행환경을 분리함으로써, 서비스 간 충돌을 방지할 수 있고, 서버 자원을 효율적으로 사용할 수 있습니다.

또한 Docker는 실행 환경을 이미지 단위로 고정합니다. 그 결과, 개발자마다 서로 다른 환경을 설정할 필요 없이 누구나 동일한 환경에서 애플리케이션을 실행할 수 있게 됩니다. 한 번 고정된 환경을 팀 전체가 공유할 수 있습니다.


이미지란?

Docker 이미지는 애플리케이션을 실행하기 위해 필요한 모든 것을 정의해둔 템플릿입니다.

라이브러리, 기타 종속성에 대한 정의, 실행되는 코드가 들어있는 실행되지 않은 os 파일구조를 가집니다.

이미지의 레이어 구조

Docker 이미지는 하나의 파일이 아니라
여러 개의 레이어가 겹겹이 쌓인 구조로 이루어져 있습니다.

각 레이어는 이전 레이어를 기준으로 파일 시스템의 변경 사항만을 담고 있습니다.
예를 들어, 패키지를 하나 설치하거나 파일을 추가하면
그 변경 내용만 새로운 레이어로 생성됩니다.

이렇게 생성된 레이어들은 아래에서 위로 차곡차곡 쌓이며 하나의 이미지를 구성합니다.

레이어 재사용과 효율성

이미지의 중요한 특징 중 하나는 기존 레이어를 재사용할 수 있다는 점입니다.

여러 이미지가 동일한 기반 이미지를 사용한다면 공통되는 레이어는 다시 생성하지 않고 공유됩니다.
덕분에 이미지 빌드 속도가 빨라지고, 디스크 공간 또한 효율적으로 사용할 수 있습니다.

이미지의 불변성(Immutable)

Docker 이미지는 불변성을 가집니다.

한 번 생성된 이미지의 레이어는수정되거나 변경되지 않습니다.
어떤 변경이 필요하다면, 기존 레이어를 수정하는 대신 새로운 레이어를 추가하여 새로운 이미지를 생성합니다.


컨테이너란?

Docker 컨테이너는 이미지를 기반으로 실제로 실행되는 애플리케이션 인스턴스입니다.

이미지가 실행 환경을 정의한 템플릿이라면, 컨테이너는 그 템플릿을 이용해 생성된 실행 중인 프로세스라고 볼 수 있습니다.

즉,
이미지 = 실행 환경의 정의
컨테이너 = 그 정의를 바탕으로 실행되는 프로세스

입니다.

컨테이너의 실행 방식

컨테이너는 이미지를 실행하는 순간 생성되며, 다음과 같은 특징을 가집니다.

  • 독립된 파일 시스템
  • 격리된 프로세스 공간
  • 분리된 네트워크 환경
  • 제한 가능한 CPU / 메모리 자원

이 모든 격리는 Host의 리눅스 커널을 공유한 상태에서 프로세스 단위로 이루어집니다.

컨테이너와 쓰기 레이어

컨테이너가 이미지와 다른 중요한 차이점은
쓰기 가능한 레이어를 가진다는 점입니다.

이미지는 불변(read-only)이지만, 컨테이너는 이미지 위에 하나의 쓰기 레이어를 추가하여 실행됩니다.

컨테이너 내부에서 파일을 생성하거나 설정을 변경하거나 로그가 쌓이면
이 모든 변경 사항은 컨테이너의 쓰기 레이어에만 기록됩니다.
컨테이너가 삭제되면 이 쓰기 레이어도 함께 사라집니다.

컨테이너는 가볍고 빠르다

컨테이너는 운영체제를 부팅하지 않습니다. 이미 실행 중인 Host 커널 위에서 곧바로 프로세스를 실행합니다.

이 때문에 실행 속도가 빠르고, 자원 소모가 적으며, 필요할 때 쉽게 생성하고 제거할 수 있습니다.

0개의 댓글