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

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