πŸ” Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ AppArmor `docker-default` Permission Denied 문제 ν•΄κ²°ν•˜κΈ°

μ΄κ²½ν—ŒΒ·2025λ…„ 4μ›” 8일

CI/CD 배포 쀑 docker stop λͺ…령이 permission denied 였λ₯˜λ₯Ό 내뱉은 적 μžˆμœΌμ‹ κ°€μš”?
Docker κ·Έλ£Ήκ³Ό sudo κΆŒν•œμ„ λͺ¨λ‘ κ°€μ§„ κ³„μ •μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  λ°œμƒν•˜λŠ” 이슈의 원인은 λŒ€λΆ€λΆ„ Linux AppArmor의 docker-default ν”„λ‘œνŒŒμΌμž…λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” 곡식 λ¬Έμ„œλ₯Ό 기반으둜, AppArmor docker-defaultλ₯Ό μš°νšŒν•˜κ±°λ‚˜ λΉ„ν™œμ„±ν™”ν•˜λŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.


🧩 문제 상황

sudo docker stop eventor-front-blue-1
# Error response from daemon: cannot stop container: eventor-front-blue-1: permission denied
  • eventor 계정은 Docker 그룹에도 속해 있고, sudo κΆŒν•œλ„ 있음
  • κ·ΈλŸ°λ°λ„ docker stop λͺ…λ Ήμ—μ„œ κΆŒν•œ 였λ₯˜

πŸ•΅οΈ 원인: AppArmor docker-default의 μ œν•œ

  • DockerλŠ” μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ docker-defaultλΌλŠ” AppArmor λ³΄μ•ˆ ν”„λ‘œνŒŒμΌμ„ 기본으둜 μ μš©ν•©λ‹ˆλ‹€.
  • 이 ν”„λ‘œνŒŒμΌμ€ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€μ˜ 행동을 μ œν•œν•©λ‹ˆλ‹€.
  • Dockerκ°€ μžλ™μœΌλ‘œ tmpfs에 생성해 컀널에 λ‘œλ“œν•˜λ―€λ‘œ, /etc/apparmor.d/와 같은 κ²½λ‘œμ— μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ”°λΌμ„œ 일반적인 λ°©λ²•μœΌλ‘œλŠ” λΉ„ν™œμ„±ν™”λ‚˜ μ–Έλ‘œλ“œκ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

βœ… ν•΄κ²° 방법: AppArmor λΉ„ν™œμ„±ν™” (unconfined μ„€μ •)

1. Docker CLIμ—μ„œ AppArmor 우회

docker run --rm -it --security-opt apparmor=unconfined hello-world

--security-opt apparmor=unconfined μ˜΅μ…˜μ„ 톡해 AppArmor 적용 없이 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.


2. docker-compose.yml에 적용

services:
  eventor-front-blue:
    image: dlrudgjs104/eventor-front:blue-1
    container_name: eventor-front-blue-1
    ports:
      - "8001:8080"
    volumes:
      - ./blue-1-logs:/app/logs
    security_opt:
      - apparmor=unconfined

이 섀정을 μ μš©ν•˜λ©΄ docker-defaultκ°€ μ•„μ˜ˆ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


❌ μ‹œλ„ν•΄λ„ μ•ˆ λ˜λŠ” 방법

sudo apparmor_parser -R /etc/apparmor.d/docker
# File not found...
  • docker-defaultλŠ” 파일이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μƒμ˜ 동적 ν”„λ‘œνŒŒμΌμž…λ‹ˆλ‹€.
  • λ”°λΌμ„œ 이 λ°©λ²•μœΌλ‘œλŠ” μ œκ±°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

πŸ›  AppArmor 자체λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” 방법 (Ubuntu 계열)

AppArmorκ°€ λ„ˆλ¬΄ μ œν•œμ μ΄λΌλ©΄, μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ AppArmorλ₯Ό μ™„μ „νžˆ λΉ„ν™œμ„±ν™”ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€.

sudo aa-remove-unknown
sudo systemctl restart docker
  • aa-remove-unknown: μ‹œμŠ€ν…œμ— λ“±λ‘λ˜μ§€ μ•Šμ€ AppArmor ν”„λ‘œνŒŒμΌ 제거
  • systemctl restart docker: Docker μž¬μ‹œμž‘ (λ³€κ²½ 사항 반영)

⚠️ 주의
이 방법은 μž¬λΆ€νŒ… μ‹œ AppArmorκ°€ λ‹€μ‹œ ν™œμ„±ν™”λ©λ‹ˆλ‹€.
μ™„μ „ν•œ ν•΄μ œλ₯Ό μœ„ν•΄μ„œλŠ” GRUB μ„€μ • λ³€κ²½ λ“± 영ꡬ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€.

0개의 λŒ“κΈ€