2025. 1. 15. 16:53ㆍETC
Macbook Air M3 칩을 사용하고 있는데 갑자기 Docker Desktop 앱이 실행 안되는 오류가 발생하고 있다.
https://docs.docker.com/desktop/setup/install/mac-install/
위 url에 들어가 docker desktop을 재설치해도 마찬가지로 오류가 발생하고 있다.
도커 공식 repository에 Malware detection prevents Docker Desktop to start 라는 issue에 해당 오류와 관련된 내용들이 나오는데
check.sh.txt를 다운받고 이름을 변경 한 뒤 ./check.sh /Library/PrivilegedHelperTools/com.docker.vmnetd 를 실행하라는 내용이 나온다.
check.sh
#!/bin/bash
set -e
# check if codesign and openssl are installed
which codesign > /dev/null 2>&1 || { echo "codesign is not installed"; exit 1; }
which openssl > /dev/null 2>&1 || { echo "openssl is not installed"; exit 1; }
# if no parameter is provided, use the default binary file
binary_file="$1"
if [ $# -ne 1 ]; then
binary_file="/Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd"
fi
# create a folder with temp folder to extract the certificates into
timestamp=$(date "+%Y%m%d_%H%M%S")
folder_name="${TMPDIR:-/tmp}/docker-desktop_cert_check_$timestamp"
mkdir -p "$folder_name"
cd "$folder_name"
# extract and check if the extraction was successful
if ! codesign -d --extract-certificates "$binary_file" >/dev/null 2>&1
then
echo "Failed to extract certificates from $binary_file"
exit 1
fi
# run the OpenSSL command and capture the output
certificate_details=$(openssl x509 -noout -serial -subject -issuer -dates -in codesign0)
binary_name=$(basename "$binary_file")
cd ..
rm -rf "$folder_name"
echo "-----------------------------------------------------------------"
echo "Certificate details for $binary_name:"
echo "$certificate_details" | tr '\\n' ',' | tr -s ',' | tr ',' '\\n' | while read -r line; do
echo " $line"
done
echo "-----------------------------------------------------------------"
echo ""
# check for specific serial numbers
if [[ "$certificate_details" == *"serial=1316FD127D9A5715176591F85FFC3C66"* ]]; then
echo "$binary_name is signed with a revoked certificate"
echo "please download and install a new version of Docker Desktop"
exit 1
elif [[ "$certificate_details" == *"serial=3EC22E699630083A"* ]]; then
echo "$binary_name is signed with a correct certificate"
exit 0
else
echo "$binary_name is signed with an unknown certificate"
echo "please download and install a new version of Docker Desktop"
exit 1
fi⏎
스크립트를 실행 하면 아래와 같은 내용이 출력된다.
-----------------------------------------------------------------
Certificate details for com.docker.vmnetd:
serial=3EC22E699630083A
subject=UID=9BNSXJN65R
CN=Developer ID Application: Docker Inc (9BNSXJN65R)
OU=9BNSXJN65R
O=Docker Inc
C=US
issuer=CN=Developer ID Certification Authority
OU=Apple Certification Authority
O=Apple Inc.
C=US
notBefore=Oct 2 16:46:37 2024 GMT
notAfter=Feb 1 22:12:15 2027 GMT
-----------------------------------------------------------------
com.docker.vmnetd is signed with a correct certificate
올바른 인증서라고 나오지만 docker desktop 앱이 제대로 실행되지는 않는다.
#!/bin/bash
# Stop the docker services
echo "Stopping Docker..."
sudo pkill '[dD]ocker'
# Stop the vmnetd service
echo "Stopping com.docker.vmnetd service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist
# Stop the socket service
echo "Stopping com.docker.socket service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist
# Remove vmnetd binary
echo "Removing com.docker.vmnetd binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
# Remove socket binary
echo "Removing com.docker.socket binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket
# Install new binaries
echo "Install new binaries..."
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
해당 issue 글에서는 위 script를 실행하라고 되어 있어 실행해 보았다.
Stopping Docker...
Password:
Stopping com.docker.vmnetd service...
Stopping com.docker.socket service...
Removing com.docker.vmnetd binary...
Removing com.docker.socket binary...
Install new binaries...
이런 결과가 나온다. (중간에 패스워드 입력 필요)
이제 정상적으로 docker desctop 앱이 실행되는지 확인해보면 이미지처럼 정상 동작하고 있다.
https://github.com/docker/for-mac/issues/7527
위 URL에서 git repository issue 원본글을 확인해 볼 수 있다.
오류가 해결된 shell script 동작 설명
아래 내용은 이 오류를 해결하는데 도움이 되었던 shell script가 어떻게 동작하는지에 대한 설명이다.
실행한 script
#!/bin/bash
# Stop the docker services
echo "Stopping Docker..."
sudo pkill '[dD]ocker'
# Stop the vmnetd service
echo "Stopping com.docker.vmnetd service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist
# Stop the socket service
echo "Stopping com.docker.socket service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist
# Remove vmnetd binary
echo "Removing com.docker.vmnetd binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
# Remove socket binary
echo "Removing com.docker.socket binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket
# Install new binaries
echo "Install new binaries..."
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
이 스크립트는 맥OS 환경에서 Docker Desktop이 사용하는 핵심 서비스(데몬)와 바이너리를 강제로 중단하고, 필요한 파일을 다시 복사해 재설치하는 과정을 자동화한 것입니다. 즉, Docker가 비정상 동작하거나 ‘com.docker.vmnetd’ 관련 오류가 날 때 이를 강제로 초기화/복구해주기 위한 목적을 가진 스크립트라고 볼 수 있습니다.
아래는 주요 단계를 하나씩 해석한 내용입니다.
1) sudo pkill '[dD]ocker'
- Docker 프로세스 강제 종료
- 대소문자를 구분하지 않고(Docker, docker 모두) 프로세스명을 찾아서 kill합니다.
- 이 과정을 통해 Docker Desktop이 실행 중이면 모두 강제 종료됩니다.
2) sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist
- com.docker.vmnetd 서비스 중단
- macOS에는 launchctl이란 프로세스 관리자(Launch Daemons/Agents)가 있는데, com.docker.vmnetd.plist는 Docker 네트워킹과 관련된 privileged helper daemon을 관리하는 설정 파일입니다.
- bootout system 명령을 통해 시스템 레벨(전역)에서 해당 데몬을 언로드(중단)시킵니다.
3) sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist
- com.docker.socket 서비스 중단
- 위와 같은 방식으로 Docker의 소켓 관련 서비스를 멈춥니다.
- Docker가 내부적으로 사용하는 소켓 daemon을 종료하는 것으로 보입니다.
4) sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
- 기존 ‘com.docker.vmnetd’ 바이너리(실행 파일) 삭제
- /Library/PrivilegedHelperTools 디렉터리에는 시스템에서 루트 권한이 필요한 다양한 Helper 툴들이 위치합니다.
- Docker의 네트워크 기능(vmnetd)을 담당하는 실행 파일을 제거해, 추후 새로운 파일로 교체하기 위한 사전 준비입니다.
5) sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket
- 기존 ‘com.docker.socket’ 바이너리(실행 파일) 삭제
- 위와 같은 이유로, Docker 소켓 관련 파일도 제거합니다.
6) sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
- 새로운 vmnetd 바이너리 복사(설치)
- Docker Desktop 앱 내부 경로(/Applications/Docker.app/...)에 포함된 정상/최신 버전의 com.docker.vmnetd 실행 파일을, macOS 시스템 폴더 /Library/PrivilegedHelperTools/로 복사합니다.
- 이는 오류나 손상 없이 서명된 Docker의 공식 바이너리를 다시 설치하는 것이기도 합니다.
7) sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
- 새로운 socket 바이너리 복사(설치)
- 마찬가지로 com.docker.socket 실행 파일을 정상 위치로 복사합니다.
결과적으로 어떤 동작을 하나?
- Docker 프로세스와 서비스 완전 중단 (pkill + launchctl)
- 오류가 나거나 손상된(혹은 구 버전) 바이너리 제거
- Docker Desktop 앱 안에 있는 정식 바이너리를 시스템 폴더에 다시 복사
- 이후 사용자가 Docker Desktop을 다시 실행하면, 갓 복사된(정상 동작 가능한) vmnetd와 socket 데몬을 새로 로드함.
이 과정을 통해 Docker 관련 데몬이 깨끗이 재설치되므로, 비정상 동작 상태나 com.docker.vmnetd 오류가 해소되고, Docker Desktop이 정상적으로 실행될 수 있게 됩니다.
정리
- 이 Shell Script는 맥OS에서 도커 데몬을 강제로 중단 → 오래되거나 손상된 docker helper 툴 삭제 → Docker Desktop에 포함된 새 바이너리를 다시 복사하는 일련의 과정을 자동으로 처리합니다.
- 흔히 com.docker.vmnetd 오류나, Docker Desktop이 정상 구동되지 않을 때 수동으로 조치하던 작업을 한 번에 스크립트화한 것이라고 볼 수 있습니다.
- 스크립트 실행 후, Docker Desktop을 다시 실행하면 새로운 데몬들이 로드되어 문제 없이 구동되는 것이죠.
'ETC' 카테고리의 다른 글
조인 테이블이 있으면 다대다 관계다? (1) | 2024.12.28 |
---|---|
편의성을 위한 Shell alias 만들기 (1) | 2024.10.29 |
구글 추천 도서 목록 (1) | 2024.03.30 |
Vmmem 메모리 문제 해결 (Docker Desktop) (0) | 2024.01.30 |
팀 어번 - The AI Revolution (엘론 머스크, 스티븐 호킹 등 많은 유명인들이 인공지능을 경계하라고 호소하는가?) (2) | 2024.01.07 |