Docker

Docker 강좌 04강 — MySQL을 Docker로 띄우기 (실전)

🎯 학습 목표

  • 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 마이너 버전 태그를 고정해 두면 호환성 문제를 줄일 수 있습니다.