방명록
- Docker를 이용한 MySQL 컨테이너 실행(볼륨 마운트) 및 문제 해결2025년 07월 10일 21시 20분 29초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
Docker를 이용한 MySQL 컨테이너 실행(볼륨 마운트) 및 문제 해결
이번 포스팅에서는 Docker를 이용해 MySQL 컨테이너를 실행하는 과정에서 발생할 수 있는 문제점과 그 해결 방안, 그리고 데이터 영속성을 위한 볼륨 마운트 방법에 대해 다룬다.
1. Docker MySQL 컨테이너 기본 실행 시도
docker run -p 3306:3306 -d mysql명령어를 통해 MySQL 컨테이너를 실행하려고 시도한다.- 이 명령어는 Docker Hub에서
mysql:latest이미지를 로컬로 다운로드하고, 컨테이너의 3306 포트를 호스트의 3306 포트에 연결하며, 백그라운드(-d)로 실행하라는 의미이다. - 하지만 "ports are not available: exposing port TCP 0.0.0.0:3306 -> 127.0.0.1:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted."와 같은 오류 메시지가 발생했다. 이는 호스트의 3306 포트가 이미 다른 프로세스에 의해 사용 중이라는 의미이다.
2. 포트 사용 프로세스 확인 및 종료
lsof -i:3306또는sudo lsof -i:3306명령어를 통해 3306 포트를 사용하는 프로세스를 확인하려 했으나, 이 명령어들은 PowerShell 환경에서는 인식되지 않는 명령어이다.- Windows 환경에서는
netstat -ano | findstr :3306명령어를 사용하여 3306 포트를 사용 중인 프로세스를 확인할 수 있다. netstat결과4796이라는 PID(프로세스 ID)가 3306 포트를 사용 중임을 확인했다.tasklist | findstr 4796명령어를 통해 해당 PID의 프로세스가mysqld.exe임을 알아냈다.taskkill /PID 4796 /F명령어로 해당 프로세스를 강제로 종료하려 했으나, 액세스 거부 오류가 발생했다. 이는 관리자 권한이 필요하다는 의미이다.- 관리자 권한으로 PowerShell을 실행한 뒤
taskkill /PID 4796 /F명령어를 다시 실행하여 성공적으로 프로세스를 종료했다.
3. MySQL 컨테이너 재실행 및 초기화 오류
- 3306 포트가 비었음을 확인한 후, 다시
docker run -p 3306:3306 -d mysql명령어를 실행했다. - 컨테이너가 생성되었지만
docker ps명령어로 확인해보면 컨테이너가 바로Exited상태가 됨을 확인할 수 있었다. docker logs [CONTAINER_ID]명령어를 통해 로그를 확인한 결과, "Database is uninitialized and password option is not specified"라는 오류 메시지가 나타났다. 이는 MySQL 컨테이너 실행 시 초기 ROOT 비밀번호를 설정해 주어야 한다는 의미이다.
4. MySQL 컨테이너 비밀번호 설정 후 실행
- MySQL 컨테이너 실행 시
MYSQL_ROOT_PASSWORD환경 변수를 사용하여 ROOT 비밀번호를 설정한다. docker run -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql명령어를 실행하여 비밀번호를1234로 설정하고 컨테이너를 실행했다.docker ps명령어로 확인하면 컨테이너가 정상적으로Up상태로 실행 중임을 볼 수 있다.docker exec -it [CONTAINER_ID] bash명령어를 통해 컨테이너 내부로 접속하고,echo $MYSQL_ROOT_PASSWORD명령어로 설정된 비밀번호를 확인했다.
5. 데이터 영속성을 위한 볼륨 마운트
- Docker 컨테이너는 기본적으로 휘발성이다. 컨테이너가 삭제되면 컨테이너 내부의 데이터도 함께 사라진다. 이를 방지하기 위해 볼륨 마운트를 사용한다.
- 호스트에 MySQL 데이터를 저장할 디렉토리를 생성한다. 예제에서는
D:\develop\docker-mysql\mysql_data경로를 사용한다. docker run -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 -v D:\develop\docker-mysql/mysql_data:/var/lib/mysql mysql명령어를 사용하여 호스트의D:\develop\docker-mysql\mysql_data디렉토리를 컨테이너의/var/lib/mysql(MySQL 데이터가 저장되는 기본 경로)에 마운트한다.- 컨테이너 내부에서
mysql -u root -p명령어를 통해 MySQL에 접속하고,create database mydb;명령어로 새로운 데이터베이스를 생성한다. - 이후 컨테이너를 삭제(
docker rm -f [CONTAINER_ID])하고 다시 동일한 볼륨으로 새로운 컨테이너를 실행해도 이전에 생성했던mydb데이터베이스가 여전히 존재함을 확인할 수 있다. 이는 볼륨 마운트가 성공적으로 데이터를 영속적으로 저장했음을 의미한다.
6. 볼륨 마운트 시 비밀번호 변경 주의사항
- 기존에 볼륨이 존재하는 상태에서
docker run -e MYSQL_ROOT_PASSWORD=새비밀번호 ...명령어를 실행하여 비밀번호를 변경하려고 시도해도, 기존에 볼륨에 저장된 비밀번호가 유지된다. - 이는 MySQL이 초기화될 때만 환경 변수의 비밀번호를 사용하고, 이미 데이터가 존재하는 볼륨으로 시작하면 해당 볼륨의 설정을 따르기 때문이다.
- 따라서 이미 데이터가 있는 볼륨을 사용할 때는 초기 설정된 비밀번호를 기억하거나, 비밀번호를 변경하려면 MySQL 내부에서 직접 변경해야 한다.
7. Docker 볼륨 마운트 시 주의사항: 기존 파일이 있을 때
7-1. 초기화되지 않은 데이터 디렉토리 오류
D:\develop\docker-mysql\mysql_data디렉토리에empty.txt라는 파일이 존재하는 상태에서 MySQL 컨테이너를 볼륨 마운트하여 실행을 시도했다.- 명령어:
docker run -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 -v D:\develop\docker-mysql/mysql_data:/var/lib/mysql mysql - 컨테이너는 생성되었지만,
docker ps -a명령어로 확인해보니 컨테이너가Exited상태로 종료되어 있었다. docker logs [CONTAINER_ID]명령어로 로그를 확인한 결과, 다음과 같은 오류 메시지가 나타났다.[ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.- 이 오류는 MySQL 컨테이너가 데이터베이스를 초기화하려고 하는데, 마운트된 디렉토리에 이미 파일이 존재하기 때문에 초기화 작업을 진행할 수 없다는 의미이다. 즉, 비어있지 않은 디렉토리에 MySQL 데이터를 초기화하려고 할 때 발생하는 문제이다.
7-2. 해결 방안: 데이터 디렉토리 비우기
- 이 문제를 해결하기 위해서는 MySQL 데이터를 저장할 볼륨 디렉토리를 완전히 비워주어야 한다.
cd ..명령어를 통해 상위 디렉토리로 이동한 후,rm .\mysql_data\명령어를 사용하여mysql_data디렉토리 내부의 모든 파일을 삭제한다. 이 과정에서 PowerShell은 하위 항목이 있을 경우 재귀적으로 삭제할 것인지 사용자에게 확인을 요청한다.- 디렉토리가 비워진 것을 확인한 후, 다시
docker run -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 -v D:\develop\docker-mysql/mysql_data:/var/lib/mysql mysql명령어를 실행했다. - 이번에는
docker ps -a명령어로 확인해보니 컨테이너가 정상적으로Up상태로 실행 중임을 확인할 수 있었다.
728x90반응형'DevOps > Docker' 카테고리의 다른 글
도커(Docker) 기본 명령어 실습: 컨테이너 생성 및 관리 (3) 2025.07.14 Docker 볼륨을 이용한 데이터 영속성 확보 실습(PostgreSQL, MongoDB) (5) 2025.07.11 도커(Docker) 컨테이너 로그 확인, 컨테이너 내부 명령어 실행(logs, exec) 및 redis 컨테이너 활용 예제 (7) 2025.07.09 Docker 이미지 및 컨테이너 관리 명령어 실습(이미지 다운로드/조회/삭제, 컨테이너 생성/실행/조회/중지/삭제) (1) 2025.07.08 윈도우에서 Docker 설치 시 겪었던 난관, 그리고 해결 (2) 2025.07.07 다음글이 없습니다.이전글이 없습니다.댓글