[Docker] Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 에러 해결

peter park·2019년 8월 12일
18

What is wrong with you?

목록 보기
1/2
post-thumbnail
post-custom-banner

01. Issue

  • Docker 사용시 docker를 다운받고 docker ps와 같은 명령어를 실행하면 다음과 같은 에러 메세지가 나온다
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

02. Cause

  • 해당 라인을 읽어보면 unix:///var/run/docker.sock에 있는 docker daemon에 연결할 수 없으므로 docker daemon이 돌고있는지 물어보고 있다
  • 위의 내용 대로라면 docker daemon은 docker.sock에서 돌고 있다는 뜻이 될 것이다
  • 그렇다면 docker.sock의 역할은 무엇일까?

Docker.sock

  • 구글에서 docker.sock을 찾아보면 Docker 공식홈페이지에서 dockerd라는 문서를 찾을 수 있다.
  • 공식문서에서는 docker.sock에 대해 설명하기 이전에 dockerd에 대해 먼저 설명하고 있다. 그렇다면 먼저 dockerd의 이해가 바탕이 되야 함을 알 수 있다.
  • 그렇다면 **`dockerd`**는 무엇일까?

dockerd

  • Docker 공식홈페이지의 dockerd문서에는 dockerd를 이렇게 정의하고 있다.
dockerd is the persistent process that manages containers
  • 해석하자면 dockerd는 컨테이너들을 관리하는 백그라운드 프로세스라는 뜻이다.
  • 한마디로, dockerd는 docker daemon이라는 뜻이 될 것이다.
  • dockerd를 실행하기 위해서는 터미널에서 dockerd를 입력하면 된다.
  • 실행하게 되면 로그 메세지가 계속 생성되면서 dockerd가 백그라운드에서 돌아가게 된다.
  • 이제 다른 터미널에서 docker ps와 같은 커멘드를 실행하면 잘 돌아 가는 것을 알 수 있다.
  • 그럼 unix:///var/run/docker.sockdockerd의 관계는 무엇일까?

dockerd와 socket의 관계

  • 공식문서에는 다음과 같이 소개되어있다.
The Docker daemon can listen for Docker Engine API requests via three different types of Socket: unix, tcp, and fd.
  • Docker daemon은 Docker Engine API의 요청을 unix, tcp, rd라는 3개 타입의 소켓으로 받을 수 있다라고 되어 있다.
  • default는 root 권한에서/var/run/docker.sock에서 생성된 unix 도메인 소켓이다.
  • 즉, 에러 메세지에서 나온 unix:///var/run/docker.sock은 unix 컴퓨터와 통신을 하기위한 소켓의 위치를 말한다.
  • 기본적으로 unix 도메인 소켓이 연결되어 있으므로 dockerd -H /var/run/docker.sock을 실행하게 되면 dockerd와 같이 docker daemon이 잘 돌아가는 것을 알 수 있다.
    • -H 옵션은 docker --help로 검색하면
     -H, --host list	Daemon socket(s) to connect to (default )
    • Daemon socket을 어떤 것을 사용할지 지정할 수 있다.
    • default는 언급한 것처럼 unix 도메인 소켓이므로 dockerd만 입력해도 똑같은 결과를 얻을 수 있게 된다.

03. Conclusion

  • 간단하게 정리하자면 Docker daemon을 돌려주기만 하면된다.
  • 방금처럼 dockerd를 매번 실행하기는 번거러우니 아래 두 라인을 도커 설치 이후 입력하면 편할 것이다.
systemctl start docker
systemctl enable docker
  • systemctl start docker
    • docker를 daemon으로 실행하라는 명령어로 dockerd와 같지만 로그없이 실행한다고 보면 편하다
  • systemctl enable docker
    • 컴퓨터가 새로 시작하거나 부팅시 자동으로 docker daemon을 실행하라는 명령어이다.

Thoughts

  • 사실 에러메세지만 읽어도 docker daemon을 실행하면 된다는 간단한 문제이지만 unix:///var/run/docker.sock와의 관계가 궁금하여 잠깐 알아 보았다.
  • 공식문서인 dockerd를 찾아보면 클라이언트 뿐만아니라 원격에서 어떻게 통신을 하는지 자세히 나와있다.
  • 1시간 정도의 분량이 글이지만 시간이 난다면 한번 찾아보는 것도 좋을 것 같다.

Reference

오타 및 잘못된 부분의 지적 등은 언제든지 환영합니다.🙋🏻‍♂️

profile
Let's make something happen 👨🏻‍💻🌿
post-custom-banner

5개의 댓글

comment-user-thumbnail
2020년 7월 2일

안녕하세요! 너무 잘 읽었어요. 그런데 첫줄 입력하자 zsh: command not found: systemctl 라는 문구가 뜨는데 혹시 왜 그런지 아시나요?

1개의 답글
comment-user-thumbnail
2021년 2월 4일

mac을 사용하고있지만, 따로 설정하지 않은 상태에서 systemctl를 치면, command not found가 뜨네요..
brew로 설치했더니 해당이슈가있었고, internet의 설치파일로 새로 설치하니 잘 동작했습니다!

답글 달기
comment-user-thumbnail
2021년 3월 14일

안녕하세요! 같은 오류가 나서 첫번째 오류를 입력하였으나
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
이라는 오류메세지가 출력됩니다 ㅠㅠ 왜 그런지 아시나요?

답글 달기
comment-user-thumbnail
2023년 5월 10일

와,, 회사에서 도커 이용하는데 한번씩 도커 설치한 컴퓨터가 꺼져서 새로 시작할 때 같은 문제에 봉착했었고 상사한테 제대로된 해결방법은 못들은 채 끝났었는데 이 글 보고 바로 해결하였습니다... 이해가 안되던게 바로 되네요

답글 달기