문제
sudo docker-compose down 명령어를 사용해도 컨테이너가 종료되지 않는다.

ERROR: cannot stop container: permission denied
error while removing network: network has active endpoints
docker kill도 먹지 않는다.
sudo usermod -aG docker $USER 명령어로 사용자를 도커 그룹에 추가해도 결과는 같았다.
아니 내가 관리자 sudo고... 도커 그룹에도 있는데... 나를 입뺀시켜? 🤨
원인
알고 보니 AppArmor 때문이었다.

AppArmor는 리눅스 커널 보안 모듈(LSM, Linux Security Modules)로, 응용프로그램을 보호하는 MAC 메커니즘 중 하나이다.
커널 레벨에서 작동하기 때문에 당연히 sudo 권한을 이긴다.
근데 골때리게도 수없이 많은 Permission Denied 메시지 속에 AppArmor라는 이름은 한 톨도 나오지 않는다 😂
AppArmor 때문인지 진단하는 과정은 다음과 같았다.
1. AppArmor 상태 확인
sudo aa-status

여기서 enforce 모드에 docker-default 프로파일이 등록되어 있는 것을 확인할 수 있다.
AppArmor는 enforce 모드와 complain 모드 2가지를 제공한다.
enforce 모드는 응용프로그램이 제한된 동작을 수행하지 못하게 차단하고,
complain 모드는 위반 기록을 남길 뿐 차단하지는 않는다.
Docker는 docker-default라는 AppArmor 프로파일을 자동으로 생성해 컨테이너마다 적용한다.
이는 메모리 상의 동적 프로파일로, Docker 데몬이 동적으로 커널에 로드하기 때문에 AppArmor 내에서 비활성화할 수 없다.
(내가 Docker를 Snap으로 설치해서 그런 걸 수도 있음. Snap 앱은 자체 샌드박싱이 강력해서 aa-disable 명령어 같은 AppArmor 제어가 어렵다고 함. 나중에 AppArmor 때문에 계속 골머리 썩으면 스냅으로 설치한 거 지우고 apt로 설치 시도해봐도 될 듯)
2. Docker 로그에서 AppArmor 관련 오류 확인
sudo dmesg | grep -i apparmor

같은 패턴이 반복되고 있다.
audit: type=1400 audit(...) apparmor="DENIED" operation="signal" class="signal" profile="docker-default" pid=2256 comm="dockerd" requested_mask="receive" denied_mask="receive" signal=kill peer="snap.docker.dockerd"
AppArmor의 docker-default 프로필에 의해 작업이 제한되고 있는 것을 알 수 있다!
자세히 보면 kill 시그널도 거부하고 있고, Docker 데몬(dockerd)과 snap 패키지도 관련되어 있다.
해결
docker-compose.yml 파일에서, Permission Denied되는 컨테이너 부분에 아래처럼 추가하면 된다.
security_opt:
- apparmor=unconfined

security_opt 항목은 Docker가 --security-opt 플래그에 문자열 형태로 전달하기 때문에,
띄어쓰기 없는 key=value 형태여야 한다.
적용했다면 재부팅 후 컨테이너를 내려보자.
sudo reboot
docker-compose down

깔끔하게 제거되었다 😆
+추가
또!!!


이번엔 네트워크가 제거되지 않는다.
지긋지긋한 에러 메시지...
Error response from daemon: error while removing network: network elk-llm_elk-network has active endpoints (ollama, kibana)
exit status 1
AppArmor에 unconfined 설정을 적용하기 전에 생성된 컨테이너들이 여전히 시스템에 남아있어 완벽하게 제거되지 않는 것 같다.
따라서 강제 초기화로 도커 상태를 리셋했다.
초기화
1. Docker 데몬 및 관련 서비스 강제종료

Docker 데몬에 중지 명령을 보내도 docker.socket이 아직 활성화되어 있다고 한다.
그래서 docker.socket까지 중지시켰다.

2. Docker 데이터 디렉토리 삭제
도커 데몬이 완전히 중지되었으므로 이제 아래 명령어를 차례로 입력한다.
sudo rm -rf /var/lib/docker
sudo systemctl start docker
3. 끝
깨끗한 마음가짐으로 새로 빌드해주자!
++추가...
다른 문제들도 계속 생겨서 결국 snap으로 설치한 거 지우고 apt로 다시 깔았다.
Ubuntu 22.04에서 Docker를 Snap으로 설치한 경우, 내부 동작이 전통적인 apt 설치와 다름.
Snap 샌드박스 때문에 이미지 관리나 overlayfs 캐시가 독특하게 작동해서 이미지를 지웠다고 생각했지만 캐시된 버전이 남아있을 수 있음.
특히 Snap은 ~/.local/share/docker 같은 이상한 경로에 데이터 남기기도 함.
라고 한다...
다음에는 처음부터 apt로 설치하자.
참고: https://velog.io/@dlrudgjs104/Docker-컨테이너에서-AppArmor-docker-default-Permission-Denied-문제-해결하기
'𝐞𝐭𝐜.' 카테고리의 다른 글
| [Elasticsearch/Docker] 애플 M4 맥북에서 ES 도커 컨테이너 실행 안 되는 버그 해결하기 (0) | 2025.07.01 |
|---|---|
| [VMware/Ubuntu] 로그인 후 검은 화면 해결하기 (0) | 2025.07.01 |
| TOCTOU (0) | 2025.06.10 |
| 레이스 컨디션 (0) | 2025.06.09 |
| [케쉴주] Mimikatz를 이용한 패스워드 크랙 (0) | 2025.03.16 |