종료 시 Docker 컨테이너(systemd)를 종료할 수 없습니다.

종료 시 Docker 컨테이너(systemd)를 종료할 수 없습니다.

저는 Ubuntu 서버에서 다수의 Docker 컨테이너를 실행하고 있습니다. 그들은 systemd에 의해 제어됩니다.

실행하면 컨테이너가 정상적으로 종료됩니다. Journalctl의 출력은 다음과 같습니다(역시간 출력, 최신 항목이 맨 위에 표시).systemctl stop [email protected]

Nov 05 10:58:11 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:58:11 ubox0 docker[3622]: mw-salcom-app
Nov 05 10:58:09 ubox0 docker[3470]: [Thu Nov 05 10:58:09.921033 2020] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
Nov 05 10:58:09 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

그러나 실행하면 shutdown -h now다음을 얻습니다.

Nov 05 10:51:04 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Failed with result 'timeout'.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Main process exited, code=killed, status=9/KILL
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Killing process 2077 (docker) with signal SIGKILL.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: State 'stop-sigterm' timed out. Killing.
Nov 05 10:50:04 ubox0 systemd[1]: [email protected]: Stopping timed out. Terminating.
Nov 05 10:49:04 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

컨테이너는 중지되지 않으며 프로세스는 결국 2분 후에 시간 초과되어 컨테이너가 중단됩니다.

그 이유는 무엇입니까?

데이터 손실 없이 컨테이너에서 실행 중인 서비스가 중지되도록 컨테이너를 정상적으로 종료하고 싶습니다.

내 서비스 파일은 다음과 같습니다

[Unit]
Description=Docker container startup for %I
Requires=docker.service
After=docker.service

[Service]
TimeoutStartSec=40
Restart=always
# wait a while before restarting in case we are doing a restore;
# this includes a 'docker stop' command after we restore the data
RestartSec=60
ExecStartPre=-/usr/bin/docker stop %i
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target

업데이트좀 더 검색해본 결과 해당 게시물을 발견했습니다.Docker 컨테이너를 시스템 서비스로 올바르게 처리하는 방법은 무엇입니까?동일한 문제를 설명하지만 거기에는 답변이 없습니다.

답변1

docker와 systemd가 항상 잘 어울리는 것은 아닌 것 같습니다. 다음을 참조하세요.

다른 컴퓨터(내 백업 서버)에 똑같은 설정이 있는데 여기서는 모든 것이 잘 작동합니다. shutdown 명령을 실행하면 모든 Docker 컨테이너가 정상적으로 종료됩니다.

따라서 문제는 종속성 문제일 수 있습니다. 어쩌면 systemd가 도커 컨테이너가 제대로 종료될 수 있도록 필요한 일부 서비스를 종료했을 수도 있습니다.

'실패'하는 시스템의 Docker 버전은 18.09.2'작동'하는 시스템의 도커 버전입니다 18.06.1-ce.

그만큼릴리즈 노트Docker 버전 18.09상태의 경우:

In Docker versions prior to 18.09, containerd was managed
by the Docker engine daemon. In Docker Engine 18.09, 
containerd is managed by systemd.

내 유닛 파일에 다음 줄을 추가했을 때:

[Unit]
...
Requires=containerd.service
After=containerd.service

유닛 파일( systemctl daemon-reload)을 다시 로드하자 모든 것이 다시 작동하기 시작했습니다. 설정한 1분 제한 시간 후에도 컨테이너가 종료되지 않았지만 몇 초 후에 종료되었습니다.

먼저 docker를 버전으로 업그레이드하려고 시도했지만 20.10.1소용이 없었습니다.

나는 다음을 발견했을 때 이 '솔루션'에 대한 아이디어를 얻었습니다.https://github.com/sous-chefs/docker/issues/1062

관련 정보