CI,CD/Docker

[Docker] 도커 볼륨(Docker Volume)

prao 2024. 7. 19. 10:32
반응형

docker

Docker Volume(도커 볼륨)

컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있다. 이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 한다. 이 때, Docker는 기존 컨테이너에서 변경된 부분을 수정하지 않고, 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체한다.

 

이런 특징 때문에 기존 컨테이너를 새로운 컨테이너로 교체하면 기존 컨테이너 내부에 있던 데이터도 같이 삭제된다. 만약 이 컨테이너가 MySQL을 실행시키는 컨테이너라면 MySQL에 저장된 데이터도 같이 삭제된다.

 

따라서 컨테이너 내부에 저장된 데이터가 삭제되면 안되는 경우 볼륨(Volume)이라는 개념을 활용해야 한다.

 

Docker Volume(도커 볼륨)이란?

도커 볼륨(Volume)
도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법

볼륨은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태

호스트 컴퓨터 - 컨테이너

docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
  • [호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉토리가 컨테이너의 디렉토리를 덮어씌움

호스트의 저장 공간과 컨테이너의 저장 공간 연결

  • [호스트의 디렉토리 절대 경로]에 디렉토리가 존재하지 않을 경우, 호스트의 디렉토리 절대 경로에 디렉토리를 새로 만들고 컨테이너의 디렉토리에 있는 파일들을 호스트의 디렉토리로 복사해온다.

 [실습] Docker로 MySQL 실행

Docker로 MySQL 실행시켜기

MySQL 이미지를 바탕으로 컨테이너 실행

docker run -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -d mysql
  • -e MYSQL_ROOT_PASSWORD=pass : -e 옵션은 컨테이너의 환경 변수를 설정하는 옵션
  • Dockerhub의 MySQL 공식 문서를 참고하면 환경 변수로 MYSQL_ROOT_PASSWORD를 정해주어야만 정상적으로 컨테이너가 실행됨
  • 컨테이너로 들어가서 환경 변수 확인 방법
docker exec -it [MySQL 컨테이너 ID] bash

echo $MYSQL_ROOT_PASSWORD # MYSQL_ROOT_PASSWORD라는 환경변수 값 출력

export # 설정되어 있는 모든 환경변수 출력

 

컨테이너가 잘 실행되고 있는지 체크

docker ps

docker ps

 

컨테이너 실행시킬 때 에러 없이 잘 실행됐는지 로그 체크

docker logs [컨테이너 ID 또는 컨테이너명]

MySQL 실행

 

MySQL 컨테이너에 직접 접속

MySQL 컨테이너에 접속

docker exec -it [MySQL 컨테이너 ID] bash

 

컨테이너에서 MySQL에 접근

mysql -u root -p

mysql 접근

 

MySQL 접근에 성공했다면 데이터베이스 조회

mysql> show databases;

databases

 

데이터베이스 만들기

mysql> create database prao;
mysql> show databases;

create database

 

컨테이너 종료 후 다시 생성해기

컨테이너 종료

docker stop [MySQL 컨테이너 ID]

 

컨테이너 삭제

docker rm [MySQL 컨테이너 ID]

 

컨테이너 생성

docker run -e MYSQL_ROOT_PASSWOR=pass -p 3306:3306 -d mysql

 

컨테이너 내부 접속

docker exec -it [MySQL 컨테이너 ID] bash

 

MySQL 접속

mysql -u root -p

 

database 확인

mysql> show databases;
  • 이전에 생성한 데이터베이스가 없어진 것을 확인할 수 있음
볼륨(Volume)을 활용하지 않고 MySQL 컨테이너를 띄웠을 때, MySQL 컨테이너를 삭제함과 동시에 MySQL 내부에 저장되어 있던 데이터도 함께 삭제되어 없어졌다. 이를 방지하기 위해 볼륨(Volume)을 활용해 MySQL 컨테이너를 띄우는 방식에 대해 알아보자.

 

볼륨(Volume)을 활용해 MySQL 컨테이너 띄우기

MySQL 컨테이너 띄기

MySQL 데이터를 저장하고 싶은 경로로 이동하여 폴더 만들기

cd Desktop/prao
mkdir docker-mysql

 

폴더 경로 확인

pwd

폴더 경로 확인

 

도커 볼륨을 사용하여 MySQL 컨테이너 띄우기

docker run -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql -d mysql
docker run -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -v C:\Users\SSAFY\Desktop\prao\docker-mysql/mysql_data:/var/lib/mysql -d mysql

볼륨을 사용하여 MySQL 띄우기

  • 주의) mysql_data 디렉토리를 미리 만들어 놓으면 안된다. 그래야 처음 이미지를 실행시킬 때 mysql 내부에 있는 /var/lib/mysql 파일들을 호스트 컴퓨터로 공유받을 수 있다. mysql_data 디렉토리를 미리 만들어놓을 경우, 기존 컨테이너의 /var/lib/mysql 파일들을 전부 삭제한 뒤에 mysql_data로 덮어씌워 버린다.
  • DB에 관련된 데이터가 저장되는 곳이 /var/lib/mysql인지는 Dockerhub MySQL 공식 문서에 나와있다.

MySQL 공식문서

 

 

연결 확인

docker ps

 

MySQL 컨테이너에 접속해서 데이터베이스 만기

docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
mysql> show databases;
mysql> create database prao;
mysql> show databases;

 

컨테이너 종료 후 다시 생성해보기

컨테이너 종료 및 삭제

docker stop [MySQL 컨테이너 ID]
docker rm [MySQL 컨테이너 ID]

 

 

컨테이너 생성

docker run -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -v C:\Users\SSAFY\Desktop\prao\docker-mysql/mysql_data:/var/lib/mysql -d mysql

 

컨테이너 내부 MySQL 접속

docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
mysql> show databases;
  •  아까 생성한 데이터베이스가 볼륨을 사용하였기에 없어지지 않고 존재하는 것을 확인할 수 있다.

volume 연결

 

MySQL 컨테이너 삭제하고 비밀번호 바꿔서 다시 띄운다면?

docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
  • 접속이 되지 않음
  • 이유: Volume으로 설정해둔 폴더에 이미 비밀번호 정보가 저장되어 버렸기 때문
반응형