VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
빠른 시작
환경 변수
MYSQL_USER와 MYSQL_PASSWORD는 함께 설정해야 합니다. 만들어진 사용자는 MYSQL_DATABASE에 대한 전체 접근 권한을 받습니다.
볼륨으로 데이터 유지하기
볼륨이 없으면 컨테이너를 제거할 때 모든 데이터가 사라집니다. 데이터 디렉터리를 유지하려면 볼륨을 마운트하세요:mysql-data)은 컨테이너 재시작과 제거에 걸쳐 유지됩니다. 대신 호스트 디렉터리를 사용하려면:
이미지와 볼륨 전략 선택하기
대부분의 워크로드에서 명명된 볼륨이 올바른 기본값입니다. 바인드 마운트는 호스트에서 데이터 디렉터리를 직접 검사하거나 편집해야 할 때 유용하지만, macOS와 Windows에서는 성능 비용이 중요합니다.
Docker Compose
여러 서비스가 있는 개발 환경에서는 Docker Compose가 표준 접근법입니다:depends_on: condition: service_healthy와 함께 쓰는 healthcheck는 MySQL이 단지 시작된 것이 아니라 연결을 받아들일 준비가 될 때까지 애플리케이션 컨테이너가 시작되지 않게 보장합니다.
사용자 정의 구성
사용자 정의my.cnf를 마운트해서 전달하세요:
초기화 스크립트
컨테이너는 첫 시작 시(데이터 디렉터리가 비어 있을 때)/docker-entrypoint-initdb.d/에 놓인 모든 .sql 또는 .sh 파일을 실행합니다:
애플리케이션에서 연결하기
Docker Compose 네트워크 안에서 컨테이너는 서비스 이름으로 MySQL에 연결합니다:127.0.0.1로 연결하세요(localhost가 아닙니다 — MySQL의 소켓은 호스트에서 사용할 수 없습니다):
Docker에서 MySQL을 실행해야 할 때
프로덕션 고려 사항
몇 가지 주의 사항만 지키면 Docker는 프로덕션의 MySQL에 잘 동작합니다:- 데이터 지속성: 명명된 볼륨이나 바인드 마운트를 사용하세요. MySQL 데이터를 컨테이너 계층에 두지 마세요.
- 메모리 제한: MySQL이 호스트 메모리를 소진하지 않도록 Docker에서
--memory를 설정하고, 그에 맞게innodb_buffer_pool_size를 조정하세요. - 백업:
mysqldump는 컨테이너 안에서 동작합니다:docker exec mysql-dev mysqldump -u root -p myapp > backup.sql - 로깅: Docker에서 MySQL 로그는 stdout/stderr로 갑니다.
docker logs mysql-dev를 사용하거나 로깅 드라이버를 구성하세요. - 업그레이드: 새 이미지 태그를 pull하고, 옛 컨테이너를 중지하고, 같은 볼륨으로 새 컨테이너를 시작하세요. MySQL의 업그레이드 프로세스는 더 새로운 버전으로 첫 시작할 때 자동으로 실행됩니다.
자주 묻는 질문
호스트에서 mysql -h localhost로 왜 연결할 수 없나요?
Linux와 macOS에서 localhost는 MySQL 클라이언트가 Unix 소켓으로 연결을 시도하게 하는데, 그 소켓은 호스트에서 사용할 수 없습니다. 127.0.0.1을 명시적으로 사용하세요: mysql -h 127.0.0.1 -P 3306.
Docker에서 MySQL 데이터를 어떻게 유지하나요?
컨테이너를 시작할 때 명명된 볼륨을/var/lib/mysql에 마운트하세요: -v mysql-data:/var/lib/mysql. 이것이 없으면 모든 데이터가 컨테이너의 쓰기 가능 계층에 저장되고 docker rm을 실행할 때 사라집니다. 명명된 볼륨은 컨테이너 제거 후에도 남고 Docker가 관리합니다 — docker volume ls로 나열하고 docker volume inspect mysql-data로 저장 위치를 찾으세요. Docker Compose에서는 최상위 volumes: 키 아래에 볼륨을 선언하고 서비스의 volumes: 목록에서 참조하세요(위의 Docker Compose 섹션 예제가 이 패턴을 보여줍니다).
Docker Compose의 컨테이너는 MySQL에 어떻게 연결하나요?
같은 Compose 프로젝트의 컨테이너는 기본 네트워크를 공유합니다. 애플리케이션 컨테이너는 서비스 이름을 호스트 이름으로 사용해 MySQL에 연결합니다 — 데이터베이스 서비스 이름이db라면 연결 문자열은 host=db port=3306입니다. 컨테이너 사이에 포트를 노출할 필요는 없습니다. 포트 매핑(-p 3306:3306)은 호스트 머신에서의 연결에만 필요합니다. MySQL이 준비되기 전에 애플리케이션이 시작되는 것을 막으려면 MySQL 서비스의 healthcheck와 함께 depends_on: condition: service_healthy를 사용하세요.
실행 중인 컨테이너에 SQL 파일을 어떻게 실행하나요?
문제 해결
이 페이지의 모든 것은
villagesql/server 이미지에서도 동작합니다. VillageSQL은 MySQL의 드롭인 대체품이면서 확장 기능을 갖추고 있으므로, 위의 compose 파일, 볼륨, 헬스 체크는 이미지 이름 하나만 바꾸면 그대로 적용됩니다. Docker에서 사용해 보기.
함께 보기
- MySQL 복제 기초 — Docker Compose에서 소스/복제본 쌍 실행하기
- MySQL 백업 전략 — 컨테이너화된 MySQL의 데이터 볼륨 백업하기
- MySQL에서 업그레이드하기 — 컨테이너를 MySQL에서 VillageSQL로 옮기기
- Kubernetes에서 MySQL 실행하기 — 컨테이너 오케스트레이션의 다음 단계
- MySQL 튜토리얼을 위한 서버 설치하기 — SQL을 배울 서버 준비하기