>  기사  >  운영 및 유지보수  >  Docker가 격리하는 리소스

Docker가 격리하는 리소스

青灯夜游
青灯夜游원래의
2022-01-28 15:35:514333검색

도커에 의해 격리된 리소스: 1. 파일 시스템, 3. 프로세스 간 통신, 4. 권한을 위한 사용자 및 사용자 그룹, 호스트 이름 및 도메인 이름 , 등.

Docker가 격리하는 리소스

이 튜토리얼의 운영 환경: linux5.9.8 시스템, docker-1.13.1 버전, Dell G3 컴퓨터.

Docker 컨테이너의 본질

Docker 컨테이너의 본질은 호스트의 프로세스입니다.

Docker는 namespace를 통한 리소스 격리, cgroups를 통한 리소스 제한, *copy-on-write*를 통한 효율적인 파일 작업을 구현합니다.

Linux 네임스페이스 메커니즘

네임스페이스 메커니즘은 리소스 격리 솔루션을 제공합니다.

PID, IPC, 네트워크 및 기타 시스템 리소스는 더 이상 전역이 아니며 특정 네임스페이스에 속합니다.

각 네임스페이스 아래의 리소스는 투명하며 다른 네임스페이스 아래의 리소스에 표시되지 않습니다.

Linux 커널 구현 네임스페이스의 주요 목적 중 하나는 경량 가상화(컨테이너) 서비스를 구현하는 것입니다. 동일한 네임스페이스의 프로세스는 서로의 변경 사항을 인식하고 외부 프로세스에 대해 아무것도 알 수 없어 독립성과 격리 목적을 달성합니다.

네임스페이스로 격리할 수 있는 것

컨테이너가 다른 컨테이너를 방해하지 않는 경우 다음을 수행할 수 있어야 합니다.

  • 파일 시스템을 격리해야 합니다

  • 네트워크에도 다음이 필요합니다. 격리되려면

  • 프로세스 간 통신도 격리되어야 합니다

  • 권한을 위해 사용자와 사용자 그룹도 격리되어야 합니다

  • 프로세스 내의 PID도 격리되어야 합니다. 호스트

  • 컨테이너에는 자체 호스트 이름

도 있어야 합니다. 위의 격리를 통해 컨테이너를 호스트 및 다른 컨테이너로부터 격리할 수 있다고 믿습니다.

Linux 네임스페이스가 이를 수행할 수 있습니다.

namespace 콘텐츠 격리 시스템 호출 매개변수
UTS 호스트 이름 및 도메인 이름 CLONE_NEWUTS
IPC 세마포어, 메시지 대기열 및 공유 메모리 CLONE_NEWIPC
Network 네트워크 장치, 네트워크 스택, 포트 등 CLONE_NEWNET
PID 프로세스 번호 CLONE_NEWPID
Mount 마운트 지점(파일 시스템) CLONE_NEWNS
사용자 사용자 및 사용자 그룹 CLONE_NEWUSER

UTS 네임스페이스

UTS(UNIX TIme-sharing System) 네임스페이스는 호스트와 도메인 이름의 격리를 제공하므로 각 Docker 컨테이너는 독립적인 호스트 이름과 도메인 이름을 가질 수 있으며 네트워크에서 독립 노드로 간주될 수 있습니다. . 호스트 시스템의 프로세스가 아닙니다.
Docker에서 각 이미지는 기본적으로 제공하는 서비스 이름을 따서 호스트 이름으로 명명되며 호스트에 아무런 영향을 미치지 않습니다.

IPC 네임스페이스

IPC(Inter-Process Communication) 설계 IPC 리소스에는 공통 세마포어, 메시지 대기열 및 공유 메모리가 포함됩니다.
IPC 리소스를 신청할 때 전역적으로 고유한 32비트 ID를 신청합니다.
IPC 네임스페이스에는 시스템 IPC 식별자와 POSIX 메시지 대기열을 구현하는 파일 시스템이 포함되어 있습니다.
동일한 IPC 네임스페이스에 있는 프로세스는 서로 볼 수 있지만, 다른 네임스페이스에 있는 프로세스는 서로 볼 수 없습니다.

