Docker 용기 내 신호 처리

5863 단어 Docker
원본 주소:http://www.damonyi.cc/?p=197  
   Docker Container 를 닫 는 방법: docker stop 을 사용 할 때 Container 를 닫 으 라 고 명령 할 때 이 명령 은 SIGTERM 을 보 냅 니 다. Container 주 프로 세 스에 명령 하여 주 프로 세 스에 이 신 호 를 처리 하고 Container 를 닫 습 니 다. 10s 내 에서 용 기 를 닫 지 않 으 면 Docker Damon 은 SIGKILL 을 보 냅 니 다. 신 호 는 Container 를 닫 습 니 다.
       Signal
       Signal 내부 프로 세 스 를 나타 내 는 통신 메커니즘 입 니 다. 하나의 신 호 는 커 널 에서 프로 세 스 로 보 내 는 메 시 지 를 표시 합 니 다. 이 메 시 지 는 어떤 사건 이 발생 했 음 을 나타 냅 니 다. 프로 세 스 가 이 신 호 를 받 으 면 프로 세 스 가 중단 되 고 신호 처리 핸들 은 이 신 호 를 처리 합 니 다. 이 신호 에 대한 핸들 이 없 으 면 기본 핸들 로 이 신 호 를 처리 합 니 다.
        프로 세 스 는 자신 이 처리 할 수 있 는 신 호 를 리 셋 함수 로 시스템 커 널 에 등록 합 니 다. 터미널 에서 Kill 명령 을 실행 할 때 실제로 커 널 에 다른 프로 세 스에 신 호 를 보 내 는 것 을 알 립 니 다.흔 한 신호 SIGTERM, 이 신 호 는 프로 세 스 가 종료 되 고 종 료 됨 을 알 립 니 다. 프로 세 스 가 이 신 호 를 받 았 을 때 Socket 닫 기, 데이터베이스 연결, 임시 파일 삭제 등 을 실행 할 수 있 습 니 다.많은 데 몬 들 이 SIGHUP 신 호 를 처리 하여 설정 파일 을 다시 불 러 올 수 있 습 니 다. SIGUSR 1 과 SIGUSR 2 는 사용자 정의 신호 로 응용 프로그램 에서 이 신 호 를 처리 할 수 있 습 니 다.
  예 를 들 어 Node. js 에서 SIGTERM 신 호 를 처리 합 니 다.
  
process.on('SIGTERM', function() {  console.log('shutting down...');});

   프로 세 스 가 SIGTERM 신 호 를 처리 할 때 이 신 호 를 처리 하 는 핸들 은 프로그램의 실행 을 중단 시 킵 니 다. 이 핸들 이 실 행 된 후에 야 프로그램 이 계속 실 행 됩 니 다. 흔히 볼 수 있 는 신 호 는 다음 표 와 같 습 니 다. SIGKILL 말고. SIGSTOP 신호 외 에 다른 신 호 는 프로 세 스 에 의 해 종 료 될 수 있 습 니 다.
 
   
 
Docker 의 신호
Docker 명령 "docker kill" 용기 안의 메 인 프로 세 스에 신 호 를 보 냅 니 다.
Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]Kill a running container using SIGKILL or a specified signal    -s, --signal="KILL"    Signal to send to the container

