컨테이너(Container)란?

애플리케이션과 그 실행에 필요한 라이브러리나 설정을 묶어, 호스트 OS의 커널을 공유하면서 다른 프로세스로부터 격리하여 실행하는 실행 단위. Linux에서는 프로세스 ID·네트워크·마운트 등이 보이는 방식을 나누는 네임스페이스와, CPU나 메모리의 사용량을 제한하는 cgroups로 실현된다. OS를 통째로 부팅하는 가상 머신보다 가볍고 시작도 빠르지만, 커널을 공유하므로 호스트와 다른 종류의 OS 커널은 실행할 수 없다. 컨테이너는 컨테이너 이미지로부터 만들어지며, Docker나 Kubernetes 등으로 생성·관리된다.

일본어 명칭: コンテナ

컨테이너(Container)은(는) 클라우드와 컨테이너의 기초, OS와 하드웨어 등 2개 분야의 연습 문제 19개에 나와요.

분야: 클라우드와 컨테이너의 기초

가상 머신과의 차이

가상 머신은 하이퍼바이저 위에서 각각 커널을 포함한 OS를 실행합니다. 컨테이너는 OS를 부팅하지 않고 호스트의 커널 위에서 격리된 프로세스로 동작하므로, 시작이 1초 이하로 끝나는 경우가 많고 1대에 다수를 집어넣을 수 있습니다. 그 대신 격리는 커널의 기능에 의존하므로 가상 머신만큼 강하지는 않습니다. 강한 격리가 필요한 상황에서는 컨테이너를 경량 가상 머신 안에서 실행하는 방식도 사용됩니다.

컨테이너의 파일 시스템

컨테이너의 파일 시스템은 읽기 전용인 이미지 레이어 위에 컨테이너별 쓰기 가능한 레이어를 겹친 것입니다. 이미지의 파일을 수정하면 그 파일이 쓰기 가능한 레이어로 복사된 뒤 변경됩니다(카피 온 라이트). 쓰기 가능한 레이어는 컨테이너를 삭제하면 사라지므로, 남기고 싶은 데이터는 볼륨 등 외부의 저장 영역에 둡니다.

일회용으로 쓰는 설계

컨테이너는 고장 나면 고치는 것이 아니라 이미지로부터 다시 만들어 교체하는 것을 전제로 설계합니다. 설정은 환경 변수 등으로 밖에서 부여하고, 로그는 표준 출력에 써서 기반이 수집하게 하며, 상태는 데이터베이스나 스토리지에 둡니다. 이렇게 해 두면 대수를 늘리고 줄이거나 새 버전으로 교체하기가 쉬워집니다.

도전해 보기: 컨테이너(Container) 관련 문제

컨테이너와 가상 머신의 차이로 올바른 것은?

  1. A컨테이너는 각각 독자적인 OS 커널을 가지고, 가상 머신은 커널을 공유한다
  2. B컨테이너는 하이퍼바이저 위에서 동작하고, 가상 머신은 OS 기능만으로 동작한다
  3. C컨테이너는 커널을 공유하고, 가상 머신은 독자적인 OS를 실행한다
정답과 해설 보기

정답: C. 컨테이너는 커널을 공유하고, 가상 머신은 독자적인 OS를 실행한다

컨테이너는 하나의 OS 커널을 공유하면서 파일 보임 방식, 프로세스, 네트워크, 사용할 수 있는 자원 등을 그룹별로 나누어 격리하는 방식입니다. OS를 통째로 부팅하지 않으므로 가볍고 시작도 빠릅니다. 가상 머신은 하이퍼바이저 위에서 각각 독자적인 커널을 포함한 OS를 실행하므로, 무거운 대신 격리가 강하고 다른 종류의 OS도 실행할 수 있습니다. 커널을 공유하는 것은 컨테이너 쪽이며, 설명이 반대로 되어 있는 선택지에 주의해야 합니다.

Linux의 컨테이너를 실현하는 커널 기능 중 네임스페이스(namespaces)와 cgroups(컨트롤 그룹)의 역할의 조합으로 올바른 것은?

  1. A네임스페이스: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다, cgroups: CPU나 메모리 등 자원의 사용량을 제한·측정한다
  2. B네임스페이스: CPU나 메모리 등 자원의 사용량을 제한·측정한다, cgroups: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다
  3. C네임스페이스: 컨테이너마다 별도의 커널을 부팅하여 서로를 격리한다, cgroups: 컨테이너마다 가상의 CPU를 만들어 하드웨어를 모방한다
정답과 해설 보기

정답: A. 네임스페이스: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다, cgroups: CPU나 메모리 등 자원의 사용량을 제한·측정한다

컨테이너는 호스트의 커널 위에서 동작하는 보통의 프로세스에 두 가지 구조로 격리를 적용한 것입니다. 네임스페이스는 프로세스 ID, 네트워크, 마운트(파일 시스템이 보이는 방식), 호스트 이름 등을 그룹별로 나누어, 컨테이너 안의 프로세스에는 자기 몫만 보이게 합니다. cgroups는 프로세스 그룹이 사용할 수 있는 CPU 시간이나 메모리의 양을 제한하고 사용량을 측정합니다. 둘 다 커널의 기능이므로 컨테이너는 별도의 커널을 부팅하지 않으며, 하드웨어를 모방하지도 않습니다.

