🎯 학습 목표
- MySQL 8 컨테이너를 환경변수로 초기화하며 실행한다.
- 볼륨으로 DB 데이터를 영속화한다.
- 호스트(윈도우/WSL)와 다른 컨테이너에서 MySQL에 접속한다.
📖 개념 설명
로컬에 MySQL을 직접 설치하면 버전 충돌·잔여 설정 같은 골칫거리가 따라옵니다. Docker로 띄우면 명령 한 줄로 깨끗한 MySQL을 얻고, 필요 없어지면 컨테이너만 지우면 됩니다. 공식 mysql 이미지는 환경변수로 root 비밀번호·기본 DB·사용자까지 자동 생성해 줍니다.
핵심은 두 가지입니다. (1) 볼륨을 /var/lib/mysql에 붙여 데이터를 보존하고, (2) 포트 매핑으로 외부 접속을 허용하는 것입니다.
💻 실습 — MySQL 8 실행
# 데이터 보존용 볼륨
docker volume create mysql_data
# MySQL 8 컨테이너 실행
docker run -d --name mysql8
-e MYSQL_ROOT_PASSWORD=rootpw
-e MYSQL_DATABASE=appdb
-e MYSQL_USER=appuser
-e MYSQL_PASSWORD=apppw
-p 3306:3306
-v mysql_data:/var/lib/mysql
mysql:8.0
# 초기화 로그 확인 ("ready for connections" 가 보이면 준비 완료)
docker logs -f mysql8
💻 접속 방법 1 — 컨테이너 안에서
# 컨테이너 내부 mysql 클라이언트로 접속
docker exec -it mysql8 mysql -uappuser -papppw appdb
# (mysql 프롬프트에서)
SHOW DATABASES;
CREATE TABLE memo(id INT PRIMARY KEY AUTO_INCREMENT, body TEXT);
INSERT INTO memo(body) VALUES ('docker mysql 동작!');
SELECT * FROM memo;
EXIT;
💻 접속 방법 2 — 호스트(WSL/윈도우)에서
# WSL Ubuntu에 클라이언트가 있다면
mysql -h 127.0.0.1 -P 3306 -uappuser -papppw appdb
# 또는 DBeaver/MySQL Workbench 같은 GUI 툴에서
# Host: 127.0.0.1 Port: 3306 User: appuser Pass: apppw DB: appdb
💻 데이터 영속화 검증
# 컨테이너를 지웠다가
docker rm -f mysql8
# 같은 볼륨으로 다시 띄우면 memo 테이블 데이터가 그대로 남아 있음
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=rootpw
-p 3306:3306 -v mysql_data:/var/lib/mysql mysql:8.0
⚠️ 주의사항
- 비밀번호를 실제 운영에서 명령줄에 직접 쓰지 마세요. compose의
.env나 시크릿을 사용합니다(다음 강에서). - 포트 3306이 이미 점유되어 있으면
-p 3307:3306처럼 호스트 포트를 바꾸세요. - 한글이 깨지면
--character-set-server=utf8mb4옵션을 추가하세요.
💡 팁
- 초기 스키마를 자동 적용하려면
.sql파일을/docker-entrypoint-initdb.d/에 마운트하세요(최초 실행 시 1회 적용). - 운영과 같은 MySQL 마이너 버전 태그를 고정해 두면 호환성 문제를 줄일 수 있습니다.