도커의 컨테이너 안에 생성되는 모든 파일들은 기본적으로 컨테이너의 쓰기 가능 레이어에 생성됩니다. 이로 인해 컨테이너에 생성되는 파일들은 다음과 같은 특징을 갖습니다.
데이터는 컨테이너가 지워지면 같이 지워지며 영속적이지 않습니다. 또한 다른 프로세스에서 데이터에 접근하기 어렵습니다.
쓰기 가능한 레이어는 도커 호스트 머신과 강하게 연관되어 있기 때문에 데이터를 다른 곳으로 옮기기 쉽지 않습니다.
쓰기 가능한 레이어는 파일 시스템을 관리할 스토리지 드라이버가 필요합니다. 스토리지 드라이버를 통해 추상화된 파일 시스템은 도커 호스트의 파일 시스템에 직접 작성하는 것에 비해 성능이 떨어집니다.
데이터베이스의 스토리지, 서비스의 로그 등 컨테이너가 사라지더라도 데이터를 보존해야 하는 상황이 있습니다. 기본적으로 컨테이너에 작성되는 파일은 영속적이지 않기 때문에 도커는 데이터를 영속적으로 보존하기 위한 두 가지 방법을 제공합니다.
또한 도커는 도커 호스트 머신의 메모리에 파일을 저장하는 방법을 지원합니다. 이 파일들은 영속적이지 않지만, 속도, 보안 등의 장점을 가지고 있습니다. 리눅스에서 실행되는 도커는 해당 방법을 tmpfs
마운트를 통해 지원합니다.
tmpfs
마운트어떤 마운트 타입을 선택하더라도 컨테이너는 모두를 같은 데이터로 보입니다. 하지만 마운트 타입마다 각각의 특징을 갖고 있습니다.
tmpfs
마운트는 도커 호스트의 메모리에만 저장되며, 호스트 시스템의 파일 시스템에는 절대 저장되지 않습니다.볼륨은 도커에 의해 생성되고 관리됩니다. docker volume create
명령을 통해 볼륨을 명시적으로 생성할 수도 있고 도커가 컨테이너 또는 서비스를 생성하면서 생성할 수도 있습니다.
볼륨이 생성되면 도커 호스트의 파일시스템에 저장되며, 볼륨을 컨테이너에 마운트하면 이 디렉토리가 컨테이너에 마운트 되게 됩니다. 이는 바인드 마운트와도 매우 비슷하지만 도커에 의해 관리되며 호스트 머신의 여러 다른 프로세스 및 기능에 독립적이라는 점이 다릅니다.
볼륨은 컨테이너에 마운트되어 사용되지만 컨테이너에 독립적입니다. 하나의 볼륨은 여러 컨테이너에 동시에 마운트될 수 있으며, 또한 어떤 컨테이너에 마운트되지 않더라도 도커에서 삭제되지 않습니다. 사용되지 않는 볼륨은 docker volume prune
을 통해 삭제할 수 있습니다.
볼륨은 언제나 이름이 있어야 합니다. 이 이름은 생성할 때 지정할 수도 있고, 지정하지 않는다면 컨테이너에 볼륨이 처음 마운트될 때 도커가 랜덤으로 생성해줍니다.
볼륨은 데이터를 원격 호스트 또는 클라우드에 저장하기 위한 볼륨 드라이버를 사용할 수도 있습니다.
바인드 마운트는 도커의 초창기부터 사용 가능했던 기능입니다. 바인드 마운트는 볼륨에 비해서는 제한적인 기능을 제공합니다. 바인드 마운트를 사용하면 호스트 머신의 파일 또는 디렉토리가 컨테이너에 마운트됩니다. 해당 파일 또는 디렉토리가 호스트에 존재하지 않는다면 직접 만들기 때문에 도커 호스트에 미리 존재할 필요는 없습니다.
⚠️ 바인드 마운트를 통해 민감한 데이터가 노출될 수 있습니다
바인드 마운트를 사용하는 사이드 이펙트 중 하나는 컨테이너 내부에서 실행중인 프로세스가 호스트의 파일 시스템을 변경할 수 있다는 것입니다. 중요한 파일 시스템이나 디렉토리를 생성하거나 접근할 수 있으며 이는 도커 호스트 머신의 다른 프로세스에 영향을 줄 수 있는 보안적으로 아주 영향이 큰 강력한 기능입니다.
tmpfs
mountstmpfs
마운트는 영속적이지 않습니다. 이는 컨테이너가 동작중인 동안 일시적인 상태를 저장하거나 민감한 정보를 저장하기 위해 사용할 수 있습니다. 실제로 Docker Swarm 서비스는 tmpfs
마운트를 통해 서비스의 시크릿을 컨테이너에 마운트합니다.
대부분의 경우 볼륨을 사용하는 것이 일반적이지만 바인드 마운트를 사용할 수 있는 경우가 종종 있습니다.
/etc/resolv.conf
를 각 컨테이너에 마운트합니다.target/
을 컨테이너에 마운트하면 프로젝트를 빌드할 때마다 컨테이너는 그 결과물에 바로 접근할 수 있습니다.tmpfs
mounts의 사용 예시tmpfs
마운트는 데이터를 호스트나 컨테이너 모두에 영속적으로 보관하고 싶지 않을 때 사용할 수 있는 최고의 방법입니다. 이는 보안상의 이유일 수도 있고 성능을 위한 이유일 수도 있습니다. 예를 들어 컨테이너의 응용프로그램이 아주 큰 영속적이지 않은 상태 데이터를 작성해야 하는 경우 tmpfs
마운트를 통해 성능을 보호할 수 있습니다.
비어있는 볼륨을 컨테이너에 마운트하는 경우, 그리고 마운트되는 경로에 이미 파일 또는 디렉토리가 이미 존재하는 경우, 컨테이너의 파일과 디렉토리가 볼륨으로 복사됩니다. 마찬가지로 컨테이너를 시작하고 아직 존재하지 않는 볼륨을 지정하면 빈 볼륨이 자동으로 생성됩니다. 이 방법을 통해 컨테이너에 필요한 데이터를 다른 컨테이너에서 복사해올 수 있습니다.
비어있지 않은 볼륨을 컨테이너에 마운트하는 경우, 또는 바인드 마운트를 하는 경우, 그리고 마운트되는 경로에 이미 파일 또는 디렉토리가 이미 존재하는 경우, 마운트되는 파일 또는 디렉토리가 존재하는 파일들을 가리게 됩니다. 이는 리눅스에서 /mnt
에 파일을 생성한 후 USB가 /mnt
에 마운트되는 경우와 완벽히 같습니다. 이미 존재하는 파일들은 USB가 마운트 해제될 때까지 가려진 상태로 있으며, 가려진 파일들은 삭제되거나 변경되지 않습니다. 또한 어떠한 방법으로도 접근할 수 없습니다.