자주 묻는 질문

컨테이너 안에서 호스트와 다른 Linux 배포판을 사용할 수 있나요?

사용할 수 있습니다. 이미지에 들어 있는 것은 명령이나 라이브러리 등 사용자 공간의 파일이므로, 다른 배포판의 것을 사용할 수 있습니다. 다만 커널은 호스트의 것을 공유하므로 uname -r은 호스트의 커널을 표시하며, 호스트의 커널에 없는 기능은 사용할 수 없습니다.

Windows나 macOS에서 Linux 컨테이너를 실행할 수 있는 것은 왜인가요?

Docker Desktop 등은 그 안에서 작은 Linux 가상 머신을 실행하고, 그 위에서 Linux 컨테이너를 실행하기 때문입니다. Linux 컨테이너에는 어딘가에 Linux 커널이 필요합니다.

해설 속 컨테이너(Container)

컨테이너(Container)이(가) 나오는 문제 (19)

  1. 컨테이너와 가상 머신의 차이로 올바른 것은?
  2. Linux의 컨테이너를 실현하는 커널 기능 중 네임스페이스(namespaces)와 cgroups(컨트롤 그룹)의 역할의 조합으로 올바른 것은?
  3. Linux 호스트에서 Docker를 사용하여, 호스트와는 다른 배포판을 바탕으로 한 이미지로 컨테이너를 시작하고, 그 안에서 uname -r(커널의 릴리스를 표시하는 명령)과 cat /etc/os-release(배포판 정보를 표시하는 명령)를 실행했다. 결과의 설명으로 올바른 것은?
  4. 컨테이너 이미지와 컨테이너의 관계에 대한 설명으로 올바른 것은?
  5. 어떤 이미지로 시작한 컨테이너 안에서, 이미지에 포함된 설정 파일 /etc/app.conf를 수정했다. Docker의 일반적인 스토리지 구조(overlay2 등)에서 일어나는 일로 올바른 것은?
  6. 위의 Dockerfile에서 docker build로 이미지를 만들 때 실행되는 명령과, docker run으로 컨테이너를 시작할 때 실행되는 명령의 조합으로 올바른 것은?
  7. 위의 Dockerfile로 만든 이미지 pinger를 docker run pinger example.com으로 시작했다. 컨테이너 안에서 실행되는 명령으로 올바른 것은?
  8. 포트 80에서 대기하는 웹 서버의 이미지 nginx로부터 위의 명령으로 컨테이너를 시작했다. 호스트의 IP 주소는 192.0.2.10이고 방화벽 등의 제한은 없다고 하자. 같은 네트워크에 있는 다른 PC의 브라우저에서 이 웹 서버에 접속하는 URL로 올바른 것은?
  9. Docker에서 컨테이너가 쓴 데이터를 남기기 위한 명명된 볼륨과 바인드 마운트의 설명으로 올바른 것은?
  10. Kubernetes에서 배포하고 관리하는 최소 단위로, 하나 이상의 컨테이너를 묶어 같은 IP 주소와 볼륨을 공유하게 하는 것은?
  11. 어떤 웹 애플리케이션은 시작한 뒤 캐시를 읽어 들일 때까지의 약 60초 동안은 요청을 처리할 수 없고, 그동안은 /ready에 503을 반환한다. Pod의 컨테이너에 위의 설정을 추가했을 때의 효과로 올바른 것은?
  12. Pod의 컨테이너에 위의 설정을 한 Deployment에서 Pod가 4개 동작하고 있으며, 모든 Pod가 CPU를 400m(0.4코어)씩 사용하고 있다. HorizontalPodAutoscaler의 CPU 사용률 목표를 60%로 하고, 필요한 Pod의 수는 ⌈현재 수 × 현재 사용률 ÷ 목표 사용률⌉로 구한다고 하자. 필요한 Pod의 수로 올바른 것은?
  13. Kubernetes에서 컨테이너에 설정하는 자원의 requests와 limits의 설명으로 올바른 것은?
  14. 할당 가능한 자원이 CPU 4코어, 메모리 8 GiB인 노드가 있다. 각 Pod의 컨테이너에는 requests로 CPU 500m·메모리 1.5 GiB, limits로 CPU 1코어·메모리 2 GiB를 설정했다. 다른 Pod나 시스템 예약은 없다고 하자. 이 노드에 둘 수 있는 Pod의 최대 수로 올바른 것은?
  15. 위와 같이 데이터베이스의 접속 대상을 이미지에 써 넣지 않고, 컨테이너를 시작할 때 환경 변수로 전달하도록 했다. 이 설계의 주된 이점으로 가장 적절한 것은?

관련 용어

Pod Docker Kubernetes 환경 변수(Environment Variable) 하이퍼바이저(Hypervisor) CPU 시간(CPU time) 컨테이너 이미지(Container Image) 카피 온 라이트(Copy-on-Write) JSON(JavaScript Object Notation) 인수(Argument)

용어집으로 돌아가기