1. Docker란
Docker는 애플리케이션을 컨테이너(container) 라는 느슨하게 격리된 환경에 패키징하고 실행할 수 있게 해주는 플랫폼이다. [1]
Docker를 사용하면 애플리케이션 실행에 필요한 파일, 라이브러리, 설정을 함께 묶어 배포할 수 있어
개발 환경, 테스트 환경, 운영 환경에서 같은 방식으로 실행하기 쉬워진다. [1]
2. 컨테이너(Container)란
Docker에서 컨테이너(container) 는 이미지(image)의 실행 인스턴스이며,
정확히는 호스트 위에서 실행되는 격리된 프로세스이다. [1][2][4]
처음 배울 때는 컨테이너를 “미니 컴퓨터”처럼 떠올리면 이해에 도움이 될 수 있다.
다만 이 표현은 어디까지나 비유에 가깝다.
왜냐하면 컨테이너는 VM처럼 OS 전체를 따로 띄우는 구조가 아니라,
호스트와 같은 커널을 공유하면서 격리된 형태로 실행되기 때문이다. [2]
즉, Docker 컨테이너는:
- 독립적인 것처럼 보이는 실행 환경을 제공하고 [2][4]
- 각 컨테이너를 별도로 시작, 중지, 삭제할 수 있으며 [1]
- 다른 컨테이너와 비교적 분리된 상태로 동작한다. [1][2]
3. 호스트(Host)와 컨테이너
컨테이너가 실행되는 실제 머신을 호스트(host) 라고 한다. [4]
여러 컨테이너는 하나의 호스트 위에서 동시에 실행될 수 있다.
이때 각 컨테이너는 비교적 독립적으로 동작하지만,
기본적으로는 같은 호스트의 자원을 사용한다. [1][2]
4. 컨테이너의 독립성
컨테이너는 완전히 별개의 컴퓨터는 아니지만,
실행 관점에서는 다음 요소들이 분리되어 관리된다. [1][4]
1) 파일 시스템
컨테이너는 자체 파일 시스템을 가진다. [4]
그래서 일반적인 경우 한 컨테이너 내부의 파일이
다른 컨테이너에 바로 보이지 않는다.
다만 볼륨(volume)이나 바인드 마운트(bind mount)를 사용하면
호스트 또는 다른 컨테이너와 데이터를 공유할 수 있다.
이 부분은 Docker가 의도적으로 연결해준 경우다. [1]
2) 네트워크
컨테이너는 자체 네트워킹 환경을 가진다. [4]
다만 여기서 주의할 점은
“모든 컨테이너가 항상 외부에서 직접 접근 가능한 고유 IP를 가진다”로 이해하면 정확하지 않다는 것이다.
Docker는 컨테이너를 네트워크에 연결하고, 필요하면 호스트 포트와 컨테이너 포트를 매핑해서 접근하게 한다. [1][2]
즉, 실무에서는 보통:
- 컨테이너 내부 서비스는 컨테이너 포트로 실행되고
- 외부에서는 호스트의 공개 포트를 통해 접근하는 구조를 자주 사용한다. [2]
3) 프로세스
컨테이너는 호스트와 분리된 프로세스 트리(process tree) 안에서 실행된다. [4]
그래서 컨테이너 안에서 실행 중인 프로세스는
다른 컨테이너와 분리된 것처럼 관리된다.
5. 이미지(Image)란
이미지(image) 는 컨테이너를 만들기 위한 읽기 전용 템플릿이자,
컨테이너 실행에 필요한 파일, 바이너리, 라이브러리, 설정을 포함한 표준 패키지이다. [1][3]
예를 들어:
- PostgreSQL 이미지는 데이터베이스 실행에 필요한 바이너리와 설정을 포함할 수 있고 [3]
- Python 웹 애플리케이션 이미지는 Python 런타임, 앱 코드, 의존성을 함께 포함할 수 있다. [3]
즉, 이미지는 실행 준비가 끝난 설계도,
컨테이너는 그 설계도를 실제로 실행한 결과물로 이해하면 된다. [1][3]
6. 이미지의 특징
Docker 이미지의 핵심 특징은 다음 두 가지다. [3]
1) 불변성(Immutable)
이미지는 한 번 생성되면 직접 수정하지 않는다.
변경이 필요하면 새 이미지를 다시 만든다. [3]
2) 레이어(Layer)
이미지는 여러 레이어(layer) 로 구성된다. [1][3]
Dockerfile의 각 명령은 이미지의 레이어를 만들고,
수정된 레이어만 다시 빌드할 수 있어 효율적이다. [1]
7. Docker를 사용할 때의 흐름
Docker를 처음 배울 때는 아래 흐름으로 이해하면 정리가 쉽다.
- 애플리케이션 실행에 필요한 내용을 정의한다.
- 그것을 바탕으로 이미지를 만든다. [1][3]
- 이미지를 실행하면 컨테이너가 생성되고 실행된다. [1][2]
- 실행 중인 컨테이너를 시작, 중지, 삭제하며 관리한다. [1]
즉,
이미지 = 실행에 필요한 것을 담은 패키지
컨테이너 = 이미지를 실행한 결과
이 관계를 먼저 잡아두면 Docker 개념이 훨씬 명확해진다.
8. 면접이나 학습에서 같이 말하면 좋은 포인트
Docker 관련 질문에서는 보통 다음 흐름으로 이어진다.
- Docker란 무엇인가 [1]
- 컨테이너란 무엇인가 [2][4]
- 이미지란 무엇인가 [3]
- 컨테이너와 VM의 차이는 무엇인가 [2]
- 이미지와 컨테이너의 관계는 무엇인가 [1][3]
특히 “컨테이너는 VM이 아니라 호스트 커널을 공유하는 격리된 프로세스” 라는 점을 함께 설명하면
개념 이해가 더 정확해진다. [2][4]
핵심 정리
Docker
- 애플리케이션을 컨테이너로 패키징하고 실행하는 플랫폼 [1]
컨테이너
- 이미지의 실행 인스턴스 [1]
- 호스트 위에서 실행되는 격리된 프로세스 [2][4]
이미지
- 컨테이너 실행에 필요한 파일, 라이브러리, 설정을 담은 읽기 전용 템플릿 [1][3]
중요 포인트
- 컨테이너는 “미니 컴퓨터”처럼 이해할 수는 있지만, 정확히는 VM이 아니라 격리된 프로세스 구조 [2][4]
- 이미지가 실행되면 컨테이너가 된다. [1][3]
참고 자료
- Docker Docs, “What is Docker?”
https://docs.docker.com/engine/docker-overview/ - Docker Docs, “What is a container?”
https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/ - Docker Docs, “What is an image?”
https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/ - Docker Docs, “Running containers”
https://docs.docker.com/engine/containers/run/