[Docker] 프로세스의 분리

4955 단어 Docker초보자

입문


Docker를 사용할 때 Docker의 특징인 컨테이너 분리 프로세스를 학습하고 요약했습니다.

가상 머신 및 컨테이너


가상화 소프트웨어에는 호스트 가상화 소프트웨어, 관리자 가상화 소프트웨어 및 컨테이너 가상화 소프트웨어가 포함됩니다.
가상화 소프트웨어 유형

관리자 가상화


하이퍼매니저 가상화 소프트웨어는 하이퍼매니저라고 불리는 소프트웨어로 가상 하드웨어인'가상 머신'을 제공하여 내빈 운영체제가 마치 물리적 머신에서 실행되는 것처럼 보인다.
초관리 가상화 소프트웨어 시뮬레이션 하드웨어(한 장치, 소프트웨어 또는 시스템의 행위는 다른 소프트웨어가 모방하고 대체한다).

용기 환경


용기 환경은 이름 공간(namespace)과 cgroup이라는 자원 관리 메커니즘을 사용하여 단일 OS 내 여러 용기를 프로세스(Linux에서 실행되는 프로그램)로 실행합니다.
Linux의 "프로세스"는 무엇입니까?

무엇이 명명 공간입니까?


그럼 본론으로 들어갑니다.
상기 관리자형 가상화에서 관리자는 가상화를 실현했지만 Docker의 용기 가상화는 어떻게 분리된 공간을 창조할 수 있습니까?
이름 공간은 Docker 엔진이 컨테이너 가상화를 실현하는 관건입니다.
넓은 의미의 명칭 공간은 다음과 같다.
이름 공간은 Namespace의 번역어로 이름의 집합을 분할하여 충돌의 가능성을 낮추고 참조를 쉽게 하는 개념이다.
네임스페이스 위커
이름 공간은 분리된 개념이 무엇인지를 나타내는 것 같다.

Docker의 네임스페이스


단일 운영 체제 환경에서 Docker는 여러 개의 분리된 공간을 만들 수 있습니다.이 분리된 공간을 실현하는 것은 이름 공간 (namespace) 입니다.
네임스페이스를 사용하면 파일 시스템, 네트워크 무당, 용기마다 시스템 자원을 분리할 수 있습니다.
예를 들어, 분리된 공간 A를 제어하는 프로세스가 다른 분리된 공간 B에서는 보이지 않습니다.
또한 이름 공간은 프로세스를 실현할 수 있을 뿐만 아니라 파일 시스템에 대한 접근 분리도 실현할 수 있다.

Docker가 컨테이너를 만들 때 만든 네임스페이스


Docker가 컨테이너를 작성하면 다음 네임스페이스가 생성됩니다.
  • ipc 이름 공간: Inter Process Communication 이름 공간으로 불리는 내부 프로세스 간 통신을 분리합니다
  • mnt 이름 공간: 프로세스에서 파일 시스템의 마운트 (외부 저장 매체를 처리하는 방법) 정보를 분리하고chroot 명령에 접근하는 동작을 합니다
  • net 이름 공간: 네트워크를 제어하는 이름 공간.모든 net 공간에서 네트워크 인터페이스를 가질 수 있기 때문에 여러 용기와 호스트 간에 네트워크 통신을 할 수 있다

  • pid 이름 공간: 프로세스 분리에 사용됩니다.커널이 제어되며 상위 PID 하위 PID 기반 제어 등에 사용됩니다
  • user 네임스페이스: 사용자 ID와 그룹 ID를 분리합니다.각 사용자 이름 공간에는 개별 사용자 ID와 그룹 ID가 저장됩니다
  • uts 네임스페이스: UTS(UnixTime-Sharing System) 네임스페이스라고 합니다.호스트 이름과 NIS 도메인 이름(NIS 구조에 등장하는 컴퓨터에 추가된 관리상의 이름) 등의 분리에 사용됩니다
  • Linux 마운트 정보
    NIS 도메인 이름

    pid 이름 공간 분리


    앞에서 설명한 대로 Docker 컨테이너를 실행할 때 Docker 엔진은 컨테이너에 이름 공간을 만듭니다.
    각 컨테이너는 다른 네임스페이스에서 실행되며 액세스 권한은 네임스페이스에만 있습니다.
    따라서 호스트 운영체제는 여러 이름공간에 속하는 프로세스가 함께 이동하는 것을 볼 수 있고, 각 이름공간은 이 이름공간에 속하는 프로세스만 볼 수 있다.
    물리적 기반 PID 이름 공간과 컨테이너 기반 PID 이름 공간은 그림과 같이 각각 다음과 같습니다.
  • 물리적 기반 PID 이름 공간
           
  • 컨테이너 기반의 PID 이름 공간
  • 컨테이너의 네임스페이스 구분 예 사용


    예를 들어 Docker 엔진이 실행되는 호스트 운영체제가 두 개의 용기를 작동시켰다고 가정한다. 하나는 웹 서버의 httpd 서비스가 실행되는 용기이고, 다른 하나는 FTP 서버의 vsftpd 서비스가 실행되는 용기이다.
    호스트 운영체제가 1000번 프로세스 ID(PID)를 httpd 수호 프로세스에 분배하고 2000번 프로세스를 PID로 vsftpd 수호 프로세스에 분배하면 호스트 운영체제는 httpd와 vsftpd가 프로세스로 실행되는 것을 볼 수 있습니다.
    이때 httpd 서비스를 실행하는 용기에서 PID의 1번을 httpd에 분배하고, vsftpd 서비스를 실행하는 용기에서 PID의 1번을 vsftpd에 분배한다.
    여기서 httpd가 운행하는 용기와 vsftpd가 운행하는 용기는 서로 다른 PID 명칭 공간이기 때문에 각자의 용기 안에서 서로의 과정을 볼 수 없고 분리된 공간이다.

    마지막


    이번에는 docker의 이름 공간 분리에서 프로세스 id의 분리에 대해 조사했지만, 다른 파일 시스템의 이름 공간도 용기로 분리되었다.또한 하드웨어 자원의 제한은 cgroups의 구조로 진행된다.
    Docker를 사용하기 전에 이러한 Docker의 구조를 학습함으로써 실제 명령을 칠 때도 내부에서 일어나는 일을 연상하기 쉽다.

    참고 자료

  • Docker 설명서
  • 가상화 소프트웨어 유형
  • Linux의 "프로세스"는 무엇입니까?
  • 네임스페이스 위커
  • Linux 마운트 정보
  • NIS 도메인 이름
  • 좋은 웹페이지 즐겨찾기