도커는 기본적으로 컨테이너 내부에서 생성된 모든 파일은 writable container layer 에 저장되며, 다음과 같은 특징을 가집니다.
도커에는 컨테이너가 호스트 시스템에 파일을 저장할 수 있는 두 가지 옵션이 있습니다. 바로, volume과 bind mounts 입니다. 이 옵션들은 컨테이너가 중지된 이후에도 파일이 유지됩니다.
/var/lib/docker/volumes/~
과 같이 호스트 파일 시스템의 일부에 도커에서 관리하는 영역에 저장됩니다. Non-Docker 프로세스는 호스트 파일 시스템의 도커영역을 수정하지 않아야 한다.$ docker volume create {볼륨명}
$ docker volume ls
$ docker volume inspect {볼륨명}
$ docker volume rm {볼륨명}
$ docker volume prune
nginx:lastest이미지
로 test
라는 이름의 컨테이너의 /app/
에 myvol2
라는 볼륨을 마운트 시킬 경우
$ docker run -d -name test -v myvol2:/app nginx:latest
Bind mounts allow access to sensitive files
One side effect of using bind mounts, for better or for worse, is that you can change the host filesystem via processes running in a container, including creating, modifying, or deleting important system files or directories. This is a powerful ability which can have security implications, including impacting non-Docker processes on the host system.
test
컨테이너의 /app/
에 ${pwd}/target
라는 디렉터리를 마운트 하고자 할 경우
$ docker run -d -it --name test -v "${pwd}"/target:/app nginx:latest
컨테이너의 비어 있지 않은 디렉토리에 바인드 마운트하면 디렉토리의 기족 내용이 바인드 마운트에 의해 가려집니다.
컨테이너 /usr/
디렉토리의 내용을 /tmp/
호스트 시스템의 디렉토리로 대체 하는 경우 컨테이너가 생성은 되지만 시작되지 않습니다.
$ docker run -d -it --name test -v /tmp:/usr nginx:latest
docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH".
일반적인 경우 컨테이너가 바인드 마운트에 기록해야 하므로 변경사항이 Docker 호스트로 다시 전파됩니다. 하지만, 읽기 권한만 필요한 경우 ro
를 이용하여 읽기 전용 바인드 마운트로 마운트 할 수 있습니다.
$ docker run -d -it --name test -v "${pwd}"/target:/app:ro nginx:latest