2 minute read

-v 옵션이란?

도커에서 -v 옵션은 컨테이너와 호스트 간에 디렉토리나 파일을 공유할 수 있도록 해주는 볼륨(Volume) 마운트 옵션이다. 즉, 컨테이너 안에서 생성되거나 수정되는 파일을 호스트에 저장하거나, 호스트에 있는 파일을 컨테이너에서 접근할 수 있도록 해주는 기능이다.

기본 문법

docker run -v [호스트 디렉토리]:[컨테이너 디렉토리] [이미지명]

예시:
docker run -v /home/user/data:/app/data my-image

이렇게 하면 컨테이너에서 /app/data 디렉토리에 접근하면 실제로는 /home/user/data와 연결돼서 데이터를 공유할 수 있다.

볼륨의 종류

1. 호스트 볼륨(host volume) : 위에서 설명한 것처럼 호스트의 특정 디렉토리를 컨테이너와 공유하는 방식이다.

2. 도커 볼륨(docker managed volumme) : 도커가 관리하는 이름 있는 볼륨을 사용하는 방식이다.

docker volume create mydata
docker run -v mydata:/app/data my-image

mydata라는 이름의 볼륨이 자동으로 도커 내부에 생성되고, 컨테이너의 /app/data 와 연결된다.

주요 옵션 추가 예시

docker run -v /path:/path:ro my-image
  • ro 옵션 : read-only. 컨테이너에서는 읽기만 가능, 수정 불가능
docker run -v myvolume:/data --name mycontainer ubuntu
  • 이름 있는 도커 볼륨 사용 예시

볼륨을 사용하는 이유?

컨테이너는 기본적으로 비영속적(종료되면 데이터가 사라짐)이다. 볼륨을 사용하면 데이터를 영속적으로 저장이 가능하기 때문에 볼륨을 사용한다. 또한 호스트와 컨테이너 사이 파일 공유, 여러 컨테이너 간의 데이터 공유도 가능하다.

볼륨 관련 추가 명령어

# 현재 도커에 등록된 볼륨 보기
docker volume ls
# 특정 볼륨 정보 확인
docker volume inspect mydata
# 볼륨 삭제
docker volume rm mydata

-v 옵션 실습 : Host와 Mysql 컨테이너들 간의 db 볼륨 공유해보기

  • 실습 순서
    • Host 디렉토리 생성
    • 첫 번째 Mysql 컨테이너 실행 + 볼륨 연결
    • 테이블 생성 및 데이터 저장
    • 두 번째 Mysql 컨테이너 실행 -> 같은 볼륨 연결
    • 두 컨테이너 모두 종료 및 삭제
    • 세 번째 컨테이너 실행(같은 볼륨 연결)
  • 먼저 Host 디렉토리를 생성한다. mkdir로 생성 후 pwd로 경로를 확인해둔다.

Alt text

  • 이후 아래 명령어를 이용하여 mysql을 run 해준다.
docker run -d --name mysqlVol_1 -e MYSQL_ROOT_PASSWORD='1111' -v /HostDirPath:/var/lib/mysql -p 3306:3306 mysql
  • 컨테이너 이름은 “mysqlVol_1”으로 지정해주고, -e 옵션을 이용하여 mysql root 계정의 비밀번호를 1111로 설정해준다(환경변수 설정 옵션)

Alt text

  • 컨테이너가 정상적으로 실행이 되면 exec 명령어를 이용하여 mysql 터미널로 들어가준다.
docker exec -it mysqlVol_1 mysql -u root -p 

Alt text

  • sql에서 testdb 데이터베이스를 생성해준다.
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE dp (
    id INT PRIMARY KEY,
    value VARCHAR(100)
);
INSERT INTO dp VALUES (1, 'Docker is fun!');

Alt text

  • 생성된 db는 HostDir에서도 확인이 가능함을 알 수 있다.

Alt text

  • mysqlVol_1을 잠시 stop 해준다. MySQL은 데이터 파일에 배타적 락(Exclusive Lock)을 걸기 때문에, 이미 사용 중인 데이터 디렉토리는 다른 컨테이너가 동시에 접근할 수 없기 때문에 이전 컨테이너를 잠시 stop해야 공유 디렉토리에 접근할 수 있다.

Alt text

  • 이전 mysqlVol_1이 stop이 됐다면, mysqlVol_2 컨테이너를 run하고 exec를 한다. 여기서 주의해야할 점은 포트를 다르게 설정해야한다. 호스트 포트는 중복될 수 없기 때문이다. 하나의 포트(예: 3306)은 한 번에 하나의 프로세스만 바인딩이 가능하다. 이미 mysqlVol_1이 3306 포트를 사용 중이면, mysqlVol_2도 3306:3306으로 실행하면 충돌이 발생한다. 그러므로 mysqlVol_2에서는 -p 3307:3306 등 다른 호스트 포트로 매핑해야 한다.

Alt text

  • show databases; 로 testdb가 존재하는지 확인이 된다.

Alt text

  • 이제 두 컨테이너를 모두 삭제한 후 새로운 컨테이너를 run하여 볼륨이 공유되는지 확인해보자.

Alt text

Alt text

  • 여전히 testdb가 존재하는 것을 확인할 수 있다.

Alt text