메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
공식 MySQL Docker 이미지는 완전히 구성된 MySQL 서버를 컨테이너에서 실행하게 해줍니다. 환경 변수를 통해 초기화, 사용자 생성, 데이터 디렉터리 설정을 자동으로 처리합니다.

빠른 시작

호스트 머신에서 연결하기:
또는 컨테이너 안에서 연결하기:

환경 변수

MYSQL_USER와 MYSQL_PASSWORD는 함께 설정해야 합니다. 만들어진 사용자는 MYSQL_DATABASE에 대한 전체 접근 권한을 받습니다.

볼륨으로 데이터 유지하기

볼륨이 없으면 컨테이너를 제거할 때 모든 데이터가 사라집니다. 데이터 디렉터리를 유지하려면 볼륨을 마운트하세요:
명명된 볼륨(mysql-data)은 컨테이너 재시작과 제거에 걸쳐 유지됩니다. 대신 호스트 디렉터리를 사용하려면:
데이터 디렉터리는 MySQL의 데이터와 로그를 소유합니다. 실행 중인 두 MySQL 컨테이너 사이에 볼륨을 절대 공유하지 마세요.

이미지와 볼륨 전략 선택하기

대부분의 워크로드에서 명명된 볼륨이 올바른 기본값입니다. 바인드 마운트는 호스트에서 데이터 디렉터리를 직접 검사하거나 편집해야 할 때 유용하지만, macOS와 Windows에서는 성능 비용이 중요합니다.

Docker Compose

여러 서비스가 있는 개발 환경에서는 Docker Compose가 표준 접근법입니다:
depends_on: condition: service_healthy와 함께 쓰는 healthcheck는 MySQL이 단지 시작된 것이 아니라 연결을 받아들일 준비가 될 때까지 애플리케이션 컨테이너가 시작되지 않게 보장합니다.

사용자 정의 구성

사용자 정의 my.cnf를 마운트해서 전달하세요:
또는 명령 인수로 옵션을 직접 설정하세요:

초기화 스크립트

컨테이너는 첫 시작 시(데이터 디렉터리가 비어 있을 때) /docker-entrypoint-initdb.d/에 놓인 모든 .sql 또는 .sh 파일을 실행합니다:
SQL 파일은 root로 실행됩니다. 셸 스크립트는 컨테이너 환경에서 실행됩니다. 이 스크립트들은 맨 처음 초기화에서만 실행됩니다 — 이후의 컨테이너 시작에서는 실행되지 않습니다.

애플리케이션에서 연결하기

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에서 사용해 보기.

함께 보기