며칠 전에 컨테이너화된 애플리케이션을 프로비저닝하는 빠르고 가볍고 안전한 방법을 제공하는 LXC 기반의 운영 체제 수준 가상화 기술인 Docker에 대한 길고 철저한 가이드를 게시했습니다. 사랑스러운.
이제 첫 번째 서비스인 SSH 및 Apache를 테스트할 때 직면한 문제 중 하나는 이러한 서비스의 제어였습니다. 우리는 컨테이너 내부에 사용할 수 있는 init 스크립트나 systemd가 없었으며 솔직히 원하지 않을 수도 있습니다. 그러나 우리는 서비스를 시작하고 중지하는 등의 메커니즘을 원합니다. Supervisord를 소개합니다. 따라서 이 튜토리얼입니다. 저를 따라 오십시오.
간단히 말해서 감독자
Supervisord는 프로세스를 모니터링하고 제어하도록 설계된 프로세스 제어 시스템입니다. 초기화를 대체하는 것이 아니라 자체 프레임워크 내부에 프로세스를 캡슐화하고 원하는 대로 부팅 시 시작할 수 있습니다. 이 시점에서 소프트웨어에 대해 더 깊이 들어갈 이유가 없습니다.
감독자 설정
기본적으로 Supervisord는 Python 모듈입니다. Python distutils 패키지의 확장인 setuptools의 일부인 easy_install을 사용하여 설치할 수 있습니다. 예, 이 시점에서 상당히 복잡해집니다. 운 좋게도 대부분의 Linux 배포판은 오늘의 테스트 플랫폼인 CentOS를 포함하여 easy_install과 함께 제공됩니다.
진행하려면 컨테이너 내부에 Supervisord를 설치해야 합니다. 그런 다음 이미지를 커밋하고 앞서 언급한 SSH 및 Apache와 같은 서비스를 포함하는 빌드의 기준으로 사용합니다. 호스트에 Supervisord를 설치하려고 하면 아무 문제 없이 성공해야 합니다.
easy_install 관리자
감독자를 찾는 중
읽기 https://pypi.python.org/simple/supervisor/
베스트 매치:감독자 3.1.3
https://pypi.python.org/packages/source/s/supervisor/ 다운로드
감독자-3.1.3.tar.gz#md5=aad263c4fbc070de63dd354864d5e552
처리 감독자-3.1.3.tar.gz
쓰기 /tmp/easy_install-vbOcMG/supervisor-3.1.3/setup.cfg
실행 감독자-3.1.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-vbOcMG/supervisor-3.1.3/egg-dist-tmp-i96mIs
경고:'docs/.build' 디렉토리 아래에 '*'와 일치하는 이전에 포함된 파일이 없습니다.
easy-install.pth 파일에 관리자 3.1.3 추가
/usr/bin에 echo_supervisord_conf 스크립트 설치
/usr/bin에 pidproxy 스크립트 설치
/usr/bin에 Supervisorctl 스크립트 설치
/usr/bin에 Supervisord 스크립트 설치
설치됨
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg
감독자에 대한 종속성 처리
meld3>=0.6.5 검색 중
읽기 https://pypi.python.org/simple/meld3/
베스트 매치:meld3 1.0.2
https://pypi.python.org/packages/source/m/meld3/ 다운로드
meld3-1.0.2.tar.gz#md5=3ccc78cd79cffd63a751ad7684c02c91
meld3-1.0.2.tar.gz 처리 중
쓰기 /tmp/easy_install-wnhLVS/meld3-1.0.2/setup.cfg
meld3-1.0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wnhLVS/meld3-1.0.2/egg-dist-tmp-Lp88cX 실행
zip_safe 플래그가 설정되지 않았습니다. 아카이브 콘텐츠 분석 중...
easy-install.pth 파일에 meld3 1.0.2 추가
설치된 /usr/lib/python2.7/site-packages/meld3-1.0.2-py2.7.egg
감독자에 대한 종속성 처리 완료
컨테이너 내부에는 컨테이너에 추가된 Python 프레임워크가 완전하지 않고 일부 모듈이 없기 때문에 오류가 발생합니다.
# easy_install 관리자
추적(가장 최근 호출 마지막):
<모듈>의 파일 "/usr/bin/easy_install", 라인 5
pkg_resources import load_entry_point에서
ImportError:pkg_resources라는 모듈이 없습니다.
즉, easy_install을 수동으로 설정해야 합니다.
wget https://bitbucket.org/pypa/setuptools/raw/ ->
-> bootstrap/ez_setup.py -O - | 파이썬
감독자 구성
다음 단계는 컨테이너에 대한 구성을 만드는 것입니다. 호스트에서 파일을 생성한 다음 빌드 프로세스 중에 Dockerfile의 COPY 명령을 사용하여 이미지에 복사합니다.
복사 ./supervisord.conf /etc/supervisord.conf
구성 자체는 다음과 같습니다.
[감독자]
노데몬=참
[프로그램:sshd]
명령=/usr/sbin/sshd -D
[프로그램:httpd]
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"
여기에 무엇이 있습니까? 각 대괄호 쌍은 섹션을 정의합니다. Supervisord 자체의 경우 백그라운드 서비스가 되는 것을 의미하는 자체 데몬화(daemonize)가 아니라 포그라운드에서 시작해야 한다고 정의합니다.
sshd라는 프로그램의 경우 기본적으로 백그라운드에서 SSHD를 실행하는 관련 명령을 실행합니다. httpd라는 프로그램의 경우 별도의 셸에서 포그라운드에서 서버를 시작합니다. 사용할 수 있는 다른 많은 옵션이 있지만 현재로서는 관리자와 함께 진행하는 데 필요한 최소한의 옵션입니다.
컨테이너 실행 및 문제 해결
이미지를 구축하고 실행한 후에는 Supervisord가 시작되어 프로세스를 시작해야 합니다. 그러나 먼저 몇 가지 일반적인 오류를 해결해 보겠습니다. 다음 중 하나를 볼 수 있습니다.
도커 실행 -ti -p 22 -p 80 이미지-3:최신
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord는 루트로 실행 중이며 기본 위치(현재 작업 디렉토리 포함)에서 구성 파일을 검색하고 있습니다. 보안 향상을 위해 구성 파일에 대한 절대 경로를 지정하는 "-c" 인수를 지정할 수 있습니다.
'Supervisord가 루트로 실행 중이며 검색 중입니다.'
오류:기본 경로(/usr/etc/supervisord.conf, /usr/supervisord.conf, Supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf)에서 구성 파일을 찾을 수 없습니다. -c 옵션을 사용하여 다른 경로에 구성 파일을 지정하십시오.
도움이 필요하면 /usr/bin/supervisord -h
Supervisord.conf 파일에 대해 잘못된 경로를 지정했거나 잘못된 이름을 사용한 경우 서비스를 실행할 수 없습니다. COPY 명령을 편집하고 이미지를 다시 빌드한 다음 다시 시작해야 합니다. 그런 다음 발생할 수 있는 다음 오류는 다음과 같습니다.
# 도커 실행 -ti -p 22 -p 80 이미지-3:최신
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord는 루트로 실행 중이며 기본 위치(현재 작업 디렉토리 포함)에서 구성 파일을 검색하고 있습니다. 보안 향상을 위해 구성 파일에 대한 절대 경로를 지정하는 "-c" 인수를 지정할 수 있습니다.
'Supervisord가 루트로 실행 중이며 검색 중입니다.'
372 CRIT Supervisor가 루트로 실행 중(구성 파일에 사용자 없음)
375 INFO 관리자가 pid 1로 시작했습니다.
378 생성된 정보:pid 9의 'httpd'
381 생성된 정보:pid 10의 'sshd'
602 정보 종료됨:httpd(종료 상태 1, 예상되지 않음)
606 정보 생성됨:pid 11의 'httpd'
606 정보 성공:sshd가 RUNNING 상태에 진입했고, 프로세스가 1초 이상 유지되었습니다(startsecs).
671 정보 종료됨:httpd(종료 상태 1, 예상되지 않음)
676 생성된 정보:pid 12의 'httpd'
742 정보 종료됨:httpd(종료 상태 1, 예상되지 않음)
749 생성된 정보:PID가 13인 'httpd'
825 INFO 종료됨:httpd(종료 상태 1, 예상되지 않음)
826 INFO 포기:httpd가 치명적 상태에 진입, 너무 많은 시작 재시도가 너무 빨리 시작됨
포기:httpd가 치명적 상태에 진입, 너무 많은 시작 재시도가 너무 빨리 발생함
여기에 있는 것은 Apache 스레드가 종료되어 Supervisord가 스레드를 다시 시작하도록 강제하고 결국 포기하여 치명적인 상태가 되는 것입니다. 이 시점에서 컨테이너는 거의 쓸모가 없습니다.
여기에서 해결 방법은 Supervisord.conf 파일을 편집하고 httpd 프로그램 섹션에 추가 지시문을 도입하여 프로세스 생성을 보다 원활하게 처리하는 것입니다.
[프로그램:httpd]
시작초 =0
자동 재시작 =거짓
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"
startsecs =0 및 autorestart =false를 추가했습니다. 첫 번째 지시문은 다음과 같이 알려줍니다.
시작이 성공한 것으로 간주하기 위해 시작 후 프로그램이 실행 상태를 유지해야 하는 총 시간(초)입니다. 프로그램이 시작된 후 몇 초 동안 유지되지 않으면 예상 종료 코드(종료 코드 참조)로 종료하더라도 시작이 실패한 것으로 간주됩니다.
두 번째는 Supervisord가 Apache 스레드 재시작을 처리하지 않고 수신 HTTP 요청을 처리할 때 웹 서버 자체에서 처리함을 의미합니다.
거짓, 예상치 못한 또는 참 중 하나일 수 있습니다. false인 경우 프로세스가 자동으로 다시 시작되지 않습니다. 예상치 못한 경우 이 프로세스 구성과 연관된 종료 코드 중 하나가 아닌 종료 코드로 프로그램이 종료될 때 프로세스가 다시 시작됩니다(종료 코드 참조). true인 경우 종료 코드에 관계없이 종료 시 프로세스가 무조건 다시 시작됩니다.
이제 컨테이너를 다시 실행할 수 있습니다. 원래 가이드에서 발생한 /run/httpd 문제를 기억하십니까? /run 디렉터리가 없으면 다음 메시지가 표시됩니다.
도커 실행 -ti -p 22 -p 80 이미지-3:최신
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
Supervisor/options.py:296:UserWarning:Supervisord는 루트로 실행 중이며 기본 위치(현재 작업 디렉토리 포함)에서 구성 파일을 검색하고 있습니다. 보안 향상을 위해 구성 파일에 대한 절대 경로를 지정하는 "-c" 인수를 지정할 수 있습니다.
'Supervisord가 루트로 실행 중이며 검색 중입니다.'
913 CRIT Supervisor가 루트로 실행 중(구성 파일에 사용자 없음)
916 INFO Supervisord가 pid 1로 시작됨
919 정보 생성됨:pid 8의 'httpd'
921 정보 생성됨:pid 9가 포함된 'sshd'
079 INFO 성공:httpd가 RUNNING 상태에 진입했고 프로세스가 0초 이상 유지되었습니다(startsecs).
105 INFO 종료됨:httpd(종료 상태 0, 예상됨)
120 정보 알 수 없는 pid 10을 얻었습니다.
122 정보 성공:sshd가 RUNNING 상태에 진입했고, 프로세스가 1초 이상 유지되었습니다(startsecs).
이 시점에서 컨테이너에 연결(BASH 셸 연결 또는 실행)하고 로그를 확인하고 서비스가 예상대로 실행되지 않는 이유를 파악해야 합니다.
성공적인 테스트
그런 다음 마침내 모든 것을 정리하면:
결론
이것은 꽤 괴상한 튜토리얼입니다. 하지만 systemd와 같은 복잡하고 값비싼 프레임워크를 설치하지 않고도 견고하고 우아한 방식으로 컨테이너 내부의 서비스를 제어하는 데 사용할 수 있는 또 다른 유용한 도구를 무기고에 도입합니다. 또한 Docker, 작업 방법 및 문제 해결 방법 등에 대해 자세히 설명합니다.
Supervisord가 없어도 sshd 및 httpd 프로세스를 실행할 수 있었기 때문에 Supervisord가 반드시 필요한 것은 아니지만 일부 사람들은 특히 서비스를 자주 시작하고 다시 시작해야 하는 경우 이 방법을 선호할 수 있습니다. 어느 쪽이든 유틸리티에 익숙해지면 Docker 메커니즘에 대한 이해와 확신을 구축하는 데 도움이 됩니다. 이 가이드가 도움이 되셨기를 바라며 다음에 살펴볼 내용에 대한 요청을 보내주시기 바랍니다.
건배.