
도커(Docker)는 애플리케이션을 개발하고 실행하며 배포하는 과정을 더 쉽고 효율적으로 만들어주는 컨테이너화 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 라이브러리, 설정 파일 등)을 하나의 패키지로 묶는 기술입니다.
도커를 가장 쉽게 이해하려면, 예를들어 '이사'를 생각하면
컴퓨터 프로그램도 이사를 해야 할 때가 많아요. 예를 들어, 개발자의 컴퓨터(A집)에서 잘 작동하던 프로그램이 진짜 서비스가 돌아가는 서버 컴퓨터(B집)로 옮겨지면 갑자기 오류가 나거나 작동하지 않을 수 있어요. 왜냐하면 A집과 B집의 환경(운영체제, 프로그램 버전 등)이 다르기 때문이죠. 도커는 이 문제를 해결하기 위해 마법의 상자 를 만듭니다.
📦 마법의 상자 (컨테이너): 도커는 프로그램을 실행하는 데 필요한 모든 것(프로그램 코드, 설정, 도구 등)을 이 상자 안에 쏙 집어넣어요. 이 상자는 외부 환경과 완전히 분리되어 있어서, 어떤 컴퓨터에 올려놓아도 상자 안의 환경은 항상 똑같습니다.
그래서 이사를 가더라도, 상자만 통째로 옮기면 어떤 컴퓨터에서도 처음처럼 똑같이 프로그램이 잘 돌아가게 됩니다.
도커가 필요한 이유
기존에는 애플리케이션을 배포할 때, 개발 환경과 실제 서비스 환경이 달라 문제가 발생하는 경우가 많았습니다. 예를 들어, 개발자의 컴퓨터에서는 잘 작동하던 프로그램이 서버에 올리면 특정 라이브러리 버전 문제로 오류가 나거나 제대로 실행되지 않는 일이 잦았습니다. 도커는 이러한 문제를 해결하기 위해 등장했습니다. 애플리케이션을 컨테이너라는 독립적인 공간에 담아, 어떤 환경에서도 동일하게 작동하도록 보장합니다.
컨테이너와 가상 머신(VM)의 차이점
도커의 컨테이너를 이해하기 위해 가상 머신(Virtual Machine, VM)과 비교해보겠습니다.
- 가상 머신(VM): 운영 체제(OS) 위에 또 다른 운영 체제를 올리는 방식입니다. 무겁고, 시작하는 데 시간이 오래 걸리며, 자원을 많이 소모합니다.
- 도커 컨테이너: 호스트 운영 체제의 커널을 공유하며, 애플리케이션 실행에 필요한 최소한의 자원만 패키징합니다. 가상 머신보다 훨씬 가볍고, 시작이 빠르며, 자원을 효율적으로 사용합니다.