PID 네임스페이스

PID 네임스페이스 격리는 프로세스 PID의 번호를 다시 매기는 것입니다. 즉, 서로 다른 두 네임스페이스에 속한 프로세스는 동일한 PID를 가질 수 있으며 각 PID 네임스페이스에는 자체 계산 프로그램이 있습니다.
커널은 모든 PID 네임스페이스에 대해 트리 구조를 유지합니다. 최상위 레벨은 시스템이 초기화될 때 생성되며 루트 네임스페이스라고 합니다. 새로 생성된 PID 네임스페이스를 하위 네임스페이스라고 하며, 원래 PID 네임스페이스는 새로 생성된 PID 네임스페이스의 하위 네임스페이스이고, 원래 PID 네임스페이스는 새로 생성된 PID 네임스페이스의 상위 네임스페이스입니다.
이러한 방식으로 서로 다른 PID 네임스페이스는 계층적 시스템을 형성합니다. 자신이 속한 상위 노드는 하위 노드의 프로세스를 볼 수 있으며 신호 및 기타 방법을 통해 하위 노드의 프로세스에 영향을 미칠 수 있습니다. 그러나 하위 노드는 상위 노드의 PID 네임스페이스에 있는 어떤 것도 볼 수 없습니다.

mount 네임스페이스

mount 네임스페이스는 파일 시스템 마운트 지점 격리를 통해 파일 시스템 격리를 지원합니다.
격리 후에는 서로 다른 마운트 네임스페이스의 파일 구조 변경 사항이 서로 영향을 미치지 않습니다.

network 네임스페이스

network 네임스페이스는 주로 네트워크 장비, IPv4, IPv6 프로토콜 스택, IP 라우팅 테이블, 방화벽, /proc/net 디렉터리, /sys/class/net 디렉터리, 제품군을 포함한 네트워크 리소스 격리를 제공합니다. 등.

사용자 네임스페이스

사용자 네임스페이스는 설치 관련 식별자와 속성을 분리합니다.

네임스페이스 작업

네임스페이스 API에는 clone() setns() unshare() 및 /proc 파일 아래 부분이 포함됩니다.
분리할 네임스페이스는 다음 6개 매개변수 중 하나 이상을 지정하여 분리해야 합니다. 6개의 매개변수는 위 표에 언급된 CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWPID, CLONE_NEWNET, CLONE_NEWUSER입니다.

clone()

clone()을 사용하여 독립적인 네임스페이스를 갖는 프로세스를 생성하는 것이 가장 일반적인 방법이며, 또한 Docker가 사용하는 네임스페이스입니다. 가장 기본적인 방법입니다.

int clone(int(*child_func)(void *),void *child_stack,int flags, void *arg);

clone()은 플래그를 통해 사용되는 함수 수를 제어할 수 있는 Linux 시스템 호출 fork()의 보다 일반적인 구현입니다.
복제 프로세스의 모든 측면을 제어하는 ​​20가지 이상의 CLONE_* 플래그가 있습니다.

  1. child_func는 하위 프로세스가 실행하는 프로그램의 주요 기능을 전달합니다.
  2. child_stack은 하위 프로세스가 사용하는 스택 공간을 전달합니다.
  3. flags는 어떤 CLONE_* 플래그가 사용되는지 식별합니다. 주로 6개입니다. 위에서 언급한.
  4. args는 사용자 매개변수를 전달하는 데 사용됩니다.

/proc/[pid]/ns

사용자는 /proc/[pid]/ns 파일에서 다른 네임스페이스를 가리키는 파일을 볼 수 있습니다.

ls -l /proc/10/ns

Docker가 격리하는 리소스

대괄호 안의 네임스페이스 번호

두 프로세스가 가리키는 네임스페이스 번호가 동일하다면 같은 네임스페이스에 있다는 뜻

