Table of Contents
왜 Docker와 함께 Systemd를 생산 배포합니다.
이 웹 사이트는 애플 리케이션에 전념. 우리는 정품 앱과 게임을 제공 할 목적으로이 사이트를 만들었습니다. 4AppsApk 최고의 안드로이드 애플 리케이션을위한 무료 APK 파일 다운로드 서비스, 계략.
- 의존성 지시를 통해 보증 된 시작 명령 (예 : docker.service 후 network.target 후)
- 를 통해 통합된 로깅, straightforward를 디버깅
- 시스템 단위 지침을 사용하여 자원 제한 (CPU, Memory, I/O)에 대한 미세 곡물 제어
- configurable 지연 및 파열 제한으로 실패에 대한 자동 재시작
- 소켓 활성화 및 적시 시작 지원
시스템 서비스 파일에 있는 각 도커 콘테이너를 감싸기로, 가동 팀은 시작, 멈추기 및 감시 콘테이너를 위한 일관된 공용영역을, ad-hoc 스크립트 및 수동 개입에 reliance 감소시키.
단일 도커 컨테이너에 대한 Systemd Service 만들기
표준 접근법은 Docker 명령을 실행하고 컨테이너를 중지하는 서비스 단위 파일을 작성하는 것입니다. 아래에서 우리는 기본 예로 시작하고 일반적인 생산 요구 사항을 다루는 단계로 걸어.
Step 1: 서비스 단위 파일을 씁니다
라는 파일 생성. 시작점으로 다음 템플릿을 사용합니다:
[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
-e DB_HOST=10.0.1.50 \
-e DB_PORT=5432 \
-v /data/myapp:/app/data \
-p 8080:8080 \
myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp
[Install]
WantedBy=multi-user.target
키 지시어의 계획:
- – 컨테이너를 시작하기 전에 Docker daemon을 실행한다.
- - 도커가 멈추면, 이 서비스는 중지합니다.
- ] - 이전 실행에서 모든 왼쪽 컨테이너를 청소 ] 접두사는 여기에 실패를 의미 비-파형).
- ] - ]]를 사용하여 컨테이너를 자동으로 제거 할 때.
- – 우아하게 timeout (10 초)를 가진 콘테이너를 중지합니다.
- ] – 출구 코드에 상관없이 컨테이너를 다시 시작합니다.
- – 다시 시작하기 전에 10 초를 기다립니다.
- - 반복을 피하기 위해 간격 당 3개의 시도에 제한합니다 (과태 10 초).
2단계: 서비스 활성화 및 시작
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
]는 재읽는 서비스 파일에 체계화됩니다. 는 symlink를 생성하므로 서비스는 부팅을 시작합니다.
Standard Systemd Commands를 통한 서비스 관리
서비스가 실행되면 다른 시스템 서비스와 마찬가지로 제어하십시오.
- 시작: ]
- 행정: ]
- 리스타트:
- Status:
- 로그: ] (라이브 로그를 따르십시오)
고급 구성 패턴
생산 배치는 종종 간단한 보다 더 필요. 아래는 시스템 서비스 파일에 추가 할 수있는 일반적인 향상입니다.
환경 변수 전달
서비스 파일에 있는 하드 코딩 비밀 또는 윤곽은 추천되지 않습니다. 대신, 분리되는 환경 파일을 사용하십시오:
[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
--env-file /etc/myapp/env.conf \
myregistry/myapp:latest
] 경로 앞에 접두사는 파일이 존재하지 않는 경우에도 서비스를 시작할 수 있습니다 (초기 설정 중 사용).
네트워킹과 항구 바인딩
같은 호스트에 서로 통신해야 하는 컨테이너의 경우, ] 또는 사용자 정의 브리지 네트워크를 사용하여 고려하십시오. 예:
ExecStart=/usr/bin/docker run --rm --name web \
--network=my-net \
-p 443:443 \
-v /etc/ssl/certs:/etc/ssl/certs:ro \
myregistry/web:latest
사용자 정의 네트워크를 사용하는 경우, 네트워크가 서비스 시작 전에 존재합니다. ] 명령을 추가 할 수 있습니다.
ExecStartPre=/usr/bin/docker network create my-net
Inter-Container 종속성
한 컨테이너가 시작되기 전에 준비해야 할 또 다른 경우 (예 : 데이터베이스에 대한 웹 앱 대기), 시스템 주문은 시행 할 수 있습니다. 데이터베이스에 대한 두 번째 서비스 파일을 만들고 다음 :
[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service
ties the web app’s lifecycle to the database container – 데이터베이스가 중지되면 웹 앱도 중지됩니다.
건강 검사 및 읽기
Docker 건강 검사는 조기 서비스 가용성을 방지하기 위해 체계화 된 통합 될 수 있습니다. ]를 사용하여 건강 종료점을 오염시키는 스크립트를 사용합니다.
ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30
스크립트는 컨테이너가 건강할 때 0을 종료해야 합니다. 실패하면, 실패한대로 단위를 표시합니다.
Systemd를 통한 리소스 제한
Docker의 자체 리소스 플래그가 없는 cgroup 레벨에서 컨테이너의 CPU 및 메모리를 제약할 수 있습니다. 이 기능은 단일 호스트에서 여러 컨테이너를 실행할 때 특히 유용합니다.
[Service]
MemoryMax=512M
CPUQuota=50%
이 설정은 Docker의 독립적으로 시행되는 단단한 한계를 만듭니다.
여러 컨테이너 관리: Systemd vs. Docker Compose
컨테이너의 작은 수 (예 : 2-5), 개별 시스템 서비스 파일은 간단하고 유지 보수가 가능합니다. 그러나 프로젝트가 많은 상호 연결 서비스를 포함 할 때 Docker Compose는 더 편리합니다. 여전히 전화 를 사용하여 전체 Docker Compose 스택을 오케스트라로케스트라로 변환 할 수 있습니다. 예 :
[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
이 접근법은 체계화된 수명주기 관리와 결합된 서비스 정의를 위한 Compose의 단순성을 제공합니다. ]가 ]]가 즉시 종료되기 때문에 ]가 호출될 때까지 “active” 상태에 있는 단위를 유지한다는 것을 주의하십시오.
어떤 방법을 선택해야합니까?
- Individual systemd services – 최상의 법률 응용 프로그램, 엄격한 시작 주문 서비스를 제공, 또는 per-container 리소스 제한이 필요할 때.
- Docker Compose with systemd – microservices stacks에 이상적은 Compose에 의해 내부적으로 처리되며, 전체 그룹을 관리하기 위해 단일 단위를 원합니다.
문제 해결
주의적 설정으로 문제가 발생할 수 있습니다. 아래는 빈번한 pitfalls 및 솔루션입니다.
“Cannot Connect to the Docker daemon” 서비스 실패
이 보통 Docker 소켓 앞에 서비스가 시작되기 전에 서비스가 준비됩니다. 단위를 ]와 포함하십시오. 도커 데몬이 활성화되었는지 확인하십시오. ].
루프에 컨테이너 재시작
컨테이너가 즉시 종료되면 시스템화가 ]과 에 따라 재시작을 계속할 것입니다. ]로 컨테이너 로그를 확인합니다. ] (예: 30초)를 증가시키고 ]를 설정하여 바쁠 루프를 방지합니다.
서비스 깨끗하게 멈추지 않는
잘못된 구성 ] 컨테이너 실행을 떠날 수 있습니다. ]는 올바른 컨테이너 이름을 사용합니다. 를 사용하여 컨테이너를 강제로 제거하려면 중지가 실패합니다.
환경 변수로드되지 않음
를 사용한다면, 파일이 존재하고 root로 읽을 수 있습니다. 문제의 인용을 피하십시오 - 변수 값에서 구문을 시스템화합니다. 비밀 주입을 위해, 체계화된 자격 증명 또는 전용 비밀 관리자를 사용하여 고려하십시오.
보안 고려 사항
Systemd를 통해 Docker 컨테이너를 실행하면 몇 가지 보안 포인트를 올릴 수 있습니다.
- 항상 가능한 경우 시스템화된 서비스를 실행합니다(]]과 ]] 지시어는 Docker 소켓에 접근하거나 rootless 모드에서 실행해야 합니다).
- 필요한 경우 시스템 단위에서 를 사용하지 마십시오.
- 컨테이너가 호스트에 쓸 필요가 없습니다 할 때 읽기 전용 바인딩 마운트 (])를 사용하십시오.
- 시스템의 과 ]를 갖는 것은 탈출에 대한 단위를 강하게합니다.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser
외부 자료
더 읽기를 위해, 이 공식적인 참고를 상담하십시오:
관련 기사
Docker 컨테이너와 통합하면 Linux 시스템의 나머지와 완벽하게 통합된 견고한 자동화된 시작 메커니즘을 제공합니다. 잘 구조화된 서비스 유닛 파일을 작성함으로써, 시작 명령을 관리하고, 의존성, 설정 리소스 제한을 관리하고, 작업 팀이 이미 알고 있는 도구를 사용하여 로그를 모니터링할 수 있습니다. 각 컨테이너 또는 단일 유닛을 선택하면 Compose stack을 실현할 수 있으며, 시스템화된 생산 환경 수요가 예상할 수 있는 신뢰성과 예측성을 제공합니다.
간단한 단위 파일로 시작하면 환경 파일, 건강 검사 및 보안 경화와 같은 고급 옵션에 대해 완전히 테스트합니다. 이 접근 방식으로 Docker 컨테이너는 재부팅, 충돌 및 수동 개입없이 구성 변경 사항을 생존하고, 건물 응용 프로그램에 초점을 맞추기 위해 팀을 해방합니다.