가상 머신(VM)은 하드웨어 위에 하이퍼바이저를 통해 게스트 OS를 포함한 전체 시스템을 가상화합니다.
반면에 도커 컨테이너는 호스트 OS의 커널을 공유하며, 애플리케이션 실행에 필요한 바이너리, 라이브러리 등만 패키징하여 훨씬 가볍고 효율적입니다. 쉽게 말해, 가상 머신은 '통째로 복제한 컴퓨터'이고, 도커 컨테이너는 '독립적인 공간을 가진 애플리케이션 상자'라고 생각할 수 있습니다
도커의 핵심 개념
1. 이미지(Image): 컨테이너의 설계도이자 불변의 스냅샷
핵심 원리: 레이어(Layer)와 Dockerfile
- Dockerfile: 이미지는 Dockerfile이라는 텍스트 파일로부터 빌드됩니다. 이 파일에는 이미지를 만들기 위한 모든 명령어가 순서대로 적혀 있습니다. 예를 들어, 어떤 운영 체제를 기반으로 할지, 어떤 파일을 복사할지, 어떤 명령어를 실행할지 등을 정의합니다.
- 레이어드 파일시스템(Layered Filesystem): 도커 이미지의 가장 중요한 기술적 특징 중 하나는 '레이어' 구조입니다. Dockerfile의 각 명령(예: FROM, RUN, COPY)은 하나의 독립적인 읽기 전용 레이어를 생성합니다.이 레이어들은 쌓여서 하나의 이미지를 구성합니다.이 구조 덕분에, 이미지를 공유하거나 업데이트할 때 변경된 레이어만 전송하면 되므로 매우 효율적입니다. 예를 들어, 1GB짜리 이미지를 업데이트할 때 10MB의 코드만 변경했다면, 전체 이미지를 다시 다운로드할 필요 없이 10MB 레이어만 새로 받으면 됩니다.
이미지는 마치 '클래스(Class)'와 같습니다. 여러 개의 컨테이너를 만들 수 있는 청사진이며, 한번 만들어지면 변경되지 않는 불변의(immutable) 속성을 가집니다.
2. 컨테이너(Container): 이미지로부터 생성된 독립적인 실행 인스턴스
핵심 원리: 격리 기술 (Namespaces & cgroups)
- 네임스페이스(Namespaces): 컨테이너 내의 프로세스가 마치 자신만의 독립된 환경에 있는 것처럼 보이게 만듭니다.
- PID (Process ID) 네임스페이스: 컨테이너 내의 프로세스들은 독립된 PID를 가집니다. 컨테이너 밖의 프로세스를 볼 수 없습니다.
- Net (Network) 네임스페이스: 각 컨테이너는 독립된 네트워크 인터페이스, IP 주소 등을 가집니다.
- Mnt (Mount) 네임스페이스: 각 컨테이너는 독립된 파일 시스템을 가집니다.
- 컨트롤 그룹(cgroups): 컨테이너가 사용할 수 있는 CPU, 메모리, I/O 등의 자원을 제한하고 관리하는 기능입니다. 이를 통해 특정 컨테이너가 호스트 시스템의 자원을 모두 소모하여 다른 컨테이너나 호스트에 영향을 주는 것을 방지합니다.
컨테이너는 마치 '객체(Object)'와 같습니다. 이미지라는 클래스를 기반으로 생성되며, 각 컨테이너는 독립적인 메모리, 파일 시스템, 네트워크 등을 가진 자신만의 격리된 공간에서 실행됩니다. 또한, 컨테이너가 실행되는 동안 생성되는 파일이나 변경 사항은 읽기/쓰기(writable) 레이어에 저장되며, 컨테이너가 삭제되면 이 레이어도 함께 사라집니다.
3. 도커 레지스트리(Registry): 이미지 저장 및 공유소
- 역할: 이미지를 Push하여 저장하고, 필요할 때 Pull하여 가져올 수 있게 합니다.
- 협업 및 재사용: 전 세계 개발자들이 이미지를 공유할 수 있는 플랫폼이며, 내가 만든 이미지를 다른 개발자가 쉽게 가져가 사용할 수 있습니다. 또한, 공식적으로 검증된 이미지(예: Node.js, Python, MySQL 등)를 제공하여 신뢰성을 높여줍니다.
- 종류: 도커 허브와 같은 공개 레지스트리 외에도, 기업 내부에서만 사용되는 비공개 레지스트리를 구축할 수도 있습니다. 이는 민감한 애플리케이션 이미지를 외부에 노출시키지 않고 내부적으로 관리할 때 유용합니다.
전체적인 워크플로우:
- Dockerfile 작성: 애플리케이션의 실행 환경을 정의합니다.
- docker build: Dockerfile을 기반으로 이미지(Image)를 생성합니다.
- docker push: 생성된 이미지를 도커 허브와 같은 레지스트리에 업로드합니다.
- docker pull: 다른 서버나 개발자가 레지스트리에서 이미지를 다운로드합니다.
- docker run: 이미지를 기반으로 컨테이너(Container)를 실행합니다.
이러한 과정을 통해 도커는 개발부터 배포까지의 모든 단계를 표준화하고, 어떤 환경에서도 동일하게 작동하는 애플리케이션을 만들 수 있게 해줍니다.
- 도커 레지스트리는 이미지를 저장하고 관리하는 중앙 집중식 저장소입니다. 가장 잘 알려진 공개 레지스트리가 도커 허브(Docker Hub)입니다.
- 도커 컨테이너는 가상 머신처럼 완전한 운영 체제를 포함하지 않고, 호스트 OS의 커널을 공유합니다. 그럼에도 불구하고 완벽하게 격리된 환경을 제공할 수 있는 것은 리눅스의 핵심 기술인 네임스페이스(Namespaces)와 컨트롤 그룹(cgroups) 덕분입니다.
- 컨테이너는 이미지의 설계도에 따라 실제로 애플리케이션이 실행되는 격리된 환경입니다. 이미지가 정적인 파일 묶음이라면, 컨테이너는 동적으로 실행되는 '프로세스'입니다.
- 이미지는 컨테이너를 생성하는 데 필요한 모든 것을 담고 있는 읽기 전용(read-only) 템플릿입니다. 단순히 코드를 담는 것을 넘어, 애플리케이션 실행에 필요한 운영 체제 환경, 라이브러리, 의존성 등을 통째로 패키징한 것입니다.
'Cloud > 컨테이너(Container)' 카테고리의 다른 글
| 도커(Docker) 사용법 및 명령어(Command line Interface) (0) | 2025.09.06 |
|---|