[Docker]도커 원리의 간단 이해

JH Bang·2022년 6월 30일
1

개발 지식

목록 보기
2/11

리눅스 컨테이너

리눅스 컨테이너란 운영체제 커널을 제외한 나머지 모든 프로세스와 독립적인 1개 이상의 프로세스를 실행하는 기술을 말한다. 정말 말그대로 '컨테이너'에 프로그램을 포장해서 다른 프로세스들과는 독립적으로 실행되는 것이다. 이 리눅스 컨테이너에 좀더 기능을 추가하고 쉽게 사용할 수 있게 만든 프로그램이 바로 도커(Docker) 엔진이다. 도커는 사실상 컨테이너의 표준으로 자리잡은 상태다.

가상머신과의 차이

가상머신은 하드웨어를 에뮬레이션, 즉 흉내낸다. 그래서 호스트OS 위에서 혹은 함께 동작하는 하이퍼바이저가 필요하다. 그 위에서 게스트OS가 돌아가면서 가상의 독립된 컴퓨터로 동작한다. 하이퍼바이저를 통해 자원을 할당받고 게스트OS까지 동작시켜야 하는 이유로 상당히 비효율적이다.
반면 도커 컨테이너는 호스트OS 상에서 동작하는 프로세스다. 다른 프로세스와 같은 계층에서 실행되지만 프로세스 단위로 독립된 환경에서 실행된다.

어떻게 구현하나

리눅스 컨테이너를 구현하려면 리눅스 시스템 콜인 chroot나 네임스페이스, cgroup, 유니온 마운트 등의 기능을 활용해야 한다.

💡cgroup(control group)

CPU 시간, 시스템 메모리, 네트워크 대역폭 등의 자원을 프로세스 그룹 단위로 제어하는 리눅스 커널의 기능이다.

💡namespace

같은 이름의 함수나 변수 등도 각기의 프로세스에서는 유일하고 독립적인 존재로 만들어 주는 개념이라 보면 된다.

cgroup은 특정 프로세스들에 할당되는 '자원'을 제한하는 기능, namspace는 특정 프로세스들이 다른 프로세스를 참조할 수 있는 '범위'를 제한하는 기능이라고 보면 쉽다.

💡union mount

통합이란 뜻의 union과 물리자원을 디렉토리에 연결하는 과정인 mount의 합성어로 여러 디렉토리를 한 마운트에서 표현되도록 겹쳐 놓은 것을 말한다.

💡chroot

프로세스가 실행되는 루트를 변경하는 시스템콜이다. 유닉스 계열 OS의 파일시스템은 root(/) 디렉토리를 기준으로 다른 파일을들 탐색할 수 있는데, 어떤 A라는 프로세스를 '/'가 아닌 그 밑의 특정 디렉토리를 루트디렉토리로 가지게 만들면 A프로세스는 '/'를 root로 가지는 다른 파일에 접근할 수 없게된다.

도커 이미지

도커 컨테이너는 원하는 프로세스를 독립적으로 실행하기 위한 기술이다. 이 때 특정 프로세스를 실행하기 위한 환경 상태들을 여러 파일로 저장해놓게 되는데, 이를 도커에서는 이미지라고 한다. 이미지는 유니언 마운트를 이용해 레이어를 겹겹이 쌓아 올리는 방식으로 만들어 진다.
도커 이미지는 컨테이너를 생성할 때 필요하며, 가상머신의 ISO역할과 비슷하다.[저장소]/[이미지]:[태그] 의 형식으로 이뤄져 있다. 이미지니는 도커허브에서 가져올 수 있다. 태그는 이미지의 버전으로 default값으로 가장 최신버전으로 가져온다.
이미지(파일들의 모음)를 바탕으로 독립적인 프로세스가 실행되면, 그것이 바로 컨테이너다.

이미지와 컨테이너의 관계

쉽게 말해 이미지는 프로그램 설치 CD이고 컨테이너는 그 프로그램을 실행한 프로세스다. 컨테이너로 무엇을 하든 이미지에는 변화가 없다. 서로 독립적이다.
다만 컨테이너(독립된 프로세스)에 새로운 파일을 더해 새로운 이미지로 만들수는 있다. 컨테이너는 레이어 구조로 이뤄져 있는데, 프로세스 실행에 필요한 모든 레이어들(이미지) 위에 컨테이너 레이어가 실행되기 때문이다. 모든 변경사항은 이 최상단 레이어에 쓰여지고, 컨테이너가 삭제되면 모두 사라지게 된다.
또한 이같은 도커 컨테이너의 특성 덕분에 마치 Git처럼 버전 관리를 할 수 있게 된다.

profile
의지와 행동

0개의 댓글