#!/usr/bin/env bash # 호스트에 Docker Engine + NVIDIA Container Toolkit 설치. # sudo 비밀번호를 물어보므로 반드시 사용자가 직접 실행해야 합니다. # Claude Code 프롬프트에서: ! bash scripts/host_install_docker.sh set -euo pipefail say() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; } ok() { printf '\033[1;32m ✔ %s\033[0m\n' "$*"; } warn() { printf '\033[1;33m ! %s\033[0m\n' "$*"; } die() { printf '\033[1;31m ✘ %s\033[0m\n' "$*" >&2; exit 1; } [[ $EUID -eq 0 ]] && die "root로 직접 실행하지 마세요. 일반 사용자로 실행하면 sudo를 알아서 씁니다." . /etc/os-release say "호스트: $PRETTY_NAME ($VERSION_CODENAME / $(dpkg --print-architecture))" [[ "$ID" == "ubuntu" ]] || warn "Ubuntu가 아닙니다 — 이 스크립트는 Ubuntu 기준입니다." command -v nvidia-smi >/dev/null || die "nvidia-smi 가 없습니다. NVIDIA 드라이버부터 설치하세요." ok "$(nvidia-smi --query-gpu=name,driver_version --format=csv,noheader | head -1)" say "sudo 권한 확인 (비밀번호를 물어볼 수 있습니다)" sudo -v || die "sudo 실패" # 설치가 길어지는 동안 sudo 타임아웃 방지 while true; do sudo -n true; sleep 50; kill -0 "$$" 2>/dev/null || exit; done 2>/dev/null & SUDO_KEEPALIVE=$! trap 'kill $SUDO_KEEPALIVE 2>/dev/null || true' EXIT # ---------------------------------------------------------------- 1. Docker if command -v docker >/dev/null && docker --version >/dev/null 2>&1; then ok "Docker 이미 설치됨: $(docker --version)" else say "1/3 Docker Engine 설치" for p in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y "$p" >/dev/null 2>&1 || true done sudo apt-get update -qq sudo apt-get install -y -qq ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor --yes -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 $VERSION_CODENAME stable" \ | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update -qq sudo apt-get install -y docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin ok "설치됨: $(docker --version)" fi say "Docker 동작 확인 (hello-world)" sudo docker run --rm hello-world >/dev/null && ok "Docker 런타임 정상" # ------------------------------------------------- 2. NVIDIA Container Toolkit if command -v nvidia-ctk >/dev/null; then ok "nvidia-container-toolkit 이미 설치됨: $(nvidia-ctk --version | head -1)" else say "2/3 NVIDIA Container Toolkit 설치" curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | sudo gpg --dearmor --yes -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \ | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null sudo apt-get update -qq sudo apt-get install -y nvidia-container-toolkit fi say "docker 데몬에 nvidia 런타임 등록" sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker sleep 3 say "GPU 패스스루 확인" sudo docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi \ | sed -n '1,12p' && ok "컨테이너에서 GPU 보임" # --------------------------------------------------------- 3. docker 그룹 say "3/3 $USER 를 docker 그룹에 추가" if id -nG "$USER" | tr ' ' '\n' | grep -qx docker; then ok "이미 docker 그룹 소속" else sudo usermod -aG docker "$USER" warn "그룹 변경은 '재로그인' 후에 적용됩니다." warn "그때까지 이 프로젝트 스크립트들은 자동으로 'sudo docker' 로 폴백합니다." fi say "완료" cat <<'MSG' 다음 단계: bash scripts/build.sh # 개발 이미지 빌드 bash scripts/run.sh # 컨테이너 기동 bash scripts/shell.sh # 셸 진입 MSG