Docker Volume이란?

개미개미개·2025년 1월 7일

DevOps

목록 보기
2/7
post-thumbnail

컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있는데 이 프로그램에 기능이 추가된다면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 한다.

이 때, Docker에서는 기존 컨테이너에서 변경된 부분을 수정하지 않고 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 하는데 이러한 부분이 효과적인 것이다.

그러나 이러한 방식 때문에 오히려 새로운 컨테이너로 교체를 할 때 기존의 데이터가 같이 삭제되는 현상이 발생하는데 이러한 상황을 막기 위해 나온 것이 Docker Volume(도커 볼륨) 이라는 개념이다.


Docker Volume(도커 볼륨) 이란?

도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법으로 컨테이너 자체의 저장 공간을 사용하지 않고,
호스트의 저장 공간을 공유해서 사용하는 형태이다.

볼륨을 사용하는 명령어는 아래와 같다.

$ docker run -v [HOST_ABSOLUTE_PATH]:[CONTAINER_ABSOLUTE_PATH] [IMAGE_NAME]:[TAG_NAME]

이 명령어를 사용할 때는 두가지의 경우의 수가 존재한다.

1. HOST의 절대경로에 디렉토리가 이미 존재할 경우

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

2. HOST의 절대경로에 디렉토리가 존재하지 않을 경우

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

위 말이 이해가 안될 수 있겠지만 아래의 MySQL 예제로 알아보도록 하겠다.


Docker에서 MySQL 실행

MySQL이미지를 실행시키기 위해서는 비밀번호를 반드시 설정해주어야 한다.

-e 는 리눅스의 환경변수를 설정하는 옵션이며 아래와 같은 코드를 입력하면 MySQL 이미지를 실행 시킬 수 있다.

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

만약 비밀번호를 설정하지 않으면 해당 컨테이너의 로그에 아래와 같은 에러를 볼 수 있을 것이다.

2025-01-07 16:40:24+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-07 16:40:24+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2025-01-07 16:40:24+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-07 16:40:24+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following as an environment variable:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD
~

만약 비밀번호를 잘 설정하여 이미지를 실행시켰다면 이와 같이 지정한 비밀번호로 환경변수가 등록된 것을 확인 할수도 있고

DataGrip에서도 잘 연결된 것을 확인 할 수 있다.

볼륨 설정

그러나 위의 방식대로 생성된 MySQL 이미지는 컨테이너가 삭제된다면 데이터 또한 같이 삭제되기 때문에 위에서 설명한대로 호스트의 저장공간을 공유하는 형태로 다시 생성해주어야 한다.

$ docker run -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 -v /Users/lee/Desktop/Study/Develop/docker-mysql/mysql_data:/var/lib/mysql mysql

이와 같이 -v 뒤에 host의 절대경로에 MySQL 컨테이너의 /var/lib/mysql 의 데이터를 동기화하는 느낌으로 생각하면 될 것 같다. 그렇게 된다면 컨테이너를 삭제하더라도 데이터는 host의 경로에 남아 있기 때문에 안전하다.

만약에 /var/lib/mysql이 어디서 나왔는지 궁금하면 아래 그림 또는 DockerHub 공식문서를 참고하길 바란다.

그렇게 생성된 컨테이너에서 MySQL에 접속해서 아래와 같이 mydb라는 데이터베이스를 만들고 컨테이너를 삭제하고 다시 올려도 그대로 유지되는 것을 볼 수 있다.

이렇게 저장되는 파일들은 아래 그림과 같이 저장된다.

🚨주의할 점 : 만약에 MySQL의 최초 비밀번호가 아닌 다른 비밀번호를 입력할 시에는 에러가 나니 주의하길 바란다.

profile
개미는 오늘도 일을 합니다.

0개의 댓글