소스 사용자는 이 실패를 “새로 설치한 후에도 Docker가 이미지를 설치할 수 없다”라고 해석했지만, 실제 터미널 출력에는 서로 다른 두 가지 문제가 나타났습니다. 다음 명령을 실행하면 docker info 권한 상승 없이 실행하면 Docker 소켓에서 실패했지만, Docker 권한으로 Mosquitto 컨테이너를 실행하자 성공적으로 가져왔습니다. eclipse-mosquitto:latest그러면 컨테이너는 다른 이유로 실패했습니다. 바인드 마운트가 호스트 경로와 컨테이너 경로를 서로 호환되지 않는 파일/디렉터리 유형으로 취급하려고 했기 때문입니다.
이 구분은 매우 중요합니다. Debian, CasaOS 또는 Docker를 다시 설치해도 잘못된 유형의 파일 시스템 객체를 가리키는 바인드 마운트 문제는 해결되지 않습니다.
문제 1: 일반 사용자가 Docker 소켓에 액세스할 수 없음
첫 번째 docker info 출력은 다음과 같았습니다.
Docker 데몬 소켓에 연결하려는 중 권한이 거부됨
unix:///var/run/docker.sock
이는 셸 사용자가 Docker 데몬과 직접 통신할 권한이 없었다는 의미입니다. 동일한 명령이 다음을 사용하면 작동했습니다. sudo이며, 데몬 자체에는 연결할 수 있음을 보여 줍니다.
이는 이후에 발생한 Mosquitto 시작 오류와는 별개의 문제입니다.
Mosquitto 이미지가 성공적으로 다운로드됨
Docker가 다음과 같이 보고했습니다.
상태: eclipse-mosquitto:latest의 최신 이미지가 다운로드됨
따라서 레지스트리, 이미지 이름, 인터넷 연결이 즉각적인 문제는 아니었습니다. Docker가 컨테이너 파일 시스템을 생성하고 바인드 마운트를 적용하려고 할 때만 오류가 발생했습니다.
실제 오류는 파일과 디렉터리 간 마운트였습니다
명령은 다음을 매핑하려고 했습니다.
/etc/mosquitto/mosquitto.conf
→ /mosquitto/config/mosquitto.conf
그러자 Docker가 다음과 같이 보고했습니다.
디렉터리가 아님
디렉터리를 파일에 마운트하려는 것인가요(또는 그 반대인가요)?
이 메시지는 문자 그대로 받아들여야 합니다. 매핑의 한쪽이 명령에서 예상한 유형이 아니었습니다.
-v가 잘못된 유형을 자동으로 생성할 수 있는 이유
현재 Docker 문서에서는 -v/--volume 사용 시 쉽게 빠질 수 있는 함정을 설명합니다. 소스 경로가 존재하지 않으면 Docker가 이를 자동으로 디렉터리로 생성합니다.
따라서 /etc/mosquitto/mosquitto.conf 이미 실제 파일로 존재하지 않았다면 Docker는 다음이라는 이름의 디렉터리를 만들 수 있습니다 mosquitto.conf해당 디렉터리를 컨테이너에서 예상하는 설정 파일에 마운트하면 소스 스레드에서 본 것과 정확히 같은 오류가 발생합니다.
컨테이너를 시작하기 전에 Docker의 현재 바인드 마운트 동작을 사용하여 소스가 파일인지 디렉터리인지 확인하세요.
커뮤니티는 Mosquitto 디렉터리 매핑 방식으로 전환했습니다
한 답변자가 세 개의 영구 디렉터리를 매핑하는 Compose 정의를 공유했습니다.
- 호스트 설정 디렉터리 →
/mosquitto/config - 호스트 데이터 디렉터리 →
/mosquitto/data - 호스트 로그 디렉터리 →
/mosquitto/log
이렇게 하면 아직 존재하지 않을 수 있는 단일 파일 마운트의 불안정성을 피하고 Mosquitto에 일반적인 영구 저장소 구성을 제공합니다.
설정 파일은 여전히 설정 디렉터리 안에 있어야 합니다
디렉터리를 매핑한다고 해서 유효한 Mosquitto 설정이 자동으로 생성되지는 않습니다. 답변자는 사용자에게 다음을 배치하라고 안내했습니다 mosquitto.conf 브로커를 시작하기 전에 매핑된 설정 디렉터리에 넣으세요.
새로 배포할 때는 먼저 설정을 실제 파일로 만든 다음 상위 디렉터리를 마운트하거나, Docker의 더 명시적인 --mount 구문을 사용하면 존재하지 않는 소스 디렉터리를 조용히 생성하지 않고 오류가 발생합니다.
CasaOS 사용자 지정 설치로 원시 docker run 명령 없이 동일한 구성을 구현할 수 있습니다
커뮤니티에서는 CasaOS의 사용자 지정 애플리케이션 워크플로를 통해 Compose 정의를 가져오는 과정을 안내했습니다. 이후 사용자는 커뮤니티 앱 스토어에서 Mosquitto 패키지를 설치했고 즉시 작동한다고 보고했습니다.
이 결과는 Docker 호스트 자체에서 Mosquitto를 실행할 수 있었음을 확인해 줍니다. 이전 문제는 CasaOS 재설치 실패가 아니라 설정 문제였습니다.
실행 중인 브로커에도 MQTT 인증 및 리스너 설정이 필요합니다
이후 사용자는 Node-RED가 연결되지 않는 이유와 Mosquitto가 터미널 사용자 이름/비밀번호를 자동으로 사용하는지 물었습니다. 그렇지 않습니다. MQTT 인증은 Mosquitto 자체에서 설정 및 비밀번호 파일을 통해 구성됩니다.
컨테이너 상태가 정상이라고 해서 브로커가 인증되지 않은 클라이언트를 사용할 준비가 되었다고 단정하지 마세요.
시간대는 컨테이너 설정의 마지막 세부 사항이었습니다
작동하는 커뮤니티 패키지를 설치한 후에도 사용자는 적절한 시간대 환경 값을 추가해야 했습니다. 이는 애플리케이션/런타임 세부 사항이며, 또 다른 Docker 설치 실패의 증거가 아닙니다.
Mosquitto Docker 오류 FAQ
Docker가 eclipse-mosquitto를 다운로드하지 못했나요?
아니요. 소스 출력에 따르면 이미지가 정상적으로 다운로드되었습니다.
컨테이너가 시작되지 않은 이유는 무엇인가요?
바인드 마운트에서 파일과 디렉터리의 유형이 일치하지 않았습니다 mosquitto.conf.
docker -v를 사용하면 존재하지 않는 호스트 파일이 디렉터리가 될 수 있는 이유는 무엇인가요?
Docker의 --volume 이 동작은 존재하지 않는 호스트 소스를 디렉터리로 생성하여 파일 간 바인드 마운트를 손상시킬 수 있습니다.
CasaOS를 다시 설치하면 문제가 해결되었나요?
아니요. 사용자는 결국 올바른 애플리케이션/컨테이너 설정을 사용한 후 성공했습니다.
