Docker로 MySQL 설치하고 DB 만들기 – 워드프레스 준비하기

Docker로 MySQL 설치하고 DB 만들기 – 워드프레스 준비하기

이제 웹서버(Nginx)는 준비됐다.
다음 단계는 워드프레스가 사용할 데이터베이스(DB)를 만드는 것이다.

워드프레스는 글, 설정, 사용자 정보 등을 MySQL 또는 MariaDB에 저장한다.
이번 글에서는 Docker를 이용해 MySQL을 설치하고, DB와 사용자까지 만드는 방법을 알아보자.

📌 MySQL vs MariaDB – 뭐가 다르고 뭘 선택해야 하나?

워드프레스는 MySQL과 MariaDB 둘 다 지원한다.
그렇다면 어떤 걸 선택해야 할까?

상세 비교

항목MySQLMariaDB
개발사OracleMariaDB Foundation (오픈소스)
라이선스GPL (일부 기능 상용)GPL (완전 오픈소스)
성능안정적MySQL보다 약간 빠름
호환성⭐⭐⭐⭐⭐⭐⭐⭐⭐ (MySQL 대부분 호환)
메모리 사용보통약간 적음
커뮤니티매우 큼크고 활발함
워드프레스 지원공식 권장완벽 지원
홈서버 추천⭐⭐⭐⭐⭐⭐⭐⭐⭐

권장 선택

  • MySQL 5.7 또는 8.0 – 안정적이고 자료가 가장 많음 ⭐ 추천
  • MariaDB 10.6+ – 조금 더 가볍고 완전 오픈소스

이번 예제에서는 MySQL 8.0을 기준으로 설명한다.
MariaDB로 대체해도 명령어는 거의 동일하게 작동한다.

🎯 이번 실습 목표

  1. MySQL 컨테이너 실행
  2. 워드프레스용 DB 및 사용자 자동 생성
  3. 데이터 영속성 확인 (볼륨 활용)
  4. DB 연결 테스트
  5. 보안 설정 및 백업 전략

🚀 Step 1: MySQL 컨테이너 실행

기본 실행 명령어

# MySQL 8.0 실행
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=WpUserPass2025! \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

명령어 옵션 상세 설명

옵션설명
--namemy-mysql컨테이너 식별 이름
-e MYSQL_ROOT_PASSWORDSecureRootPass2025!root 계정 비밀번호 (필수!)
-e MYSQL_DATABASEwordpress자동 생성할 DB 이름
-e MYSQL_USERwpuser워드프레스용 사용자명
-e MYSQL_PASSWORDWpUserPass2025!wpuser 비밀번호
-p 3306:3306MySQL 기본 포트 매핑
-v mysql-data:/var/lib/mysql데이터 영구 저장 볼륨
mysql:8.0MySQL 8.0 공식 이미지

실행 과정

명령어 실행 시:

  1. 이미지 다운로드 (처음만, 약 200~300MB)
  2. 컨테이너 생성
  3. MySQL 초기화
    • root 계정 생성
    • wordpress 데이터베이스 생성
    • wpuser 사용자 생성 및 권한 부여
  4. 서비스 시작 (약 30초~1분 소요)

실행 확인

# 컨테이너 상태 확인
docker ps

# 로그로 초기화 완료 확인
docker logs my-mysql

정상 출력 예시:

[Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.35'  
socket: '/var/run/mysqld/mysqld.sock'  port: 3306

✅ “ready for connections” 메시지 보이면 성공!

💡 환경 변수 상세 설명

필수 환경 변수

변수명필수 여부설명
MYSQL_ROOT_PASSWORD✅ 필수최고 관리자(root) 비밀번호. 이거 없으면 실행 안 됨!
MYSQL_DATABASE선택자동 생성할 DB 이름. 생략 시 수동 생성 필요
MYSQL_USER선택새 사용자 생성. root 외 별도 계정
MYSQL_PASSWORD선택*MYSQL_USER 설정 시 필수!

추가 유용한 환경 변수

# 문자셋 설정 (한글 지원)
-e MYSQL_CHARSET=utf8mb4 \
-e MYSQL_COLLATION=utf8mb4_unicode_ci \

# 랜덤 root 비밀번호 생성
-e MYSQL_RANDOM_ROOT_PASSWORD=yes \

# root 원격 접속 허용 (개발 환경용)
-e MYSQL_ROOT_HOST=% \

⚠️ 비밀번호 보안 주의사항

위 예제의 “1234” 같은 비밀번호는 절대 실제 운영 환경에서 사용하지 마세요!

강력한 비밀번호 예시:

  • 최소 12자 이상
  • 대소문자 + 숫자 + 특수문자 혼합
  • 예: Wp$ecure2025!@MyHomeServer

비밀번호 생성 도구:

# 랜덤 비밀번호 생성 (리눅스)
openssl rand -base64 16

# 출력 예: Ry8K3mP9vQ2nX4tL

🔍 Step 2: DB 연결 테스트

방법 1: Docker exec로 접속 (권장)

# MySQL 컨테이너 내부로 접속
docker exec -it my-mysql mysql -u wpuser -p

# 비밀번호 입력: WpUserPass2025!

접속 성공 시:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.35 MySQL Community Server - GPL

mysql> _

DB 확인 명령어

# 데이터베이스 목록 확인
SHOW DATABASES;

# 출력:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| wordpress          |
+--------------------+

# wordpress DB 선택
USE wordpress;

# 현재 DB 확인
SELECT DATABASE();

# 테이블 목록 (아직 비어있음)
SHOW TABLES;

# 종료
EXIT;

✅ “wordpress” DB가 보이면 성공!

방법 2: root 계정으로 접속 (관리용)

# root로 접속
docker exec -it my-mysql mysql -u root -p

# 사용자 권한 확인
SELECT user, host FROM mysql.user;

# wpuser 권한 상세 확인
SHOW GRANTS FOR 'wpuser'@'%';

# 종료
EXIT;

방법 3: 호스트에서 직접 접속 (MySQL 클라이언트 필요)

# MySQL 클라이언트 설치 (Ubuntu)
sudo apt install mysql-client -y

# 접속
mysql -h 127.0.0.1 -P 3306 -u wpuser -p

# 또는
mysql -h localhost -u wpuser -p

💾 Step 3: 데이터 영속성 확인 – 볼륨의 중요성

왜 볼륨이 필수인가?

볼륨 없이 실행한 경우:

docker run -d --name temp-mysql \
  -e MYSQL_ROOT_PASSWORD=1234 \
  mysql:8.0

# 데이터 입력
# 컨테이너 삭제
docker rm -f temp-mysql

# → 모든 데이터 날아감! 🔥

볼륨 사용 시:

docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 데이터 입력
# 컨테이너 삭제
docker rm -f my-mysql

# 같은 볼륨으로 재실행
docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# → 데이터 그대로 유지! ✅

볼륨 테스트 실습

# 1. 테스트 데이터 입력
docker exec -it my-mysql mysql -u wpuser -p

# MySQL 프롬프트에서
USE wordpress;
CREATE TABLE test (id INT, name VARCHAR(50));
INSERT INTO test VALUES (1, 'Hello HomeServer');
SELECT * FROM test;
EXIT;

# 2. 컨테이너 삭제
docker stop my-mysql
docker rm my-mysql

# 3. 같은 볼륨으로 재생성
docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=WpUserPass2025! \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 4. 데이터 확인
docker exec -it my-mysql mysql -u wpuser -pWpUserPass2025!

USE wordpress;
SELECT * FROM test;

# → 'Hello HomeServer' 데이터 그대로 있음!

📌 Docker 볼륨 관리

볼륨 명령어 모음

# 볼륨 목록 확인
docker volume ls

# 특정 볼륨 상세 정보
docker volume inspect mysql-data

# 볼륨 생성 (수동)
docker volume create my-custom-volume

# 볼륨 삭제 (데이터도 함께 삭제됨!)
docker volume rm mysql-data

# 사용하지 않는 볼륨 전체 삭제
docker volume prune

볼륨 위치 확인

# 볼륨 실제 저장 위치
docker volume inspect mysql-data | grep Mountpoint

# 출력 예:
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data"

# 확인 (root 권한 필요)
sudo ls -la /var/lib/docker/volumes/mysql-data/_data

볼륨 백업 전략

# 방법 1: 볼륨 전체 백업
docker run --rm \
  -v mysql-data:/data \
  -v $(pwd):/backup \
  ubuntu tar czf /backup/mysql-backup-$(date +%Y%m%d).tar.gz /data

# 방법 2: mysqldump 사용 (권장)
docker exec my-mysql mysqldump -u root -pSecureRootPass2025! \
  --all-databases > ~/mysql-backup-$(date +%Y%m%d).sql

# 방법 3: 자동 백업 스크립트 (cron)
# 나중에 백업 자동화 편에서 상세히 다룸

🔧 Step 4: MySQL 성능 및 설정 최적화

홈서버용 권장 설정

# my.cnf 설정 파일 마운트
mkdir -p ~/mysql-config

cat > ~/mysql-config/my.cnf << 'EOF'
[mysqld]
# 기본 설정
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 성능 최적화 (4GB RAM 기준)
max_connections=50
innodb_buffer_pool_size=512M
innodb_log_file_size=128M

# 로그 설정
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

# 보안 설정
bind-address=0.0.0.0
EOF

# 설정 파일 적용하여 실행
docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=WpUserPass2025! \
  -v mysql-data:/var/lib/mysql \
  -v ~/mysql-config:/etc/mysql/conf.d:ro \
  -p 3306:3306 \
  mysql:8.0

메모리별 권장 설정

서버 RAMinnodb_buffer_pool_sizemax_connections
2GB256M30
4GB512M50
8GB1G~2G100
16GB4G~6G150

🔐 Step 5: 보안 강화

1. root 원격 접속 차단 (프로덕션 필수)

# root는 localhost에서만 접속 가능하게
docker exec -it my-mysql mysql -u root -p

DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;
EXIT;

2. 불필요한 계정 삭제

# 익명 사용자 삭제
docker exec -it my-mysql mysql -u root -p

DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
EXIT;

3. 외부 접속 차단 (더 안전하게)

# 포트 매핑 제거 (같은 Docker 네트워크 내에서만 접속 가능)
docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=SecureRootPass2025! \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=WpUserPass2025! \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0
# -p 3306:3306 제거!

# 이제 워드프레스 컨테이너와 같은 네트워크로만 연결

📊 Step 6: MySQL 모니터링

리소스 사용량 확인

# 실시간 모니터링
docker stats my-mysql

# 출력 예:
CONTAINER ID   NAME       CPU %   MEM USAGE / LIMIT   MEM %
abc123def456   my-mysql   0.15%   380MiB / 7.7GiB    4.8%

MySQL 상태 확인

# MySQL 접속 후
docker exec -it my-mysql mysql -u root -p

SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Questions';
SHOW STATUS LIKE 'Uptime';
SHOW PROCESSLIST;
EXIT;

🚨 자주 발생하는 문제 해결

문제 1: "Can't connect to MySQL server"

원인: MySQL 초기화 중 또는 포트 문제

해결:

# 1. 로그 확인
docker logs my-mysql

# 2. "ready for connections" 확인될 때까지 대기 (약 30초)

# 3. 포트 확인
docker port my-mysql

# 4. 방화벽 확인
sudo ufw allow 3306

문제 2: "Access denied for user"

원인: 비밀번호 오류 또는 권한 문제

해결:

# root로 접속해서 사용자 확인
docker exec -it my-mysql mysql -u root -p

SELECT user, host FROM mysql.user;

# wpuser 권한 재부여
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'%';
FLUSH PRIVILEGES;
EXIT;

문제 3: 데이터 손실

원인: 볼륨 미지정 또는 볼륨 삭제

예방:

# 볼륨 반드시 지정
-v mysql-data:/var/lib/mysql

# 컨테이너 삭제 시 볼륨은 유지됨
docker rm my-mysql  # OK, 데이터 유지

# 볼륨까지 삭제하려면 명시적으로
docker volume rm mysql-data  # 주의!

📝 정리하며

이번 글에서 배운 내용:

핵심 요약

  • MySQL과 MariaDB 비교 – MySQL 8.0 추천
  • 환경 변수로 DB와 사용자 자동 생성
  • 볼륨 필수! – 데이터 영속성 보장
  • DB 연결 테스트 3가지 방법
  • 보안 설정 및 성능 최적화
  • 백업 전략 및 모니터링

워드프레스 연결 준비 완료!

이제 다음과 같은 정보가 준비되었다:

항목
DB 호스트my-mysql (또는 컨테이너 IP)
DB 이름wordpress
DB 사용자wpuser
DB 비밀번호WpUserPass2025!
포트3306

다음 단계

다음 글에서는 이 MySQL과 연동할 워드프레스 컨테이너를 직접 설치하고,
Docker Compose로 두 컨테이너를 한 번에 관리하는 방법을 배울 것이다.

홈서버에서 진짜 블로그가 탄생하는 순간이 다가온다! 🌱

댓글 남기기

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.