개요
Adminer는 단일 PHP 파일로 구성된 경량 데이터베이스 관리 도구입니다. phpMyAdmin의 대안으로 개발되었으며, MySQL뿐만 아니라 PostgreSQL, SQLite, MS SQL, Oracle, MongoDB 등 다양한 데이터베이스를 지원합니다. 파일 하나로 모든 것이 해결되는 심플함이 가장 큰 장점입니다.
| 항목 | 내용 |
|---|---|
| GitHub | https://github.com/vrana/adminer |
| 공식 사이트 | https://www.adminer.org |
| Docker Hub | https://hub.docker.com/_/adminer |
| 라이선스 | Apache-2.0 / GPL-2.0 |
| 개발 언어 | PHP |
| 파일 크기 | ~500KB (단일 파일) |
Adminer란?
Adminer(구 phpMinAdmin)는 2007년 Jakub Vrána가 phpMyAdmin의 대안으로 개발한 데이터베이스 관리 도구입니다. 핵심 철학은 “하나의 파일로 모든 것을 해결”하는 것입니다. 복잡한 설치 과정 없이 PHP 파일 하나만 서버에 올리면 바로 사용할 수 있습니다.
핵심 철학
"단일 파일, 다중 데이터베이스"
- 설치가 필요 없음 (파일 하나)
- 다양한 DB 지원
- 보안 우선 설계
- 성능 최적화
개발 우선순위
- 보안 – 최우선 고려사항
- 사용자 경험 – 직관적인 UI
- 성능 – 빠른 응답
- 기능 – 필요한 기능만
주요 기능
지원 데이터베이스
| 데이터베이스 | 기본 지원 | 플러그인 |
|---|---|---|
| MySQL | ✅ | – |
| MariaDB | ✅ | – |
| PostgreSQL | ✅ | – |
| SQLite | ✅ | – |
| MS SQL | ✅ | – |
| Oracle | ✅ | – |
| CockroachDB | ✅ | – |
| MongoDB | – | ✅ |
| Elasticsearch | – | ✅ |
| Firebird | – | ✅ |
| ClickHouse | – | ✅ |
| SimpleDB | – | ✅ |
데이터베이스 관리
| 기능 | 설명 |
|---|---|
| DB 생성/삭제 | 데이터베이스 관리 |
| 테이블 관리 | 생성, 수정, 삭제, 복사 |
| 컬럼 편집 | 필드 추가/수정/삭제 |
| 인덱스 | 인덱스 관리 |
| 외래키 | 관계 설정 |
| 트리거 | 트리거 관리 |
| 뷰 | 뷰 생성/편집 |
| 프로시저 | 저장 프로시저 |
데이터 조작
| 기능 | 설명 |
|---|---|
| 데이터 조회 | 페이지네이션 지원 |
| 인라인 편집 | 직접 수정 |
| 검색 | 조건 검색 |
| 정렬 | 컬럼별 정렬 |
| SQL 실행 | 직접 쿼리 실행 |
가져오기/내보내기
| 기능 | 설명 |
|---|---|
| 내보내기 | SQL, CSV, TSV, XML |
| 가져오기 | SQL, CSV, TSV |
| 압축 | gzip, bzip2 지원 |
phpMyAdmin vs Adminer
| 기능 | Adminer | phpMyAdmin |
|---|---|---|
| 파일 수 | 1개 | 수백 개 |
| 파일 크기 | ~500KB | ~13MB |
| 지원 DB | 다중 (7+) | MySQL만 |
| 보안 등급 | 높음 | 중간 |
| 로딩 속도 | 빠름 | 중간 |
| 기능 수 | 핵심 기능 | 매우 풍부 |
| 커스터마이징 | 플러그인/테마 | 매우 풍부 |
| 비밀번호 없는 연결 | 차단 | 허용 |
| 브루트포스 방지 | 기본 탑재 | 없음 |
선택 가이드
| 상황 | 추천 |
|---|---|
| 다중 DB 타입 사용 | Adminer |
| 가벼운 도구 필요 | Adminer |
| 보안 중시 | Adminer |
| MySQL 전용 풍부한 기능 | phpMyAdmin |
| 호스팅 환경 (기본 제공) | phpMyAdmin |
시스템 요구 사항
최소 사양
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 1 Core | 1 Core |
| RAM | 64MB | 128MB |
| 저장소 | 10MB | 50MB |
| PHP | 5.6+ | 8.0+ |
Adminer는 매우 가볍습니다. Raspberry Pi에서도 원활하게 실행됩니다.
Docker 설치
방법 1: 기본 설치
# docker-compose.yml
services:
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
방법 2: MySQL과 함께
# docker-compose.yml
services:
db:
image: mysql:8
container_name: mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=myapp
- MYSQL_USER=myuser
- MYSQL_PASSWORD=mypassword
volumes:
- mysql_data:/var/lib/mysql
networks:
- db_network
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
environment:
- ADMINER_DEFAULT_SERVER=db
depends_on:
- db
networks:
- db_network
volumes:
mysql_data:
networks:
db_network:
방법 3: PostgreSQL과 함께
# docker-compose.yml
services:
db:
image: postgres:16-alpine
container_name: postgres
restart: unless-stopped
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=adminpassword
- POSTGRES_DB=myapp
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- db_network
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
environment:
- ADMINER_DEFAULT_SERVER=db
depends_on:
- db
networks:
- db_network
volumes:
postgres_data:
networks:
db_network:
방법 4: 다중 데이터베이스 환경
# docker-compose.yml
services:
mysql:
image: mysql:8
container_name: mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=mysqlpass
volumes:
- mysql_data:/var/lib/mysql
networks:
- db_network
postgres:
image: postgres:16-alpine
container_name: postgres
restart: unless-stopped
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=postgrespass
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- db_network
mongo:
image: mongo:7
container_name: mongo
restart: unless-stopped
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=mongopass
volumes:
- mongo_data:/data/db
networks:
- db_network
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
networks:
- db_network
volumes:
mysql_data:
postgres_data:
mongo_data:
networks:
db_network:
방법 5: 테마 적용
# docker-compose.yml
services:
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
environment:
- ADMINER_DESIGN=dracula
# 사용 가능한 테마: dracula, galkaev, hydra, nette, pappu687, pepa-linha, rmsoft 등
방법 6: Traefik 연동
# docker-compose.yml
services:
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
environment:
- ADMINER_DESIGN=dracula
networks:
- db_network
- traefik_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.adminer.rule=Host(`adminer.example.com`)"
- "traefik.http.routers.adminer.entrypoints=websecure"
- "traefik.http.routers.adminer.tls.certresolver=letsencrypt"
- "traefik.http.services.adminer.loadbalancer.server.port=8080"
networks:
db_network:
traefik_network:
external: true
환경 변수
| 변수 | 설명 | 예시 |
|---|---|---|
ADMINER_DEFAULT_SERVER | 기본 서버 주소 | mysql, postgres |
ADMINER_DESIGN | 테마 이름 | dracula, nette |
ADMINER_PLUGINS | 활성화할 플러그인 | tables-filter tinymce |
MEMORY | PHP 메모리 제한 | 512M |
UPLOAD | 업로드 제한 | 2048M |
Docker 이미지 변형
| 태그 | 설명 |
|---|---|
adminer:latest | Apache 기반 (권장) |
adminer:fastcgi | FastCGI (별도 웹서버 필요) |
adminer:standalone | 독립 실행형 |
경량 이미지 (dockette)
더 작은 이미지가 필요하면 dockette 이미지를 사용합니다:
services:
adminer:
image: dockette/adminer:full
# 또는 dockette/adminer:mysql (MySQL 전용)
# 또는 dockette/adminer:pgsql (PostgreSQL 전용)
ports:
- "8080:80"
초기 설정
1) 접속
URL: http://localhost:8080
2) 로그인
| 필드 | 설명 |
|---|---|
| 시스템 | MySQL, PostgreSQL, SQLite 등 선택 |
| 서버 | DB 서버 주소 (Docker: 컨테이너명) |
| 사용자명 | DB 사용자 |
| 비밀번호 | DB 비밀번호 |
| 데이터베이스 | 연결할 DB (선택) |
예시 (MySQL):
- 시스템: MySQL
- 서버: mysql (또는 db)
- 사용자명: root
- 비밀번호: rootpassword
예시 (PostgreSQL):
- 시스템: PostgreSQL
- 서버: postgres
- 사용자명: admin
- 비밀번호: adminpassword
플러그인
Adminer는 플러그인으로 기능을 확장할 수 있습니다.
사용 가능한 플러그인
| 플러그인 | 설명 |
|---|---|
tables-filter | 테이블 필터링 |
tinymce | WYSIWYG 에디터 |
edit-calendar | 날짜 선택기 |
edit-textarea | 텍스트 영역 편집 |
enum-option | ENUM 옵션 |
foreign-system | 외래키 시스템 |
login-password-less | 비밀번호 없이 로그인 (개발용) |
master-slave | 마스터-슬레이브 |
slug | 슬러그 생성 |
version-noverify | 버전 확인 비활성화 |
플러그인 활성화
environment:
- ADMINER_PLUGINS=tables-filter tinymce edit-calendar
테마
기본 제공 테마
| 테마 | 스타일 |
|---|---|
default | 기본 |
dracula | 다크 |
galkaev | 모던 |
hydra | 블루 |
nette | 네테 프레임워크 |
pappu687 | 그린 |
pepa-linha | 라이트 |
rmsoft | 프로페셔널 |
커스텀 테마
커스텀 테마를 사용하려면:
services:
adminer:
image: adminer:latest
volumes:
- ./adminer.css:/var/www/html/adminer.css
보안
기본 보안 기능
- 비밀번호 없는 연결 차단 – 빈 비밀번호 로그인 불가
- 브루트포스 방지 – 로그인 시도 제한
- CSRF 보호 – 크로스사이트 요청 위조 방지
추가 보안 조치
IP 제한 (Traefik):
labels:
- "traefik.http.middlewares.adminer-whitelist.ipwhitelist.sourcerange=192.168.1.0/24"
- "traefik.http.routers.adminer.middlewares=adminer-whitelist"
Basic Auth:
labels:
- "traefik.http.middlewares.adminer-auth.basicauth.users=admin:$$apr1$$..."
- "traefik.http.routers.adminer.middlewares=adminer-auth"
로컬 전용 접근:
ports:
- "127.0.0.1:8080:8080"
트러블슈팅
일반적인 문제
“Login required” 오류:
Adminer는 보안상 비밀번호 없는 로그인을 차단합니다. 데이터베이스에 비밀번호가 설정되어 있는지 확인하세요.
MongoDB 연결 안 됨:
기본 Docker 이미지에서는 MongoDB 드라이버가 없습니다. MongoDB를 사용하려면:
# Dockerfile
FROM adminer:latest
RUN apk add --no-cache php-mongodb
업로드 크기 제한:
environment:
- UPLOAD=100M
- MEMORY=512M
로그 확인
docker logs adminer -f
업데이트
# 최신 이미지
docker compose pull adminer
# 재시작
docker compose up -d adminer
사용 사례
1. 개발 환경
- 빠른 DB 확인/수정
- 다중 DB 타입 프로젝트
- 가벼운 도구 필요
2. 디버깅
- 쿼리 테스트
- 데이터 확인
- 스키마 검토
3. 소규모 운영
- 간단한 DB 관리
- 백업/복원
- 사용자 관리
마무리
Adminer는 “적을수록 많다”는 철학을 완벽하게 구현한 DB 관리 도구입니다. 단일 PHP 파일로 MySQL, PostgreSQL, SQLite, MongoDB 등 다양한 데이터베이스를 관리할 수 있습니다. 보안을 최우선으로 설계되어 phpMyAdmin보다 안전하고, 가볍고 빠릅니다.
핵심 장점
| 장점 | 설명 |
|---|---|
| 초경량 | 단일 파일 ~500KB |
| 다중 DB | 7개 이상 DB 지원 |
| 보안 | 기본 보안 기능 탑재 |
| 빠름 | phpMyAdmin보다 빠른 로딩 |
| 심플 | 설치 불필요, 파일 하나 |
이런 분께 추천
다양한 DB 타입을 사용하는 분
가벼운 도구를 원하는 분
보안을 중시하는 분
빠른 설치/제거가 필요한 분
개발 환경 관리가 필요한 분