WSL2 Docker Engine 설치 가이드
Docker Desktop 없이 WSL2에서 Docker Engine을 직접 설치하면 메모리 1~2GB를 절약할 수 있습니다. Ubuntu 24.04 + systemd 설정으로 Windows 재부팅 후에도 자동 시작되며, 기존 Docker Desktop 이미지/볼륨도 100% 이관 가능합니다.
이 가이드가 필요한 이유
왜 Docker Desktop 대신 Docker Engine인가요?
Docker Desktop은 GUI가 편리하지만:
- 유휴 상태에서도 2~3GB 메모리 점유
- 기업 사용 시 유료 라이선스 필요 (직원 250명 이상 또는 연 매출 $10M 이상)
- WSL2 통합 시 추가 오버헤드 발생
반면 Docker Engine 직접 설치 시:
- 500MB~1GB로 메모리 절반 이하 사용
- 완전 무료 (오픈소스)
- 동일한 Docker 명령어 100% 호환
아키텍처 이해하기
┌─────────────────────────────────────────────────────────┐
│ Windows 11 │
│ ┌───────────────────────────────────────────────────┐ │
│ │ WSL2 (Ubuntu 24.04) │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Docker Engine │ │ │
│ │ │ ├── dockerd (데몬) │ │ │
│ │ │ ├── containerd │ │ │
│ │ │ └── runc │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ /mnt/c/ <-> C:\ (Windows 파일시스템 마운트) │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
신입 개발자를 위한 설명:
- WSL2: Windows 안에서 돌아가는 진짜 Linux (가상머신 기반)
- dockerd: Docker 명령어를 받아서 처리하는 백그라운드 서비스
- containerd: 실제 컨테이너 생명주기를 관리
- runc: 컨테이너를 실제로 실행하는 저수준 도구
- /mnt/c/: WSL2에서 C드라이브에 접근하는 경로
1단계: 사전 요구사항 확인
시스템 요구사항
| 항목 | 요구사항 | 확인 방법 |
|---|---|---|
| OS | Windows 10 (2004 이상) 또는 Windows 11 | winver 실행 |
| RAM | 최소 8GB (권장 16GB) | 작업관리자 -> 성능 |
| CPU | 가상화 지원 (VT-x/AMD-V) | BIOS에서 활성화 필요 |
| 저장소 | 최소 20GB 여유 공간 | 파일 탐색기 |
Windows 기능 확인
PowerShell (관리자 권한) 에서 실행:
# 가상화 지원 확인
systeminfo | findstr /i "Hyper-V"
# WSL 버전 확인
wsl --version
필수 Windows 기능 활성화
# WSL 및 가상 머신 플랫폼 활성화
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 재부팅 필요
Restart-Computer
주의: 위 명령어 실행 후 반드시 재부팅해야 합니다!
2단계: WSL2 환경 설정
WSL2 설치 및 설정
PowerShell에서 실행:
# WSL 업데이트
wsl --update
# WSL2를 기본 버전으로 설정
wsl --set-default-version 2
# 사용 가능한 배포판 목록
wsl --list --online
Ubuntu 24.04 설치
# Ubuntu 24.04 설치
wsl --install -d Ubuntu-24.04
# 설치 확인
wsl -l -v
출력 예시:
NAME STATE VERSION
* Ubuntu-24.04 Running 2
VERSION이 2인지 확인하세요! 1이면 WSL1이라 Docker가 제대로 동작하지 않습니다.
기존 WSL1을 WSL2로 변환 (해당되는 경우)
# 현재 버전 확인
wsl -l -v
# WSL2로 변환 (시간 소요)
wsl --set-version Ubuntu-24.04 2
# 변환 완료 확인
wsl -l -v
WSL2 리소스 제한 설정 (메모리 관리)
Windows의 %UserProfile%\.wslconfig 파일 생성:
# PowerShell에서 실행
notepad "$env:USERPROFILE\.wslconfig"
파일 내용 (복사해서 붙여넣기):
[wsl2]
memory=4GB
swap=2GB
processors=2
localhostForwarding=true
[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
설정 적용:
wsl --shutdown
wsl -d Ubuntu-24.04
autoMemoryReclaim=gradual: WSL2가 사용하지 않는 메모리를 점진적으로 Windows에 반환합니다. 메모리 부족 문제 해결에 효과적!
3단계: Docker Engine 설치
여기서부터는 WSL2 Ubuntu 터미널에서 실행합니다! PowerShell에서
wsl또는wsl -d Ubuntu-24.04입력하여 Ubuntu로 진입하세요.
기존 패키지 제거
# 기존 Docker 관련 패키지 제거
sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
# 잔여 파일 정리
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
필수 패키지 설치
# 패키지 업데이트
sudo apt update
# 필수 패키지 설치
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
Docker 공식 저장소 추가
# GPG 키 디렉토리 생성
sudo install -m 0755 -d /etc/apt/keyrings
# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 저장소 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engine 설치
# 패키지 인덱스 업데이트
sudo apt update
# Docker 패키지 설치
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
# 버전 확인
docker --version
docker compose version
4단계: 설치 후 설정
systemd 활성화 (WSL2)
# /etc/wsl.conf 설정
sudo tee /etc/wsl.conf <<EOF
[boot]
systemd=true
[interop]
enabled=true
appendWindowsPath=true
[automount]
enabled=true
options="metadata,umask=22,fmask=11"
EOF
PowerShell에서 WSL 재시작:
wsl --shutdown
wsl -d Ubuntu-24.04
/etc/wsl.conf 설정 상세 설명
| 섹션 | 설정 | 의미 |
|---|---|---|
| [boot] | systemd=true | WSL2 시작 시 systemd를 PID 1로 실행. systemctl 명령어로 서비스 관리 가능 |
| [interop] | enabled=true | WSL에서 Windows 프로그램 직접 실행 허용 (예: notepad.exe, code .) |
| [interop] | appendWindowsPath=true | Windows PATH를 WSL PATH에 추가. .exe 경로 지정 불필요 |
| [automount] | enabled=true | Windows 드라이브를 /mnt/c, /mnt/d 등에 자동 마운트 |
| [automount] | metadata | Linux 파일 권한(chmod)을 Windows 파일에 저장. git 권한 문제 해결 |
| [automount] | umask=22 | 디렉토리 기본 권한 755 (rwxr-xr-x) |
| [automount] | fmask=11 | 파일 기본 권한 666 (rw-rw-rw-) |
왜 이 설정들이 중요한가요?
systemd 없으면:
systemctl명령어 사용 불가- Docker를 매번 수동 시작해야 함 (
sudo dockerd &)metadata 없으면:
chmod +x script.sh실행 권한이 재부팅 시 사라짐- git에서 파일 권한 변경이 계속 diff로 잡힘
interop 없으면:
- WSL에서
code .로 VS Code 열기 불가explorer.exe .로 폴더 열기 불가
appendWindowsPath=true 실전 예시:
# 현재 폴더를 Windows 탐색기로 열기
explorer.exe .
# VS Code로 현재 프로젝트 열기
code .
# 텍스트를 Windows 클립보드에 복사
echo "복사할 내용" | clip.exe
cat ~/.ssh/id_rsa.pub | clip.exe # SSH 공개키 복사
# Windows 기본 브라우저로 URL 열기
cmd.exe /c start http://localhost:8080
# Windows 메모장으로 파일 편집
notepad.exe config.txt
이 설정이 없으면 /mnt/c/Windows/System32/notepad.exe처럼 전체 경로를 입력해야 합니다.
Docker 서비스 시작
# Docker 서비스 활성화 및 시작
sudo systemctl enable docker
sudo systemctl start docker
# 상태 확인
sudo systemctl status docker
사용자 권한 설정 (sudo 없이 사용)
# docker 그룹에 현재 사용자 추가
sudo usermod -aG docker $USER
# 변경사항 적용 (재로그인 또는)
newgrp docker
# 권한 확인
docker ps
newgrp docker 후에도 permission denied가 나오면, WSL을 완전히 종료했다가 다시 시작하세요:
wsl --shutdown
Docker 데몬 설정 (선택사항)
# /etc/docker/daemon.json 생성
sudo tee /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
# Docker 재시작
sudo systemctl restart docker
5단계: Docker Desktop에서 이관
이 섹션은 기존 Docker Desktop 사용자만 해당됩니다. 신규 설치라면 다음 “검증 및 테스트” 섹션으로 건너뛰세요.
이관 전 체크리스트
- 실행 중인 컨테이너 목록 확인
- 이미지 목록 확인
- 볼륨 데이터 백업
- docker-compose.yml 파일 백업
- 환경변수 및 설정 기록
Docker Desktop에서 이미지 백업
Docker Desktop이 실행 중인 환경에서:
# 이미지 목록 저장
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" > image_list.txt
# 개별 이미지 저장
docker save -o image_backup.tar <image_name>:<tag>
# 모든 이미지 한번에 저장 (시간 소요)
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" | \
xargs docker save -o all_images.tar
볼륨 데이터 백업
# 볼륨 목록 확인
docker volume ls
# 볼륨 데이터 백업 (각 볼륨별)
docker run --rm \
-v <volume_name>:/source:ro \
-v /mnt/c/docker_backup:/backup \
alpine tar cvf /backup/<volume_name>.tar -C /source .
WSL2 Docker Engine에서 복원
# 이미지 로드
docker load -i /mnt/c/docker_backup/image_backup.tar
# 또는 모든 이미지
docker load -i /mnt/c/docker_backup/all_images.tar
# 이미지 확인
docker images
볼륨 데이터 복원
# 볼륨 생성
docker volume create <volume_name>
# 데이터 복원
docker run --rm \
-v <volume_name>:/target \
-v /mnt/c/docker_backup:/backup:ro \
alpine sh -c "cd /target && tar xvf /backup/<volume_name>.tar"
# 확인
docker volume inspect <volume_name>
Docker Desktop 제거 (선택)
이관 완료 및 검증 후:
# Windows 설정 -> 앱 -> Docker Desktop 제거
# 또는
winget uninstall Docker.DockerDesktop
# 잔여 파일 정리 (선택)
Remove-Item -Recurse -Force "$env:APPDATA\Docker"
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\Docker"
6단계: 검증 및 테스트
기본 동작 테스트
# Docker 정보 확인
docker info
# 테스트 컨테이너 실행
docker run --rm hello-world
# 인터랙티브 테스트
docker run -it --rm alpine sh -c "echo 'Docker is working!'"
네트워크 테스트
# 포트 바인딩 테스트
docker run -d --name nginx-test -p 8080:80 nginx
# Windows 브라우저에서 http://localhost:8080 접속 확인
# 정리
docker rm -f nginx-test
볼륨 마운트 테스트
# Windows 경로 마운트 테스트
docker run --rm -v /mnt/c/Users:/host alpine ls /host
# Linux 경로 마운트 테스트
docker run --rm -v /tmp/test:/data alpine sh -c "echo 'test' > /data/test.txt && cat /data/test.txt"
Docker Compose 테스트
# 테스트용 compose 파일 생성
cat > /tmp/docker-compose-test.yml <<EOF
services:
web:
image: nginx:alpine
ports:
- "8080:80"
db:
image: alpine
command: sleep infinity
EOF
# 실행
docker compose -f /tmp/docker-compose-test.yml up -d
# 확인
docker compose -f /tmp/docker-compose-test.yml ps
# 정리
docker compose -f /tmp/docker-compose-test.yml down
자주 하는 실수 & 해결법
실수 1: Docker 서비스가 시작되지 않음
# 로그 확인
sudo journalctl -u docker.service -n 50
# containerd 상태 확인
sudo systemctl status containerd
# 수동 시작 시도
sudo dockerd --debug
실수 2: permission denied 오류
# docker 그룹 확인
groups $USER
# 그룹에 없으면 추가
sudo usermod -aG docker $USER
# 소켓 권한 확인
ls -la /var/run/docker.sock
# 임시 해결 (권장하지 않음)
sudo chmod 666 /var/run/docker.sock
실수 3: 네트워크 문제 (이미지 pull 실패)
# DNS 문제 시 daemon.json에 DNS 추가
sudo tee /etc/docker/daemon.json <<EOF
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
sudo systemctl restart docker
실수 4: WSL2 메모리 부족
PowerShell에서:
# 현재 메모리 사용량 확인
wsl -- free -h
# .wslconfig 수정 후
wsl --shutdown
실수 5: systemd가 동작하지 않음
# systemd가 PID 1인지 확인
ps -p 1 -o comm=
# 출력이 'init'이면 systemd가 아님
# /etc/wsl.conf 재설정 후 WSL 재시작
유용한 명령어 모음
Docker 명령어
# 컨테이너 관리
docker ps -a # 모든 컨테이너 목록
docker logs -f <container> # 로그 실시간 확인
docker exec -it <container> sh # 컨테이너 접속
docker stats # 리소스 사용량 모니터링
# 이미지 관리
docker images # 이미지 목록
docker image prune -a # 미사용 이미지 삭제
docker system df # 디스크 사용량 확인
# 정리
docker system prune -a # 미사용 리소스 전체 정리
WSL2 명령어 (PowerShell)
wsl -l -v # 배포판 목록 및 버전
wsl --shutdown # WSL 종료
wsl -d Ubuntu-24.04 # 특정 배포판 시작
wsl --export Ubuntu-24.04 backup.tar # 백업
wsl --import Ubuntu-restore C:\WSL backup.tar # 복원
추천 bash alias
# ~/.bashrc에 추가
cat >> ~/.bashrc <<'EOF'
# Docker aliases
alias d='docker'
alias dc='docker compose'
alias dps='docker ps'
alias dpsa='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dlog='docker logs -f'
alias dprune='docker system prune -af'
EOF
source ~/.bashrc
빠른 설치 스크립트 (원클릭)
아래 스크립트를 저장하여 한번에 설치:
#!/bin/bash
# install_docker_wsl2.sh
set -e
echo "=== Docker Engine 설치 시작 ==="
# 기존 패키지 제거
sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
# 필수 패키지 설치
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# Docker GPG 키 추가
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 저장소 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# 사용자 권한 설정
sudo usermod -aG docker $USER
# systemd 설정
sudo tee /etc/wsl.conf <<EOF
[boot]
systemd=true
EOF
echo "=== 설치 완료 ==="
echo "WSL을 재시작하세요: wsl --shutdown (PowerShell에서)"
echo "재시작 후: sudo systemctl enable --now docker"
다음 단계
설치 완료! 이제 무엇을 할 수 있나요?
- Docker Compose로 개발 환경 구성 - 여러 서비스를 한번에 실행
- Dockerfile 작성법 학습 - 커스텀 이미지 빌드
- Docker 네트워크 이해 - 컨테이너 간 통신
- 볼륨 마운트 활용 - 데이터 영속성 확보
참고 자료
문서 작성일: 2025-01-28 대상 환경: Windows 11 + WSL2 + Ubuntu 24.04 + Docker Engine