Dandy Now!
  • Docker를 이용한 MySQL 컨테이너 실행(볼륨 마운트) 및 문제 해결
    2025년 07월 10일 21시 20분 29초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    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
    반응형
    댓글