본문 바로가기
Docker/Error

Job for docker.service failed because start of the service was attempted too often.

by ahfmrjttb 2020. 9. 18.

docker ps 명령어로 컨테이너 현황을 확인하려고 했는데 에러가 났다. (그림이 작아서 잘 안 보이는데 브라우저를 확대해서 봐주시기 바랍니다.)

필자는 단순히 Docker가 비활성화되어 있어서 이런 에러가 발생한 줄 알고 restart를 했다.

그랬더니 "Job for docker.service failed because start of the service was attempted too often." 이라는 에러가 발생했다. 해석해보면, Docker를 너무 자주 (re)start해서 service에 실패했다는 내용이고, 에러가 발생했으니 "systemctl status docker.service"로 확인해보라고 메시지가 나와있으며 아래쪽엔 Docker를 강제로 start하고 싶으면 "systemctl reset-failed docker.service"를 사용하라고 한다.

 

먼저 "systemctl status docker.service"로 상태를 확인해보자. (아래 그림을 해당 사이트에서 사진을 가져왔는데, 필자의 화면을 캡쳐하지 못 해서 가져다 쓰는 점 양해 바랍니다. 단, 에러가 완전히 동일합니다.)

[ 출처 :  https://github.com/docker/for-linux/issues/435 ]

보다시피 Active: failed라고 되어 있으며 아래를 보면 Docker Application Container Engine을 시작하는데 실패했고 failed state에 들어갔으며 holdoff가 time over됐다는 등 실패했다는 메시지가 가득하다. 또한 파란색 네모 부분을 보면 "start request repeated too quickly for docker.service"라고 나와있는데 start 요청이 너무 빠르게 반복된다는 내용이다.

 

아까 처음 그림의 메시지에서 Docker를 강제로 start하려면 "systemctl reset-failed docker.service" 하면 된다고 했는데 Docker를 강제로 start하면 해결되지 않을까해서 "systemctl reset-failed docker.service"을 입력해봤다.

 

$ systemctl reset-failed docker.service

$ systemctl start docker

아까와는 다른 에러 내용이긴 한데 실행에 실패한 것은 변함이 없다. 애초에 start가 실패하고 있는 상태이므로 강제로 start 시켜봤자 실행이 되지 않는 것 같다. 그럼 어떻게 해결을 해야할까? 해결법은 아예 /var/lib/docker 디렉토리를 삭제해주면 된다.

 

그럼 /var/lib/docker에는 뭐가 있을까? 이 디렉토리에는 컨테이너들의 정보들이 있는데 Docker image들이나 network, volume 등이 있다. 이 /var/lib/docker에 대한 자세한 내용은 포스팅 "/var/lib/docker"를 참고하기 바란다. 일단 직접 보면,

이렇게 Docker image들을 빌드해주는 builder나 현재 실행되고 있는 컨테이너에 대한 정보들이 있는 Containers, 그 외에 network나 plugin, volume 등이 있다. 즉, /var/lib/docker를 삭제한다는 건 결국 Docker에 대한 모든 것들을 포맷시킨다는 것을 의미한다.

 

이렇게 날리는 방법 말고는 해결방법을 찾지 못해서 일단 이 방법을 사용은 했는데 만약에 Docker가 직접 관리하는 volume인 Docker volume을 사용 중인 경우 Docker volume도 모두 삭제되기 때문에 문제가 될 것이다.

 

포스팅은 하고 있지만 엄청 좋은 방법같지는 않다. 왜냐하면, 간단히 말해서 에러 생기니 날린다는 개념이기 때문이다. 나중에 같은 에러가 발생하면 다른 방법으로 해결할 수 없는지 고민해봐야될 거 같다.

 

다시 돌아와서, /var/lib/docker 디렉토리를 삭제해보자. 그 전에 먼저 Docker를 stop해줘야 한다. 그렇지 않으면,

이렇게 "Device or resource busy" 라는 메시지와 함께 에러가 발생한다.

 

$ systemctl stop docker

$ rm -rf /var/lib/docker

$ systemctl start docker

이렇게 해주면 끝이다. 잘 되었는지 docker ps를 다시 입력해보면

다시 잘 동작하는 것을 확인할 수 있다. 이렇게 에러 해결은 되었지만 부가적으로 /var/lib/docker를 삭제했을 때의 상황에 대해 조금 더 부연설명을 하고자 한다.

 

/var/lib/docker를 삭제했을 때 나타나는 현상에 대해 직관적으로 느낄 수 있도록 Docker image를 한 번 예로 들어보겠다.

현재 2개의 Docker image가 있다. Docker image에 대한 정보는 /var/lib/docker/image에 있다. 그렇기 때문에 /var/lib/docker 디렉토리를 삭제하면 그 하위에 있는 image 디렉토리 역시 지워지기 때문에 Docker image들도 모두 삭제가 된다. 아까처럼 먼저 stop하고 삭제해보자.

 

P.S : /var/lib/docker/image에는 Docker image들에 대한 metadata가 저장되는 것이지 Docker image 자체가 저장되는 것이 아니다. 만약 /var/lib/docker/image에 Docker image 자체가 저장된다면 위 그림 기준으로 /var/lib/docker/image의 용량이 203+64.2 = 267.2MB가 넘어야 하는데 /var/lib/docker/image의 용량을 보면 그렇지가 않다. 하지만, 아래에도 나오듯이 /var/lib/docker/image를 제거하면 metadata가 지워지기 때문에 Docker image도 함께 삭제된다.

 

$ systemctl stop docker

$ rm -rf /var/lib/docker

 

그러고 나서, Docker를 다시 시작해 준 다음 docker images로 확인해보면

 

$ systemctl restart docker

$ docker images

 

이렇게 Docker image가 모두 없어진 것을 확인할 수 있다. 하나의 예로 Docker image를 들었지만 컨테이너, volume 등도 같은 원리로 모두 없어질 것이다. 궁금하면 직접 해보기 바란다.

 

 

 

참고 사이트

    - https://stackoverflow.com/questions/39100641/docker-service-start-failed

    - https://github.com/docker/for-linux/issues/435

댓글