Docker에 대해 본격적으로 알아보기 전,
꼭 짚고 넘어가야 하는 핵심 개념들부터 차례대로 정리해 보는 시간을 가졌다.
Container ?
흔히 생각하는 컨테이너의 이미지가 다들 있을 것이라고 생각한다.

이제 알아볼 컨테이너라는 기술도 이 컨테이너와 유사한 부분이 있다고 한다.
Container 의미
- 애플리케이션의 코드, 라이브러리, 환경 설정을 포함
- 애플리케이션을 안전하고 효율적으로 실행 가능
- 한 곳에서 다른 곳으로 쉽게 배포 가능 ( 이동 가능 )
화물 운송에 쓰이는 컨테이너가 화물을 안전하고 효율적으로 운송하는 것과 같이
비슷한 의미를 가지고 있는 부분도 존재하는 것 같다.
▶️ Docker는 화물 운송에서 쓰이는 컨테이너의 개념을 모티브로 하여 개발되었다고 할 수 있음
container 기술 정의
- 애플리케이션을 실행하기 위한 가상 환경
- 커널을 사용해 가볍고 효율적으로 실행 가능
- docker과 kubernetes와 같은 도구를 사용하여 배포하고 관리
- 호스트 OS의 자원을 분리해 독립적으로 실행 ➡ 컨테이너가 서로 영향을 미치지 않고 안전하게 실행
- 표준화된 이미지를 기반으로 컨테이너를 생성 ➡ 컨테이너는 쉽게 이동, 공유, 재사용 가능
- 컨테이너는 호스트 OS 커널을 공유하여 IO처리가 쉬워져 가볍고 성능 효율을 높임
대표적으로 Linux Container가 존재한다.
커널?
- 컴퓨터의 뼈대
- 컴퓨터의 하드웨어와 소프트웨어를 연결 및 관리
- 컴퓨터 자원을 관리하는 운영체제의 핵심 부분
- 프로세스 혹은 스레드의 관리 및 CPU 스케줄링
→ 각 프로세스마다 CPU를 사용할 수 있는 시간을 분배하고 관리 - 메모리 및 I/O 디바이스 관리
- IPC (Inter Process Communication)
→ 한 컴퓨터 내부의 프로세스끼리 통신을 도와줌 - 다른 컴퓨터와의 통신 가능하도록 함
container 기술 장점
- 경량화
→ 별도의 운영체제 포함 X -> 가볍고 효율적 - 빠른 실행
→ 호스트 운영 체제의 커널을 공유
또 하나의 장점을 예를 들어 설명해 보자면,
우리가 프로젝트 배포를 위해서는 필요한 환경을 구축해야 하는데,
이때 구축해야 하는 환경을 생각해 보면 서버, OS, 네트워크 통신 포트 구성, 개발 툴 등이 존재한다.
물론 이러한 과정에서는 호환성을 위해 버전도 맞춰야 하는 경우도 생긴다.
다른 개발자가 이를 개발하려면 이 과정을 모두 일일이 다시 설정해하는 작업이 필요하고,
변경이나 차질이 생겨 어떤 하나를 바꾸게 되면 연쇄적으로 다른 것들까지 영향이 가 변경해야 하는 경우가 생길 수도 있다.
container를 활용하면 이러한 작업들 간편화가 가능해진다.
container 기술 단점
- 독립성
→ 호스트 운영 체제의 커널 공유 -> 가상 머신과 같은 독립성은 제공하지 못함
→ 호스트 운영 체제가 업데이트되거나 오류 발생 시 영향 - 보안
→ 가상 머신에 비해 보안 기능이 약함
→ 따라서 민감한 데이터를 포함하지 않도록 주의 필요
가상 머신 vs 컨테이너

