컨테이너는 일반적으로 변경 불가능하고 일시적입니다.
이것은 "불변 인프라스트럭처(immutable infrastructure)"의 개념을 의미하는데, 이는 컨테이너를 변경하지 않고, 필요할 때마다 새로 배포하는 것을 의미합니다.
그러나 데이터베이스나 고유한 데이터 같은 경우는 어떻게 처리할까요? 이러한 데이터는 컨테이너의 불변성과 일시성 특성과 충돌할 수 있습니다.
Docker는 이러한 "관심사의 분리(separation of concerns)"를 보장하기 위한 기능을 제공합니다. 이러한 데이터는 "영속 데이터(persistent data)"로 처리됩니다.
ex) A container, B container가 같은 로컬 데이터를 바라볼 수 있도록 할 수 있습니다. container 밖에 존재해 안전하고 언제든지 어떤 container라도 탈부착과 데이터에 대한 수정이 가능합니다.
영속 데이터를 처리하기 위한 두 가지 방법은 "볼륨(Volumes)"과 "바인드 마운트(Bind Mounts)"입니다.
볼륨은 컨테이너의 유니온 파일 시스템(UFS) 밖에 특별한 위치를 생성합니다. 이를 통해 데이터를 컨테이너의 생명주기와 무관하기 때문에 컨테이너가 삭제되거나 재생성되어도 유지할 수 있습니다.
이름도 붙일 수 있습니다.
docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
도커 컨테이너를 mysql 이라 이름 붙이고 환경변수 설정 후 mysql-db라는 이름의 /var/lib/mysql 이라는 volume을 생성합니다. mysql 이미지 를 실행합니다.
생성한 볼륨은 다른 이미지를 실행시킬때 같은 경로를 사용한다면 데이터를 유지하고 db 엔진을 업데이트할 수 있는 등 데이터가 영구적이고 독립적으로 유지될 수 있도록 도와줍니다.
이 특별한 위치는 Docker가 관리하는 공간 내에 존재하며, 일반적으로 사용자가 직접 접근하거나 관리하지 않는 내부 Docker 관리 영역에 있습니다.
바인드 마운트는 호스트 시스템의 경로를 컨테이너의 경로에 연결합니다. 이를 통해 호스트 시스템의 파일이나 디렉토리를 컨테이너 내에서 직접 사용할 수 있습니다.
host <-> container
호스트와 컨테이너 간의 파일 공유
docker run -v $(pwd):/app image
현재 호스트 내에서 있는 dir (pwd)를 컨테이너의 app dir에 마운트합니다.
-> 실시간 파일 공유