cgroupv2의 경우 Docker는 기본적으로 cgroup의 개인 네임스페이스를 사용합니다. 이는 --cgroupns
for 플래그 docker run
및 데몬 옵션에 의해 default-cgroupns-mode
제어 됩니다. 컨테이너 내부에 하위 cgroup을 생성해야 하지만문제는 컨테이너 내부의 루트 cgroup에 빈 그룹이 있다는 것입니다 cgroup.subtree_control
!컨테이너가 실행 중일 때 이 루트 cgroup에 이미 프로세스가 있기 때문에 컨테이너에 이를 채울 수 없습니다. 이를 시도하면 "장치 또는 리소스가 사용 중입니다." 오류가 발생합니다.
--cgroupns host
이것은 해결 방법이기는 하지만, 가능하다면 유지하고 싶은 개인 네임스페이스를 사용하지 않습니다. 추가 질문은 현재절대작성 파일에서 설정하십시오.
조사해 보니 --cgroup-parent
,할 수 있는작성 파일을 통해 설정합니다. 그런데 저는 이 설정이 정말 이해가 되지 않습니다. 호스트에 cgroup을 생성하고 여기에 쓴 subtree_control
다음 해당 cgroup을 상위 컨테이너로 사용하여 컨테이너를 시작하려고 했습니다. 이 오류가 발생하는데 이해가 되지 않습니다.
데몬의 오류 응답: systemd cgroup의 cgroup-parent는 'xxx.slice'라는 유효한 슬라이스여야 합니다.
내 생각에 이 설정은 cgroup_namespaces
맨페이지의 다음 참조 내용에서 "현재 cgroups 디렉터리"를 변경하는 것입니다.
프로세스가 CLONE_NEWCGROUP 플래그와 함께 clone(2) 또는 unshare(2)를 사용하여 새 cgroup 네임스페이스를 생성하면 현재 cgroups 디렉터리가 새 네임스페이스의 cgroup 루트 디렉터리가 됩니다.
그럼에도 불구하고 컨테이너를 시작하기 전에 호스트에서 cgroup을 수동으로 구성해야 하는 것은 번거로운 작업입니다. cgroup.subtree_control
필요한 컨트롤러가 컨테이너에서 활성화되도록 하려면 어떤 대안이 있어야 합니까 ?
답변1
컨테이너에 하위 cgroup을 생성하고 각 PID를 /sys/fs/cgroup/cgroup.procs
하위 cgroup으로 이동한 /sys/fs/cgroup/cgroup.subtree_control
다음 "장치 또는 리소스 사용 중" 오류 없이 쓸 수 있습니다.