두 가지 핵심 기술: 1. 전역 시스템 리소스를 일종의 캡슐화 및 격리하여 서로 다른 네임스페이스의 프로세스가 독립적인 전역 시스템 리소스를 갖도록 하는 "Linux 네임스페이스" 2. 호스트를 격리할 수 있는 "제어 그룹" 리소스 할당량 및 측정을 구현하기 위한 머신 물리적 리소스입니다.
이 튜토리얼의 운영 환경: linux5.9.8 시스템, docker-1.13.1 버전, Dell G3 컴퓨터.
Docker는 Go 언어 기반의 클라우드 오픈소스 프로젝트입니다.
Docker는 가상화 기술을 통해 개발 환경, 테스트 환경 및 생산 환경 간의 일관성 문제를 해결하여 앱과 실행 환경이 "어디서나 모든 앱을 구축, 배송 및 실행"이라는 목적을 달성할 수 있도록 합니다. 지속적인 통합을 촉진하고 전반적인 릴리스 및 확장을 촉진하는 컨테이너 가상화 기술입니다.
Docker의 두 가지 핵심 기술: 네임스페이스와 컨트롤러 그룹.
1. 격리: Linux 네임스페이스(ns)
Linux 네임스페이스는 일종의 글로벌 시스템 리소스를 캡슐화하고 격리하므로 서로 다른 네임스페이스의 프로세스가 독립적인 글로벌 시스템 리소스를 가지므로 시스템 리소스를 변경하는 경우에만 현재 네임스페이스의 프로세스에 영향을 미치고 다른 네임스페이스의 프로세스에는 영향을 미치지 않습니다. 이러한 리소스에는 프로세스 트리, 네트워크 인터페이스, 마운트 지점, 프로세스 간 통신 및 기타 리소스가 포함됩니다. 동일한 네임스페이스에 있는 프로세스는 서로의 변경 사항을 인식할 수 있으며 외부 프로세스에 대해서는 아무것도 알 수 없습니다. 이는 컨테이너의 프로세스가 독립적인 시스템에 있는 것처럼 보이게 하여 격리 목적을 달성할 수 있습니다.
각 사용자 인스턴스는 서로 격리되어 있으며 서로 영향을 주지 않습니다. 일반적인 하드웨어 가상화 방식이 주는 방식은 VM이고, LXC에서 주는 방식은 컨테이너, 좀 더 구체적으로 말하면 커널 네임스페이스이다. 그 중 pid, net, ipc, mnt, uts, user 및 기타 네임스페이스에는 컨테이너의 프로세스, 네트워크, 메시지, 파일 시스템, UTS("UNIX 시간 공유 시스템")가 포함됩니다. ") 및 사용자 공간은 격리됩니다.
1), pid 네임스페이스
서로 다른 사용자의 프로세스는 pid 네임스페이스를 통해 격리되며, 서로 다른 네임스페이스는 동일한 pid를 가질 수 있습니다. docker에 있는 모든 LXC 프로세스의 상위 프로세스는 docker 프로세스이며, 각 lxc 프로세스는 서로 다른 네임스페이스를 갖습니다. 동시에 중첩이 허용되므로 Docker 내의 Docker를 쉽게 구현할 수 있습니다.
2), net 네임스페이스
pid 네임스페이스를 사용하면 각 네임스페이스의 pid를 서로 격리할 수 있지만 네트워크 포트는 여전히 호스트 포트를 공유합니다. 네트워크 격리는 net 네임스페이스를 통해 이루어집니다. 각 net 네임스페이스에는 독립적인 네트워크 장치, IP 주소, IP 라우팅 테이블 및 /proc/net 디렉터리가 있습니다. 이러한 방식으로 각 컨테이너의 네트워크를 격리할 수 있습니다. 기본적으로 docker는 veth를 사용하여 컨테이너의 가상 네트워크 카드를 호스트의 docker 브리지인 docker0에 연결합니다.
3) ipc 네임스페이스
컨테이너의 프로세스 상호 작용은 공통 세마포어, 메시지 대기열 및 공유 메모리를 포함하여 여전히 일반적인 Linux 프로세스 간 상호 작용 방법(프로세스 간 통신 - IPC)을 사용합니다. 그러나 VM과 달리 컨테이너의 프로세스 간 상호 작용은 실제로 호스트의 동일한 pid 네임스페이스와의 프로세스 간 상호 작용이므로 IPC 리소스를 신청할 때 네임스페이스 정보를 추가해야 합니다. 각 IPC 리소스에는 고유한 32 -비트 ID.
4) mnt 네임스페이스
는 chroot와 유사하며 실행을 위해 특정 디렉터리에 프로세스를 배치합니다. mnt 네임스페이스를 사용하면 서로 다른 네임스페이스의 프로세스가 서로 다른 파일 구조를 볼 수 있으므로 각 네임스페이스의 프로세스가 보는 파일 디렉터리가 격리됩니다. chroot와 달리 각 네임스페이스에 있는 컨테이너의 /proc/mounts에 있는 정보에는 네임스페이스의 마운트 지점만 포함됩니다.
5), uts 네임스페이스
UTS("UNIX Time-sharing System") 네임스페이스를 사용하면 각 컨테이너가 독립적인 호스트 이름과 도메인 이름을 가질 수 있으므로 네트워크에서 컨테이너가 아닌 독립적인 노드로 간주될 수 있습니다. 프로세스를 호스팅합니다.
6), 사용자 네임스페이스
각 컨테이너는 서로 다른 사용자 및 그룹 ID를 가질 수 있습니다. 즉, 호스트의 사용자 대신 컨테이너 내부의 사용자를 사용하여 프로그램을 실행할 수 있습니다.
2. 리소스 제한: 제어 그룹(cgroups)
네임스페이스는 새로 생성된 프로세스에 대해 파일 시스템, 네트워크 및 프로세스를 호스트 시스템에서 격리하지만 네임스페이스는 이를 수행할 수 없습니다. 격리. 그러나 서로와 호스트 시스템에 대해 전혀 모르는 동일한 시스템에서 여러 컨테이너를 실행하는 경우 이러한 컨테이너는 호스트 시스템의 물리적 리소스를 공동으로 점유합니다.
제어 그룹(줄여서 CGroup)은 CPU, 메모리, 디스크 I/O, 네트워크 대역폭과 같은 호스트 시스템의 물리적 리소스를 격리할 수 있습니다. 각 CGroup은 동일한 표준과 매개변수로 제한되는 프로세스 그룹입니다. 서로 다른 CGroup 간에는 계층적 관계가 있습니다. 즉, 상위 클래스에서 리소스 사용을 제한하기 위한 일부 표준과 매개변수를 상속받을 수 있습니다.
cgroups는 할당량 및 리소스 측정을 구현합니다. cgroups의 사용은 매우 간단합니다. 파일과 유사한 인터페이스를 제공합니다. /cgroup 디렉터리에 새 폴더를 생성하고 이 폴더에 새 작업 파일을 작성하여 프로세스를 실현합니다. . 자원 제어. 그룹은 blkio, cpu, cpuacct, cpuset, devices, Freezer, memory, net_cls 및 ns의 9개 하위 시스템의 리소스를 제한할 수 있습니다. 다음은 각 하위 시스템에 대한 자세한 설명입니다.
blkio 이 하위 시스템 설정은 각 블록 장치를 제한합니다. 입출력 제어. 예: 디스크, CD, USB 등
cpu 이 하위 시스템은 스케줄러를 사용하여 cgroup 작업에 CPU 액세스를 제공합니다.
cpuacct는 cgroup 작업에 대한 CPU 리소스 보고서를 생성합니다.
cpuset 멀티 코어 CPU인 경우 이 하위 시스템은 cgroup 작업에 별도의 CPU와 메모리를 할당합니다.
devices cgroup 작업을 통해 장치에 대한 액세스를 허용하거나 거부합니다.
freezer는 cgroup 작업을 일시 중지했다가 다시 시작합니다.
memory는 각 cgroup의 메모리 제한을 설정하고 메모리 리소스 보고서를 생성합니다.
net_cls는 cgroup 편의를 위해 각 네트워크 패킷에 태그를 지정합니다.
ns 네임스페이스 하위 시스템.
위의 9개 하위 시스템 간에도 특정 관계가 있습니다. 자세한 내용은 공식 문서를 참조하세요.
추천 학습: "docker 비디오 튜토리얼"
위 내용은 Docker의 두 가지 핵심 기술은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!