powerdns 반복자가 포함된 컨테이너를 생성하기 위한 다음 Dockerfile이 있습니다.
FROM debian:stretch-slim
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
apt-get install --no-install-recommends -y \
pdns-recursor && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
COPY ./configuration/recursor.conf /etc/powerdns/recursor.conf
RUN chown -R :pdns /etc/powerdns/ && \
chmod 0750 /etc/powerdns/ && \
chmod 0640 /etc/powerdns/recursor.conf
EXPOSE 8699
ENTRYPOINT ["/usr/sbin/pdns_recursor", "--daemon=no"]
내 recursor.conf
모습은 다음과 같습니다.
config-dir=/etc/powerdns
forward-zones=resolver1.opendns.com=208.67.222.222
hint-file=/usr/share/dns/root.hints
local-address=0.0.0.0
local-port=8699
quiet=yes
security-poll-suffix=
setgid=pdns
setuid=pdns
하이퍼바이저에서 IPv6이 비활성화되어 있습니다.
문제는 docker가 컨테이너를 제대로 중지할 수 없다는 것입니다 docker stop recursor
. 잠시 후 OOMKiller는 프로그램을 종료하고 다음 메시지를 제공합니다.
Exited (137) 2 seconds ago
128
신호 + 9
=는 RAM이 충분하지 않다는 것을 온라인에서 검색했지만 137
그렇지 않습니다. 컨테이너 내부에서 PID 1()을 실행 docker exec -it recursor /bin/bash
하고 종료하려고 하면 아무 일도 일어나지 않습니다. 서비스는 아무 일도 일어나지 않은 것처럼 계속 실행됩니다.kill -9 -- 1
또한 데몬 모드에서 재귀 프로그램을 시작해 보았습니다. 결과는 동일했습니다.
왜 이런 일이 일어나는지 아는 사람이 있나요?
답변1
PID 1의 프로세스가 init 프로세스입니다. 이는 pid 네임스페이스나 컨테이너 내에서도 여전히 적용됩니다. 이 pid 1은 신호 처리기가 정의되어 SIGKILL
있지 않기 때문에 종료될 수 없습니다.KILL
어느기타 사용자 모드 프로세스.
정말 죽이고 싶으면 죽여야지호스트에서. 호스트 컴퓨터에서 실행합니다(충분한 권한, 아마도 루트 사용).
kill -KILL $(docker inspect --format '{{.State.Pid}}' containername)
PID 1을 삭제하면 컨테이너가 중지되므로 전체 컨테이너가 종료됩니다. 나는 질문 제목에 답변했지만 기본 질문인 OOM의 원인에 대해서는 답변하지 않았습니다.
업데이트: 사용하기 더 쉬울 수도 있습니다.docker kill
, 기본값은 KILL
신호입니다. 그것은 다음과 같습니다:
docker kill containername
업데이트 2: PID 1이 종료될 수 없는지 확인하세요 SIGKILL
(일명 -9
).심지어컨테이너에서(이 예에서는 사용자 네임스페이스를 활성화해야 합니다. 그렇지 않으면 unshare --mount-proc --fork --pid
루트만 사용됩니다).
첫 번째 터미널:
$ unshare --map-root-user --mount-proc --fork --pid
# echo $$
1
# pstree -p
bash(1)---pstree(88)
# kill -9 1
#
효과 없음
두 번째 터미널에서:
$ pstree -p $(pidof unshare)
unshare(2023)───bash(2024)
$ kill -9 2024
첫 번째 터미널:
# Killed
$