Docker Desktop for Linux FAQ

Docker Desktop for Linux FAQ

Docker Desktop for Linux에 대해 자주 묻는 질문과 답변을 정리한 문서예요. VM을 쓰는 이유, 파일 공유, Docker SDK 사용, 디스크 이미지 관리 등을 다뤄요.

출처: FAQs for Docker Desktop for Linux

본문

Docker Desktop for Linux는 왜 VM을 실행하나요?

Docker Desktop for Linux가 가상 머신(VM)을 실행하는 이유는 다음과 같아요.

  • 플랫폼 간 일관된 경험 보장: 연구 중 Docker Desktop for Linux를 원하는 가장 빈번한 이유는 모든 주요 운영체제에서 기능 패리티(feature parity)가 있는 일관된 Docker Desktop 경험을 보장하는 것이었어요. VM을 활용하면 Linux 사용자에게 Windows, macOS와 거의 같은 Docker Desktop 경험을 제공할 수 있어요.
  • 새 커널 기능 활용: Docker가 VM 안의 커널과 OS를 제어하기 때문에, 이를 모든 사용자에게 즉시 배포할 수 있어요. 의도적으로 머신 OS의 LTS 버전을 유지하는 사용자에게도요.
  • 보안 강화: 컨테이너 이미지 취약점은 호스트 환경에 보안 위험을 줘요. 확인되지 않은 취약점이 있는 비공식 이미지가 많아요. 악의적인 사용자가 공개 레지스트리에 이미지를 올리고 다양한 방법으로 사용자가 pull/실행하도록 속일 수 있어요. VM 접근 방식은 root 권한을 얻은 악성 코드가 호스트에 접근하지 못하고 VM 환경에 국한되게 해서 이 위협을 완화해요. rootless Docker를 쓰지 않는 이유? rootless는 겉으로 root 접근을 제한해 "top"에서 안전해 보이지만, unprivileged 사용자가 자기 user namespace에서 CAP_SYS_ADMIN을 얻고, unprivileged 사용자가 쓰지 않을 것으로 예상되는 커널 API에 접근해 취약점을 만들 수 있어요.
  • 최소 성능 영향으로 기능 패리티·보안 이점 제공: Linux용 Docker Desktop이 쓰는 VM은 호스트에 있는 디렉터리 트리에 VM이 접근할 수 있게 하는 공유 파일시스템 VirtioFS를 사용해요. Docker 내부 벤치마크에 따르면 VM에 적절한 리소스를 할당하면 VirtioFS로 거의 네이티브에 가까운 파일시스템 성능을 낼 수 있어요. 그래서 Docker Desktop의 VM 기본 메모리가 조정되어 있고, Settings > Resources 탭의 Memory 슬라이더로 자신의 필요에 맞게 조정할 수 있어요.

파일 공유를 어떻게 활성화하나요?

Docker Desktop for Linux는 호스트와 Docker Desktop VM 사이의 파일 공유 메커니즘으로 VirtioFS를 기본(그리고 현재 유일한)으로 사용해요.

Docker Desktop 4.34 및 이전 버전의 추가 정보: 상승된 권한을 요구하지 않으면서 공유 파일에 대한 작업을 불필요하게 제한하지 않기 위해, Docker Desktop은 UID/GID 매핑이 구성된 user namespace(user_namespaces(7) 참고) 안에서 파일 공유 서비스(virtiofsd)를 실행해요. 그 결과 Docker Desktop은 호스트가 현재 사용자의 하위 ID 위임(subordinate ID delegation)을 활성화하도록 구성되어 있기를 의존해요. 이를 위해 /etc/subuid(subuid(5) 참고)와 /etc/subgid(subgid(5) 참고)가 있어야 해요. Docker Desktop은 파일로 구성된 하위 ID 위임만 지원해요. 컨테이너에서 현재 사용자 ID와 GID를 0으로 매핑하고, 컨테이너에서 0보다 큰 ID 매핑을 설정하기 위해 /etc/subuid/etc/subgid에서 현재 사용자에 해당하는 첫 번째 항목을 사용해요.