용기 에 보 내 는 신 호 는 용기 의 주 프로 세 스 (PID 는 1) 에 의 해 처 리 됩 니 다. 주 프로 세 스 는 이 신 호 를 무시 하고 기본 동작 을 수행 하거나 이 신호 에 반전 함 수 를 제공 할 수 있 습 니 다.
예 를 들 어 용기 에서 응용 프로그램 을 실행 하고 신호 처리 핸들 을 검사 합 니 다.
var http = require('http');var server = http.createServer(function (req, res) {  res.writeHead(200, {'Content-Type': 'text/plain'});  res.end('Hello World
');}).listen(3000, '0.0.0.0');console.log('server started');var signals = { 'SIGINT': 2, 'SIGTERM': 15};function shutdown(signal, value) { server.close(function () { console.log('server stopped by ' + signal); process.exit(128 + value); });}Object.keys(signals).forEach(function (signal) { process.on(signal, function () { shutdown(signal, signals[signal]); });});

 우 리 는 3000 포트 를 감청 하 는 http server 를 만 들 었 습 니 다. 두 개의 신호 처리 핸들 을 만 들 었 습 니 다. 각각 SIGINT 와 SIGTERM 신 호 를 처리 하고 신호 핸들 이 실 행 될 때 표준 출력 에서 인쇄 합 니 다.
   `server stopped by [SIGNAL]`.
두 가지 장면 으로 나 누 어 묘사 하 다.
이 애플 리 케 이 션 은 전단 애플 리 케 이 션 입 니 다.
이 용기 의 주 프로 세 스 를 사용 할 때 신 호 를 직접 처리 할 수 있 습 니 다. 다음 에 사용 할 Dockerfile 파일 입 니 다.
FROM iojs:onbuildCOPY ./program.js ./program.jsCOPY ./package.json ./package.jsonEXPOSE 3000ENTRYPOINT ["node", "program"]

Dockerfile 파일 을 작성 할 때 시작 프로그램 은 ENTRYPOINT 또는 RUN 을 사용 해 야 합 니 다. 명령, 그렇지 않 으 면 용기 안의 메 인 프로 세 스 는 / bin / sh – c 입 니 다. ,응용 프로그램 은 주 프로 세 스 의 하위 프로 세 스 일 수 있 습 니 다. 그렇다면 신 호 를 받 을 수 없습니다.
미 러 구축:
$ docker build -t signal-fg-app .
실행 용기
$ docker run -it –rm -p 3000:3000 –name=”signal-fg-app” signal-fg-app
방문 하 다. http://localhost:3000  인증 응용 정상 실행
다른 터미널 을 열 고 docker kill 을 실행 합 니 다. 명령 하 다.
$ docker kill –signal=”SIGTERM” signal-fg-app
혹은
$ docker stop signal-fg-app
이 두 명령 은 모두 SIGTERM 신 호 를 보 내 서 응용 을 중단 할 수 있다.
Both commands can be used to issue SIGTERM signal and stop the application.
응용 프로그램 을 실행 하 는 터미널 에서 아래 출력 로 그 를 볼 수 있 습 니 다.
server stopped by SIGTERM
응용 프로그램 이 배경 응용 프로그램 일 때
이 애플 리 케 이 션 에 신 호 를 직접 보 낼 수 없습니다. 이 장면 에서 해결 방법 은 셸 스 크 립 트 로 애플 리 케 이 션 을 시작 하고 이 시작 스 크 립 트 에서 모든 신 호 를 처리 하 며 이 애플 리 케 이 션 의 Dokcerfile 파일 을 만 드 는 것 입 니 다.
Dockerfile:FROM iojs:onbuildCOPY ./program.js ./program.jsCOPY ./program.sh ./program.shCOPY ./package.json ./package.jsonRUN  chmod +x ./program.shEXPOSE 3000ENTRYPOINT ["./program.sh"]

시작 스 크 립 트 프로그램 보기. sh
#!/usr/bin/env bashset -xpid=0# SIGUSR1-handlermy_handler() {  echo "my_handler"}# SIGTERM-handlerterm_handler() {  if [ $pid -ne 0 ]; then    kill -SIGTERM "$pid"    wait "$pid"  fi  exit 143; # 128 + 15 -- SIGTERM}# setup handlers# on callback, kill the last background process, which is `tail -f /dev/null` and execute the specified handlertrap 'kill ${!}; my_handler' SIGUSR1trap 'kill ${!}; term_handler' SIGTERM# run applicationnode program &pid="$!"# wait indefinetelywhile truedo  tail -f /dev/null & wait ${!}done

여기 서 우 리 는 두 개의 신호 처리 함 수 를 만 들 었 습 니 다. 하 나 는 사용자 가 정의 한 신 호 를 처리 하 는 것 이 고 하 나 는 SIGTEM 신 호 를 처리 하여 우아 하 게 응용 을 닫 을 수 있 습 니 다.
이 응용 프로그램 에서, 우리 의 응용 프로그램 은 배경 에서 실행 되 는 (&) 입 니 다. 마지막 으로, 우 리 는 하위 프로 세 스 가 종 료 될 때 까지 "wait" 를 사용 합 니 다. "wait" 와 "waitpid" 두 함 수 는 신 호 를 받 을 때 실행 을 중지 합 니 다. 신 호 를 받 은 후에, 우 리 는 특정한 핸들 로 신 호 를 처리 합 니 다.
  Docker 의 문서 설명, SIGCHLD, SIGKILL, and SIGSTOP 대신 관리 할 수 없습니다.
미 러 구축:
docker build -t signal-bg-app .
용기 실행:
docker run -it –rm -p 3000:3000 –name=”signal-bg-app” signal-bg-app
새 터미널 을 열 어 보 냅 니 다. SIGUSR1 시그 널 :
docker kill –signal=”SIGUSR1″ signal-bg-app
마지막 으로 사용 중지
docker kill –signal=”SIGTERM” signal-bg-app
응용 프로그램 은 해당 로 그 를 인쇄 할 수 있 고 우아 하 게 닫 을 수 있 습 니 다.
결론.
신 호 는 비동기 사건 을 처리 하 는 방법 을 제공 하고 용기 가 실행 할 수 있 는 응용 은 신 호 를 사용 하여 메시지 교 류 를 할 수 있다.신호 와 호스트 내의 응용 프로그램 을 사용 하여 상호작용 을 하고 프로필 을 다시 불 러 오 며 명확 한 작업 을 하거나 다 중 프로 세 스 협업 을 한다.
 
영어 주소:
https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86#.ukb9dqt9k

좋은 웹페이지 즐겨찾기