개발자가 즉시 사용할 수 있는 수준으로 구성한 개발 컨테이너입니다.
1.9K
Ubuntu 24.04 기반 풀스택 개발환경 — 한글 완벽 지원 · AI 코딩 에이전트 내장 · Docker Scout A등급
ubuntu:24.04의 최소 이미지를 개발자가 즉시 사용할 수 있는 수준으로 구성한 올인원 개발 컨테이너입니다.
한글 로케일, 타임존, 개발 도구, 런타임, 웹 서버, AI 코딩 에이전트까지 설정이 완료되어 있어서 빌드 후 바로 개발을 시작할 수 있습니다.
🛡 Docker Scout Health Score A — Critical 0 · High 0 · 전체 정책 Compliant
🤖 AI 코딩 에이전트 — Claude Code · OpenAI Codex · Google Gemini CLI · CodeCompanion (Neovim 통합)
| 카테고리 | 포함 내용 |
|---|---|
| 🇰🇷 한글 | ko_KR.UTF-8 로케일, Nanum/Noto CJK 폰트, KST 타임존 |
| 🐚 셸 | Zsh + Oh My Zsh + autosuggestions + syntax-highlighting |
| ☕ Java | OpenJDK 21 |
| 🟢 Node.js | v22 LTS (nvm), npm, pnpm, yarn |
| 🐍 Python | 3.12 + pip + venv + pipx + httpie (PEP 668 대응) |
| 🐹 Go | 1.25.8 (fzf · git-lfs 소스 빌드 겸용) |
| 🌐 Nginx | charset utf-8 설정 완료, 한글 에러 페이지 |
| 🤖 AI 에이전트 | Claude Code, OpenAI Codex, Google Gemini CLI + Neovim CodeCompanion |
| ✏️ Neovim | Tier 3 Full — Mason LSP 12개 + blink.cmp + conform + trouble + AI 4종 |
| 🔧 도구 | git, git-lfs, lazygit, vim, nano, curl, httpie, jq, ripgrep, fd, bat, fzf |
| 🗄 DB 클라이언트 | mysql-client, redis-tools, postgresql-client |
| 👤 사용자 | 비-root dev 사용자 (UID 1000), sudo 지원 |
| 🛡 보안 | Docker Scout A등급 — 취약 패키지 교체 · Go 소스 빌드 · 의존성 패치 · linux-libc-dev 제거 |
docker run -it --name dev-box \
-p 80:80 \
-v $(pwd)/workspace:/home/dev/workspace \
-e ANTHROPIC_API_KEY=sk-ant-... \
-e OPENAI_API_KEY=sk-... \
-e GEMINI_API_KEY=... \
mpdba/ubuntu-dev:latest
docker run -it --name dev-box `
-p 80:80 `
-v ${PWD}/workspace:/home/dev/workspace `
-e ANTHROPIC_API_KEY=sk-ant-... `
-e OPENAI_API_KEY=sk-... `
-e GEMINI_API_KEY=... `
mpdba/ubuntu-dev:latest
echo "한글 테스트" # → 정상 출력
java --version # → openjdk 21.x.x
node --version # → v22.x.x
python --version # → Python 3.12.x
go version # → go1.25.8 linux/amd64
nginx -v # → nginx/1.24.x
fzf --version # → 0.70.0
git lfs version # → git-lfs/3.7.1
lazygit --version # → 0.61.0
claude --version # → Claude Code CLI
codex --version # → OpenAI Codex CLI
gemini --version # → Google Gemini CLI
| 태그 | 설명 |
|---|---|
latest | 최신 안정 버전 |
v4.5 | 현재 릴리스 — Neovim Tier 3 + AI 에이전트 + Docker Scout A등급 |
1.2.1 | 보안 패치 완료 (Critical 0, High 0) — AI 에이전트 미포함 |
| 에이전트 | 명령 | 설명 |
|---|---|---|
| Claude Code | claude | Anthropic의 터미널 AI 코딩 에이전트 |
| OpenAI Codex | codex | OpenAI의 터미널 AI 코딩 에이전트 |
| Google Gemini | gemini | Google의 터미널 AI 에이전트 |
| 플러그인 | 단축키 | 설명 |
|---|---|---|
| claudecode.nvim | Space+ac | Neovim 안에서 Claude Code 토글 |
| codex.nvim | Space+cx | Neovim 안에서 Codex 토글 |
| gemini.nvim | — | 코드 완성 + 인라인 지시 |
| CodeCompanion | Space+ai | 멀티 AI 통합 채팅 (Anthropic/OpenAI/Gemini 선택) |
# 환경변수로 전달 (docker run -e)
export ANTHROPIC_API_KEY=sk-ant-... # Claude Code + CodeCompanion
export OPENAI_API_KEY=sk-... # Codex + CodeCompanion
export GEMINI_API_KEY=... # Gemini CLI + CodeCompanion
AI 에이전트가 외부에서 파일을 수정하면 Neovim이 자동으로 감지하여 버퍼를 갱신합니다. 별도 설정 불필요.
Docker Scout 보안 스캔에서 최고 등급을 달성했습니다.
| 등급 | Critical | High | Medium | Low |
|---|---|---|---|---|
| A | 0 | 0 | ~693 | ~42 |
| 정책 | 상태 |
|---|---|
| No high-profile vulnerabilities | ✅ Compliant |
| No fixable critical or high vulnerabilities | ✅ Compliant |
| No unapproved base images | ✅ Compliant |
| Supply chain attestations | ✅ Compliant |
| No outdated base images | ✅ Compliant |
| No AGPL v3 licenses | ✅ Compliant |
| Default non-root user | ✅ Compliant |
| 패치 | 방법 |
|---|---|
| Python 취약 패키지 교체 | pip --ignore-installed + dpkg status 정리 |
| fzf 소스 빌드 (Go 1.25.8) | apt 대신 go install로 최신 Go 빌드 |
| git-lfs 소스 빌드 + x/crypto 강제 업그레이드 | 소스 클론 → go get x/[email protected] → go build |
| lazygit 바이너리 설치 | 소스 빌드 시 jsonparser CVE 노출 방지 |
| picomatch 중첩 의존성 패치 | 글로벌 4.0.4 설치 + pnpm 내부 번들 덮어쓰기 |
| linux-libc-dev 제거 | 빌드 후 dpkg -r — 불필요한 커널 헤더 CVE 제거 |
Neovim stable이 tarball로 설치되어 있고, Tier 3 Full 설정이 적용되어 있습니다. LSP 서버와 플러그인은 이미지 빌드 시 사전 설치됩니다.
nvim # 즉시 사용 가능
:Lazy update # 플러그인 업데이트
:Mason # LSP 서버 관리
| Tier | 포함 내용 |
|---|---|
| Tier 1 | 테마 + Treesitter + Telescope + 기본 UI (gitsigns, autopairs, comment, which-key) |
| Tier 2 | Tier 1 + Mason LSP + blink.cmp 자동완성 + conform 포매터 + trouble 진단 |
| Tier 3 | Tier 2 + AI 에이전트 4종 + LazyGit + Diffview |
| 서버 | 언어 |
|---|---|
| jdtls | Java |
| ts_ls | TypeScript / JavaScript |
| pyright | Python |
| gopls | Go |
| lua_ls | Lua |
| html, cssls, jsonls, yamlls | 웹 |
| dockerls, docker_compose_language_service | Docker |
| bashls | Bash |
| sqlls | SQL |
LSP, 경로, 스니펫, 버퍼 4가지 소스에서 자동완성을 제공합니다. LuaSnip + friendly-snippets가 포함되어 있습니다.
저장 시 자동 포맷이 적용됩니다.
| 언어 | 포매터 |
|---|---|
| JavaScript / TypeScript / JSON / YAML / HTML / CSS / Markdown | prettierd |
| Java | google-java-format |
| Python | black |
| Go | gofmt |
| Lua | stylua |
| 도구 | 사용법 |
|---|---|
| LazyGit | Space+gg 또는 터미널에서 lazygit |
| Diffview | :DiffviewOpen (diff 보기), :DiffviewFileHistory (파일 히스토리) |
| Gitsigns | 변경 라인 자동 표시 |
| 키 | 동작 |
|---|---|
Space+ff | 파일 검색 |
Space+fg | 텍스트 검색 (live grep) |
Space+fb | 버퍼 목록 |
Space+fh | 도움말 검색 |
Space+e | 파일 트리 토글 |
Space+gg | LazyGit 열기 |
Space+ac | Claude Code 토글 |
Space+cx | Codex 토글 |
Space+ai | CodeCompanion AI 채팅 |
Space+aa | AI 액션 목록 |
Space+xx | 진단 목록 |
Space+xd | 버퍼 진단 |
Space+w | 저장 |
Space+q | 종료 |
Space+rn | LSP 이름 변경 |
Space+ca | 코드 액션 |
Space+lf | 코드 포맷 |
gd | 정의로 이동 |
K | 호버 정보 |
C-space | Treesitter 증분 선택 |
ca-certificates, gnupg, sudo, locales, tzdata, zip/unzip, tar, gzip, bzip2, xz-utils, file, less, tree, procps, htop
fonts-nanum, fonts-nanum-coding, fonts-noto-cjk
nano, neovim (stable tarball + Tier 3 init.lua + lazy.nvim + 20+ 플러그인)
git, git-lfs (Go 소스 빌드, x/crypto 패치), lazygit 0.61.0, build-essential, cmake, pkg-config
ripgrep (rg), fd-find (fdfind), bat (batcat), fzf (Go 소스 빌드), jq
curl, wget, httpie (pip), dnsutils, iputils-ping, net-tools, iproute2, traceroute, openssh-client, rsync
mysql-client, redis-tools, postgresql-client
nginx (charset utf-8 사전 설정)
| 에이전트 | 패키지 | 설치 방법 |
|---|---|---|
| Claude Code | @anthropic-ai/claude-code | npm global |
| OpenAI Codex | @openai/codex | npm global |
| Google Gemini | @google/gemini-cli | npm global |
| 런타임 | 버전 | 비고 |
|---|---|---|
| Java | OpenJDK 21 | JAVA_HOME 설정됨 |
| Go | 1.25.8 | GOROOT=/usr/local/go, GOPATH=$HOME/go |
| Node.js | 22 LTS | nvm으로 관리, ENV PATH에 등록 |
| npm | 10.x | Node.js와 함께 설치 |
| pnpm | latest | 글로벌 설치 |
| yarn | 1.x | 글로벌 설치 |
| Python | 3.12 | 시스템 패키지, PEP 668 적용 |
| pip | 24.x | venv 안에서 사용 권장 |
| pipx | 1.x | CLI 도구 격리 설치용 |
| 항목 | 상세 |
|---|---|
| 기본 셸 | Zsh |
| 프레임워크 | Oh My Zsh |
| 플러그인 | git, zsh-autosuggestions, zsh-syntax-highlighting, docker, docker-compose |
| Alias | 40+ 개발 편의 alias (git, docker, nginx, 모던 CLI 등) |
| 변수 | 기본값 | 설명 |
|---|---|---|
LANG | ko_KR.UTF-8 | 시스템 로케일 |
LC_ALL | ko_KR.UTF-8 | 로케일 강제 |
TZ | Asia/Seoul | 타임존 (KST) |
JAVA_HOME | /usr/lib/jvm/java-21-openjdk-amd64 | Java 홈 |
GOROOT | /usr/local/go | Go 설치 경로 |
GOPATH | /home/dev/go | Go 모듈/바이너리 경로 |
NVM_DIR | /home/dev/.nvm | nvm 설치 경로 |
ANTHROPIC_API_KEY | (사용자 설정) | Claude Code + CodeCompanion |
OPENAI_API_KEY | (사용자 설정) | Codex + CodeCompanion |
GEMINI_API_KEY | (사용자 설정) | Gemini CLI + CodeCompanion |
| 인자 | 기본값 | 설명 |
|---|---|---|
USERNAME | dev | 컨테이너 사용자명 |
USER_UID | 1000 | 사용자 UID |
USER_GID | 1000 | 사용자 GID |
NODE_VERSION | 22 | Node.js 메이저 버전 |
GO_VERSION | 1.25.8 | Go 버전 |
GIT_LFS_VERSION | 3.7.1 | git-lfs 버전 |
FZF_VERSION | 0.70.0 | fzf 버전 |
LAZYGIT_VERSION | 0.61.0 | lazygit 버전 |
# 보안 스캔 포함 빌드
docker buildx build --provenance=true --sbom=true \
-t ubuntu-dev:latest .
# Linux: 호스트 UID/GID와 맞추기
docker build \
--build-arg USER_UID=$(id -u) \
--build-arg USER_GID=$(id -g) \
-t ubuntu-dev:latest .
| 포트 | 서비스 | 비고 |
|---|---|---|
80 | Nginx | charset utf-8 설정 완료 |
8080 | Spring Boot | 리버스 프록시 템플릿 포함 (주석) |
3000 | Node.js | 리버스 프록시 템플릿 포함 (주석) |
| 컨테이너 경로 | 용도 |
|---|---|
/home/dev/workspace | 개발 프로젝트 디렉토리 (Nginx 루트) |
/home/dev/.gitconfig | Git 설정 공유 (읽기 전용 권장) |
/etc/nginx/sites-available/default | Nginx 설정 오버라이드 (선택) |
services:
dev:
image: mpdba/ubuntu-dev:latest
container_name: ubuntu-dev
stdin_open: true
tty: true
ports:
- "80:80"
- "8080:8080"
- "3000:3000"
volumes:
- ./workspace:/home/dev/workspace
- ~/.gitconfig:/home/dev/.gitconfig:ro
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- GEMINI_API_KEY=${GEMINI_API_KEY}
networks:
- dev-net
mysql:
image: mysql:8.0
container_name: dev-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: devdb
MYSQL_USER: dev
MYSQL_PASSWORD: devpass
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- dev-net
redis:
image: redis:7-alpine
container_name: dev-redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- dev-net
volumes:
mysql-data:
redis-data:
networks:
dev-net:
driver: bridge
컨테이너 내에서 Nginx를 시작하면 /home/dev/workspace의 파일을 즉시 서빙한다.
charset utf-8이 사전 설정되어 한글 HTML, JSON 응답이 깨지지 않는다.
ngstart # sudo nginx
ngstop # sudo nginx -s stop
ngreload # sudo nginx -s reload
ngtest # sudo nginx -t
Go 1.25.8이 /usr/local/go에 설치되어 있으며, GOPATH=$HOME/go가 설정되어 있다.
go version # → go1.25.8 linux/amd64
go run main.go # 즉시 실행
go install ... # ~/go/bin에 설치 (PATH에 포함)
# 가상환경 사용 (권장)
python3 -m venv .venv && source .venv/bin/activate
pip install flask
# CLI 도구 설치 (pipx)
pipx install black && pipx install poetry
# httpie는 이미 설치됨
http GET https://httpbin.org/get
| Alias | 명령 |
|---|---|
ll | ls -alFh --color=auto |
.. | cd .. |
... | cd ../.. |
cls | clear |
| Alias | 명령 |
|---|---|
gs | git status |
gl | git log --oneline --graph --decorate -15 |
gd | git diff |
ga | git add |
gc | git commit |
gp | git push |
| Alias | 명령 |
|---|---|
dps | docker ps --format "table ..." |
dlog | docker logs -f |
dexec | docker exec -it |
| Alias | 명령 |
|---|---|
ngstart | sudo nginx |
ngstop | sudo nginx -s stop |
ngreload | sudo nginx -s reload |
ngtest | sudo nginx -t |
nglog | tail -f /var/log/nginx/access.log |
ngerr | tail -f /var/log/nginx/error.log |
| Alias | 대상 |
|---|---|
fd | fdfind |
bat | batcat |
| Alias | 명령 |
|---|---|
ports | ss -tulnp |
myip | curl -s ifconfig.me |
path | echo $PATH | tr ":" "\n" |
now | date +"%Y-%m-%d %H:%M:%S %Z" |
/home/dev/ ← 사용자 홈
├── .oh-my-zsh/ ← Oh My Zsh + 플러그인
├── .zshrc ← Zsh 설정 (alias, fzf, nvm, Go)
├── .vimrc ← Vim 설정 (UTF-8, 줄번호)
├── .config/nvim/
│ └── init.lua ← Neovim Tier 3 설정 (20+ 플러그인)
├── .local/share/nvim/
│ ├── lazy/ ← lazy.nvim 플러그인 저장소
│ └── mason/ ← Mason LSP 서버 (12개 사전 설치)
├── .nvm/ ← nvm + Node.js + AI CLI 에이전트
├── go/ ← GOPATH
├── .gitconfig ← Git 설정
└── workspace/ ← 개발 프로젝트 (= Nginx 루트)
/usr/local/go/ ← Go 1.25.8 (GOROOT)
/usr/local/bin/
├── fzf ← Go 1.25.8 소스 빌드
├── git-lfs ← Go 1.25.8 소스 빌드 (x/crypto 패치)
├── lazygit ← 바이너리 릴리스 (0.61.0)
└── nvim ← Neovim stable symlink
/opt/nvim/ ← Neovim 바이너리 (tarball)
└── bin/nvim
| 항목 | Linux / macOS / WSL2 | Windows PowerShell |
|---|---|---|
| 줄 이음 문자 | \ | ` (백틱) |
| 현재 경로 | $(pwd) | ${PWD} |
| 홈 디렉토리 | ~ | $env:USERPROFILE |
| UID/GID 전달 | --build-arg USER_UID=$(id -u) | 불필요 (Docker Desktop 자동 처리) |
MIT License
Content type
Image
Digest
sha256:9cc69f089…
Size
1.2 GB
Last updated
6 months ago
docker pull mpdba/ubuntu-dev:1.5.0