도커 볼륨(Docker Volume)

강민석·2024년 10월 8일

Docker

목록 보기
3/3

Docker Volume

컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 이미지로 만들어 컨테이너로 띄울 수 있다.

이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행해야 하는데, 기존 컨테이너에서 수정하는 것이 아닌 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 하게 된다.

기존 컨테이너 내부에 있던 데이터도 같이 삭제되어, 데이터베이스를 띄운 컨테이너였다면 저장된 모든 데이터가 같이 삭제 돼버린다.

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

도커 볼륨이란?

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

  • 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트(로컬) 저장 공간을 공유해서 사용하는 형태

볼륨(Volume) 명령어

$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]

호스트의 저장 공간과 컨테이너의 저장 공간을 공유한다.

  • 호스트의 디렉토리 절대 경로에 디렉토리가 이미 존재할 경우

    호스트의 디렉토리가 컨테이너의 디렉토리를 덮어씌운다.

절대 경로 확인 명령어
$ pwd

호스트의 절대 경로 : C:\Users\alstj\desktop\volume\myData
컨테이너의 절대 경로 : /var/lib/mysql
인 경우에 호스트의 myData디렉토리의 절대경로를 입력하게 되면 기존에 만들어진 디렉토리이기 때문에 컨테이너의 디렉토리에 myData디렉토리 안에 있는 파일들로 공유되어 덮어씌워지게 된다.

  • 호스트의 디렉토리 절대 경로에 디렉토리가 존재하지 않을 경우

    호스트의 디렉토리 절대 경로에 디렉토리를 새로 만들고 컨테이너에 있는 파일들을 호스트의 디렉토리로 복사해온다.

C:\Users\alstj\desktop\volume까지 밖에 디렉토리가 없는 상황에서 C:\Users\alstj\desktop\volume\myData라는 존재하지 않는 디렉토리 경로를 만들어야 컨테이너 경로 내부의 파일들로 공유된다.

Docker로 MySQL 실행

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

$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
  • -e MYSQL_ROOT_PASSWORD=password123
    -e 옵션은 컨테이너의 환경 변수를 설정하는 옵션으로, Dockerhub의 MySQL 공식 문서를 보면 환경 변수로 MYSQL_ROOT_PASSWORD를 정해주어야만 정상적으로 컨테이너가 실행된다고 적혀져있다.

MySQL 컨테이너에 직접 접속

1. Docker 볼륨을 이용하여 MySQL 컨테이너 띄우기

# docker run -e MYSQL_ROOT_PASSWORD={설정하려는 환경변수} -p 3306:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql -d mysql

컨테이너의 디렉토리와 공유하려는 디렉토리를 미리 만들어 놓으면 안 됨

2. MySQL 컨테이너 접속

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

3. 컨테이너에서 MySQL 접근

$ mysql -u root -p

4. 접근 성공시 데이터베이스 조회해보기

mysql> show databases;

5. 데이터베이스 만들기

mysql> create database mydb;
mysql> show databases;

6. 컨테이너 종류 후 다시 생성해보기

  • 도커 볼륨이 잘 실행되는지 확인해봄
# 컨테이너 종료, 삭제
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]

# 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql

# 컨테이너 접속
$ docker exec -it [MySQL 컨테이너 ID] bash

# MySQL 접속
$ mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 없어지지 않고 남아있는 것을 볼 수 있다

컨테이너 삭제 후 다시 띄울 때 MySQL_ROOT_PASSWORD의 값을 변경하여 실행시켜도 비밀번호는 바뀌지 않는다.

Volume으로 설정해둔 폴더에 이미 비밀번호 정보가 저장되어 있기 때문

profile
많이 배우고 싶습니다

0개의 댓글