가상 머신 (VM, Virtual Machine) | 컨테이너 (Container) | |
공유 자원 | 하드웨어 전체 | 운영체제의 커널 |
메모리 사용량 | 큼 | 작음 |
실행 속도 | 느림 | 빠름 |
사용 목적 및 유용한 환경 | 다양한 운영체제를 실행하는 환경 | 애플리케이션 실행 확장성 혹은 비용 절감이 중요한 환경 |
가상화를 사용하는 이유
- 기술의 발전으로 향상된 컴퓨터의 성능을 더욱 효율적으로 사용하기 위함
- CPU 사용률이 낮은 상태로 많은 서비스가 나뉘어 있으면 활용도가 낮은 서버들은 리소스가 낭비되고, 하나로 합치면 안정성에 문제 발생 가능
→ 안정성을 높이며 리소스를 최대한 활용할 수 있도록 가상화 사용
Docker란?
- 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼
- 컨테이너를 이미지라는 형태로 보다 쉽게 생성 및 관리
- 성능 향상
- 뛰어난 이식성
→ 하나의 서버에서 생성한 컨테이너 이미지를 다른 서버에서도 쉽게 배포 가능 - 유연성
→ 운영체제의 버전, 하드웨어 사양에 관계없이 동일한 애플리케이션 실행 가능
→ 쉽게 Scale Out 가능
Scale out vs Scale up

Scale out (스케일 아웃) | Scale up (스케일 업) | |
확장성 | 하나의 장비에서 처리하던 일을 여러 장비에 나눠서 처리 수평 확장 지속적 확장 가능 |
CPU 변경, RAM 추가 등으로 하드웨어 장비의 성능 높임 수직 확장 성능 확장에 한계 존재 |
비용 | 비교적 저렴한 서버 비용으로 부담 적음 | 성능 증가에 따른 비용 증가폭이 큼 |
장애 | 읽고 쓰는 작업이 여러 대의 서버에 분산 처리 따라서 장애 발생 시 전면 장애로 번질 가능성이 적음 |
한 대의 서버에 부하가 집중 따라서 장애 발생 시 전반적인 영향이 큼 |
Docker 핵심 구성 요소

구성 요소 | 기능 | 동작 과정 및 종류 |
Docker Daemon | Docker API 요청을 수신 이미지, 컨테이너와 같은 Docker Object 관리 |
Docker Client에게서 전달 받은 명령어 실행 |
Docker Client | 사용자가 docker run, docker build 등의 명령어를 사용해 Docker와 상호작용하는 주요 수단 | Docker API로 Docker Daemon에게 명령어 전달 |
Docker Registry | Docker Images 저장 | public : 공개 저장소 ex) Docker Hub private: 비공개 저장소 |
Docker Objects | Docker에서 생성하고 사용하는 이미지, 컨테이너 등의 기타 개체 | 이미지 : 애플리케이션을 실행하는 데 필요한 모든 파일, 구성 및 설정을 포함하는 읽기 전용 파일 시스템 컨테이너 생성에 사용 컨테이너 : 이미지를 실행한 상태 별도의 실행 환경 제공 호스트 운영 체제와 격리 |
✏️ 정리
Docker?
- 애플리케이션을 배포, 테스트, 개발하는 데 유용한 도구
- 개발 생산성을 높임
- 안정적으로 애플리케이션 운용하는 도구
Images?
- 애플리케이션을 실행하는 데 필요한 모든 파일, 구성 및 설정 포함하는 읽기 전용 파일 시스템
Containers?
- Docker Images를 실행한 상태
Docker 공식 문서
Home
Home page for Docker's documentation
docs.docker.com
'Docker' 카테고리의 다른 글
[Docker] Docker 배포_Spring Boot 프로젝트 (코딩온) (0) | 2024.01.02 |
---|---|
[Docker] Docker 배포_React 프로젝트 (코딩온) (1) | 2023.12.30 |
[Docker] Dockerfile에 대해 (코딩온) (1) | 2023.12.28 |
[Docker] Docker 설치 및 컨테이너 실행 (코딩온) (0) | 2023.12.26 |
[Docker] Docker Desktop - Unexpected WSL error 및 해결 (코딩온) (0) | 2023.12.24 |