Docker 서비스를 시작했는데 다음 오류와 함께 dockerd가 종료될 수 있습니다.
failed to load listeners: no sockets found via socket activation
이 오류는 대개 dockerd가 -H fd:// 옵션으로 시작됐지만, systemd의 docker.socket으로부터 전달받은 소켓이 없을 때 발생합니다.
핵심 요약
docker.service만 보지 말고docker.socket상태를 함께 확인합니다. 패키지 기본 서비스가fd://를 사용한다면docker.socket을 활성화한 뒤 Docker 서비스를 다시 시작하는 것이 우선입니다.
1. 오류가 의미하는 것
Linux의 systemd는 서비스가 직접 소켓을 열게 하는 대신, 별도 .socket 유닛이 먼저 소켓을 열고 서비스에 전달하는 방식을 지원합니다.
Docker 서비스의 실행 옵션에 다음이 포함돼 있다면 socket activation을 사용한다는 뜻입니다.
-H fd://
이 상태에서 dockerd가 systemd를 통하지 않고 직접 실행되거나, docker.socket이 비활성화돼 있으면 전달받을 파일 디스크립터가 없어 시작에 실패할 수 있습니다.
2. docker.service와 docker.socket 상태 확인
두 유닛을 한 번에 확인합니다.
sudo systemctl status docker.service docker.socket
간단한 활성 상태만 확인하려면 다음을 사용합니다.
systemctl is-active docker.service
systemctl is-active docker.socket
최근 오류 로그도 함께 봅니다.
sudo journalctl \
-u docker.service \
-u docker.socket \
--no-pager \
-n 100
다음과 같은 조합이면 이 글의 해결 방법이 적용될 가능성이 큽니다.
docker.service: failed
docker.socket: inactive 또는 failed
dockerd 실행 옵션: -H fd://
3. socket activation 복구
먼저 socket 유닛을 활성화하고 시작합니다.
sudo systemctl enable --now docker.socket
그다음 Docker 서비스를 다시 시작합니다.
sudo systemctl restart docker.service
상태를 다시 확인합니다.
sudo systemctl status docker.socket docker.service
Docker가 부팅 시 자동으로 시작되도록 함께 설정하려면 다음을 실행합니다.
sudo systemctl enable docker.service
4. dockerd를 직접 실행한 경우
다음처럼 직접 실행하면 systemd가 소켓을 전달하지 않으므로 fd://에서 실패할 수 있습니다.
sudo dockerd -H fd://
패키지로 설치된 일반적인 환경에서는 직접 dockerd를 실행하기보다 systemd 서비스를 사용합니다.
sudo systemctl start docker
직접 실행이 꼭 필요한 테스트라면 명시적인 Unix socket을 지정할 수 있습니다.
sudo dockerd -H unix:///var/run/docker.sock
다만 운영 설정을 임시 명령으로 바꾸기 전에 기존 systemd 서비스와 /etc/docker/daemon.json 구성을 먼저 확인해야 합니다.
5. 서비스 정의와 override 확인
Docker 서비스가 실제로 어떤 옵션으로 시작되는지 확인합니다.
systemctl cat docker.service
ExecStart에서 다음과 비슷한 부분을 찾습니다.
ExecStart=/usr/bin/dockerd -H fd:// ...
사용자 정의 override가 있는지도 확인합니다.
systemctl show docker.service \
-p FragmentPath \
-p DropInPaths
override를 수정했다면 systemd 설정을 다시 읽고 서비스를 재시작합니다.
sudo systemctl daemon-reload
sudo systemctl restart docker
daemon.json의 hosts 설정과 systemd의 -H 옵션을 동시에 설정하면 충돌할 수 있으므로 둘을 함께 점검합니다.
sudo cat /etc/docker/daemon.json
파일이 없다면 오류가 아니라 기본 설정을 사용하는 상태일 수 있습니다.
6. 정상 동작 검증
서비스와 소켓을 확인합니다.
systemctl is-active docker.socket
systemctl is-active docker.service
정상 기대값은 모두 다음입니다.
active
Docker CLI 연결을 확인합니다.
docker version
docker ps
소켓도 확인합니다.
ls -l /var/run/docker.sock
서비스는 정상인데 일반 사용자에게 permission denied가 발생한다면 socket activation이 아니라 사용자 그룹 권한 문제일 수 있습니다.
원인별 빠른 정리
| 증상 | 가능성이 높은 원인 | 조치 |
|---|---|---|
no sockets found via socket activation |
docker.socket 비활성 |
sudo systemctl enable --now docker.socket |
직접 실행한 dockerd -H fd:// 실패 |
systemd가 FD를 전달하지 않음 | systemd 서비스 사용 |
| service 재시작 후에도 실패 | override 또는 daemon.json 충돌 |
systemctl cat, DropInPaths 확인 |
| Docker 서비스는 active, CLI는 permission denied | 사용자 소켓 권한 문제 | docker 그룹과 세션 확인 |
검증일: 2026-07-11