링크를 설정하는 목적은 모두 네임스페이스 아래의 프로세스는 종료되면 이 네임스페이스가 항상 존재하며 후속 프로세스가 참여할 수 있습니다.
--bind 메서드를 사용하여 /proc/[pid]/ns 디렉터리 파일을 마운트하면 링크로도 작동할 수 있습니다

touch ~/utsmount --bind /proc/10/ns/uts ~/uts

setns()

Docker에서 docker exec 명령을 사용하여 이미 명령 실행 명령에는 setns()를 사용해야 합니다.
setns() 시스템 호출을 통해 프로세스는 원래 네임스페이스에서 기존 네임스페이스에 합류합니다
일반적으로 프로세스 호출자에게 영향을 주지 않고 새로 추가된 pid 네임스페이스를 적용하기 위해 setns( ) 함수가 실행됩니다. clone()은 명령을 계속 실행하기 위해 하위 프로세스를 생성하여 원래 프로세스의 실행을 종료합니다.

int setns(int fd, in nstype);
#fd 表示要加入namespace的文件描述符。是一个指向/proc/[pid]/ns目录的文件描述符,打开目录链接可以获得
#nstype 调用者可以检查fd指向的namespace类型是否符合实际要求,该参数为0则不检查

새로 추가된 네임스페이스를 활용하려면 사용자 명령을 실행할 수 있는 execve() 일련의 함수를 도입해야 합니다. 가장 일반적으로 사용되는 것은 /bin/bash를 호출하고 매개변수를 수락하는 것입니다

unshare()

unshare( )를 통해 원래 프로세스에서 네임스페이스 격리
Unshare는 복제와 매우 유사하며 새 프로세스를 시작할 필요가 없으며 원래 프로세스에서 사용할 수 있습니다.
docker는

fork() 시스템 호출을 사용하지 않습니다.

fork는 네임스페이스 API에 속하지 않습니다

강력한 커널 도구 cgroups

cgroups는 Linux 커널에서 제공하는 메커니즘입니다. 이 메커니즘은 일련의 시스템 작업과 해당 하위 작업을 필요에 따라 리소스 수준에 따라 다른 그룹으로 통합(또는 분리)할 수 있으므로 시스템 리소스 관리 기능을 제공합니다. 통합된 프레임워크.

cgroups는 Linux의 또 다른 강력한 커널 도구로, 네임스페이스로 격리된 리소스를 제한할 수 있을 뿐만 아니라 리소스에 대한 가중치 설정, 사용량 계산, 작업(프로세스 또는 카운티) 시작 및 중지 제어 등도 가능합니다. 직설적으로 말하면 cgroup은 작업 그룹에서 사용하는 물리적 리소스(CPU, 메모리, IO 등 포함)를 제한하고 기록할 수 있습니다. 이는 Docker와 같은 일련의 가상화 관리 도구를 구축하는 초석입니다.

cgroups의 역할

cgroups는 개별 리소스 제어부터 운영 체제 수준 가상화까지 리소스 관리를 위한 통합 인터페이스를 제공합니다. cgroups는 4가지 주요 기능을 제공합니다.

  • 리소스 제한
    • cgroups는 작업에 사용되는 총 리소스를 제한할 수 있습니다.
      • 애플리케이션이 실행 중일 때 사용하는 메모리의 상한을 설정하면 할당량이 초과되면 OOM 프롬프트가 표시됩니다.
  • 우선순위 할당
    • 할당된 CPU 타임 슬라이스 및 디스크 수를 통해 IO 대역폭 크기는 실제로 제어와 동일합니다. 실행 중인 작업의 우선 순위
  • 리소스 통계
    • cgroups는 CPU 사용 시간, 메모리 사용량 등 시스템 리소스 사용량
      • 을 계산할 수 있습니다. 이 기능은 청구에 매우 적합합니다
  • 작업 제어
    • cgroup은 작업을 일시 중지하고 재개할 수 있습니다

권장 학습: "docker 비디오 튜토리얼"

위 내용은 Docker가 격리하는 리소스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.