컨테이너의 ID 호스트의 ID
0 (root) Docker Desktop을 실행하는 사용자의 ID (예: 1000)
1 /etc/subuid//etc/subgid에 지정된 ID 범위 시작 + 0 (예: 100000)
2 ID 범위 시작 + 1 (예: 100001)
3 ID 범위 시작 + 2 (예: 100002)
... ...

/etc/subuid/etc/subgid가 없다면 만들어야 해요. 둘 다 <사용자>:<시작>:<개수> 형식의 항목을 포함해야 해요. 예를 들어 현재 사용자가 100,000부터 165,535까지의 ID를 쓰게 하려면:

$ grep "$USER" /etc/subuid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subuid)
$ grep "$USER" /etc/subgid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subgid)

구성이 올바르게 만들어졌는지 확인하려면 내용을 살펴봐요.

$ echo $USER
exampleuser
$ cat /etc/subuid
exampleuser:100000:65536
$ cat /etc/subgid
exampleuser:100000:65536

이 시나리오에서 공유 파일을 UID 1000인 사용자가 Docker Desktop 컨테이너 안에서 chown하면 호스트에서는 UID 100999인 사용자가 소유한 것으로 표시돼요. 이 부작용으로 호스트에서 그런 파일에 쉽게 접근하기 어려워져요. 새 GID로 그룹을 만들고 사용자를 그 그룹에 추가하거나, Docker Desktop VM과 공유하는 폴더에 재귀 ACL(setfacl(1) 참고)을 설정하면 문제가 해결돼요.

Docker SDK는 어떻게 사용하나요?

Docker Desktop for Linux는 시스템 전체 소켓 /var/run/docker.sock 대신 ~/.docker/desktop/docker.sock에 있는 per-user 소켓을 사용해요. Docker CLI는 desktop-linux 컨텍스트로 이를 자동 처리하지만, Docker 데몬에 직접 연결하는 Docker SDK와 다른 도구도 DOCKER_HOST 환경 변수를 설정해야 해요. 설정하지 않으면 SDK가 /var/run/docker.sock에 연결하려 시도하고 이런 오류가 나요.

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

이를 고치려면 SDK 기반 애플리케이션을 실행하기 전에 DOCKER_HOST를 설정해요.

export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock

또는 desktop-linux 컨텍스트에서 동적으로 가져올 수 있어요.

export DOCKER_HOST=$(docker context inspect desktop-linux --format '{{ .Endpoints.docker.Host }}')

영구적으로 하려면 셸 프로파일(~/.bashrc, ~/.zshrc 등)에 export 명령을 추가해요.

echo 'export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock' >> ~/.bashrc

Docker Desktop은 Linux 컨테이너를 어디에 저장하나요?

Docker Desktop은 Linux 컨테이너와 이미지를 Linux 파일시스템의 하나의 큰 "disk image" 파일에 저장해요. 이는 컨테이너와 이미지를 호스트 파일시스템의 /var/lib/docker 디렉터리에 보통 저장하는 Linux의 Docker와 다르다는 점이에요.

디스크 이미지 파일은 어디에 있나요?

디스크 이미지 파일을 찾으려면 Docker Desktop Dashboard에서 Settings 를 선택하고 Resources 탭의 Advanced 를 선택해요. Advanced 탭은 디스크 이미지의 위치, 최대 크기, 실제 사용 공간을 표시해요. 다른 도구는 실제 파일 크기가 아니라 최대 파일 크기로 공간 사용을 표시할 수 있다는 점을 참고하세요.

파일이 너무 크면?

디스크 이미지 파일이 너무 크면 다음을 할 수 있어요.

  • 더 큰 드라이브로 이동
  • 불필요한 컨테이너와 이미지 삭제
  • 파일의 최대 허용 크기 줄이기

더 큰 드라이브로 이동: Settings > Resources 탭의 Advanced에서 Disk image location 섹션의 Browse를 선택해 새 위치를 고르고 Apply 를 선택해요. Finder에서 직접 파일을 옮기면 Docker Desktop이 파일을 추적하지 못할 수 있으니 하지 마세요.

불필요한 컨테이너/이미지 삭제: 클라이언트와 데몬 API가 1.25 이상이면 docker system df -v로 자세한 공간 사용 정보를 볼 수 있어요. 이미지를 나열하려면 docker image ls, 컨테이너를 나열하려면 docker container ls -a를 실행해요.

더 알아보기