0. 데이터 관리
도커 튜토리얼(링크)에서는 간단한 ToDo 애플리케이션*의 빌드, 업데이트, 공유를 직접 해보며 도커의 컨셉을 이해한다.
튜토리얼 Part 2-4를 수행하면서 작성한 ToDo 애플리케이션을 실행할 때마다 초기화된다. 튜토리얼 Part 5인 Persisting the DB(링크)에서는 데이터를 영구적으로 저장하는 두 가지 방법(Bind Mount, Volume)을 소개한다.
이미지는 여러 개의 레이어로 이루어져 있다. 기본적으로 이미지로 컨테이너를 실행해 파일을 생성하거나 삭제하면 새로운 레이어를 만들어 내용을 저장한다. 이 내용은 컨테이너와 함께 삭제된다(⭐컨테이너의 휘발성).
컨테이너가 삭제된다고 내부의 중요한 데이터까지 삭제되면 안 되므로 사용하는 두 가지의 대표적인 방법이 Bind Mount와 Volume이다(이 외에도 SFTP, AWS S3 등 다양한 방법 사용 가능).
* ToDo 애플리케이션은 Node.js 에서 동작한다. Node.js는 Javascript Framework로 기존에 Frontend에서 주로 활용되던 Javascript를 Backend에서도 사용할 수 있게 했다. 'JavaScript Everywhere!'이라는 비전 하에서 개발되었으며, 넷플릭스나 링크드인 등 다양한 유명 웹 서비스에서 활용된다.
마운트의 유형은 Bind Mount, Volume, Tmpfs Mount 등 다양하지만, 그에 관계없이 데이터는 컨테이너 내에서 동일하게 컨테이너 파일 시스템의 디렉터리 또는 개별 파일로 보인다.
1. Bind Mount
- Docker 초기부터 사용한 방식으로 볼륨에 비해 기능이 제한된다.
- 호스트 시스템의 파일 또는 디렉터리가 컨테이너에 마운트 된다. 파일 또는 디렉터리는 호스트 시스템의 전체 경로(절대 경로)로 참조된다.
- 파일 또는 디렉터리가 Docker 호스트에 존재하지 않는 경우 요청 시 생성된다.
- 성능이 뛰어나지만 특정 디렉터리 구조를 사용할 수 있는 호스트 시스템의 파일 시스템에 의존한다.
- 새 Docker 애플리케이션을 개발하는 경우 이름이 지정된 볼륨을 대신 사용하는 것이 좋다. Docker CLI 명령을 사용하여 바인드 마운트를 직접 관리할 수 없기 때문이다.
- 중요한 시스템 파일이나 디렉터리의 생성, 수정 또는 삭제를 포함하여 컨테이너에서 실행되는 프로세스를 통해 호스트 파일 시스템을 변경할 수 있다. 이는 보안에 영향을 미칠 수 있다.
↓사용 예시
# Choose the -v or --mount flag
# 신규 사용자는 --mount 구문을 사용해야한다.
# 기존 사용자는 -v 또는 --volume 구문에 더 익숙할 수 있지만 --mount를 사용하는 것이 좋다.
# -v
docker run -d \
-it \
--name devtest \
--mount type=bind,source="$(pwd)"/target,target=/app \
nginx:latest
# --mount
docker run -d \
-it \
--name devtest \
-v "$(pwd)"/target:/app \
nginx:latest
-v 및 --volume 플래그는 오랫동안 Docker의 일부 였으므로 동작을 변경할 수 없다.
-v 또는 --volume을 사용하여 Docker 호스트에 아직없는 파일 또는 디렉터리를 bind-mount하는 경우 -v가 엔드 포인트를 생성한다(항상 디렉토리로 생성).
--mount를 사용하여 Docker 호스트에 아직없는 파일 또는 디렉터리를 bind-mount하는 경우 Docker는 자동으로 생성하지 않지만 오류를 생성한다.
2. Volume
- Docker에 의해 만들어지고 관리된다. 'docker volume create' 명령을 사용하여 명시적으로 볼륨을 생성하거나 Docker가 컨테이너 또는 서비스 생성 중에 볼륨을 생성할 수 있다.
- 볼륨을 생성하면 Docker 호스트의 디렉터리 내에 저장된다. 볼륨을 컨테이너에 마운트 하면 이 디렉터리가 컨테이너에 마운트 된다. 이는 볼륨이 Docker에 의해 관리되고 호스트 머신의 핵심 기능과 격리된다는 점을 제외하면 바인드 마운트가 작동하는 방식과 유사하다.
- 주어진 볼륨을 여러 컨테이너에 동시에 마운트 할 수 있다. 실행 중인 컨테이너가 볼륨을 사용하지 않는 경우 볼륨은 Docker에서 계속 사용할 수 있으며 자동으로 제거되지 않는다. 'docker volume prune'를 사용하여 사용하지 않는 볼륨을 제거할 수 있다.
- 볼륨을 마운트 할 때 이름을 지정할 수도 있고, 지정하지 않을 수도 있다. 익명 볼륨(anonymous volume)은 컨테이너에 처음 마운트 될 때 명시적인 이름이 지정되지 않으므로 Docker는 지정된 Docker 호스트 내에서 고유함이 보장되는 임의의 이름을 부여한다. 이름 외에는 명명된 볼륨(named volume)과 익명 볼륨(anonymous volume)은 동일한 방식으로 작동한다.
↓사용 예시
# --mount
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
# -v
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
바인드 마운트와 달리 --mount 및 -v 플래그 모두에서 볼륨에 대한 모든 옵션을 사용할 수 있다. 서비스와 함께 볼륨을 사용하는 경우 --mount 만 지원된다.
3. Tmpfs Mount
- tmpfs 마운트는 호스트 시스템이나 컨테이너 내에서 데이터를 유지하지 않으려는 경우에 가장 적합하다. 이는 보안상의 이유이거나 애플리케이션이 많은 양의 비 영구 상태 데이터를 작성해야 할 때 컨테이너의 성능을 보호하기 위한 것일 수 있다.
- 한계
- 볼륨 및 바인드 마운트와 달리 컨테이너간에 tmpfs 마운트를 공유 할 수 없다.
- 이 기능은 Linux에서 Docker를 실행하는 경우에만 사용할 수 있다.
↓사용 예시
# --mount
docker run -d \
-it \
--name tmptest \
--mount type=tmpfs,destination=/app \
nginx:latest
# tmpfs
docker run -d \
-it \
--name tmptest \
--tmpfs /app \
nginx:latest
--tmpfs 플래그를 사용하면 구성 가능한 옵션을 지정할 수 없고, swarm 서비스와 함께 사용할 수 없다. 따라서 swarm 서비스를 사용할 때는 --mount를 사용해야합니다.
[참고]
- "Persis the DB", Docker Docs, https://docs.docker.com/get-started/05_persisting_data/
- "Use bind mounts", Docker Docs, https://docs.docker.com/storage/bind-mounts/
- "Use volumes.", Docer Docs, https://docs.docker.com/storage/volumes/
- "Use tmpfs mounts", Docker Docs, https://docs.docker.com/storage/tmpfs/
'DevOps > Docker' 카테고리의 다른 글
[도커]docker image rm vs docker rmi (0) | 2021.06.04 |
---|---|
[도커]헷갈리는 기본 명령어(create, start, run, stop, rm) (1) | 2021.06.02 |
[도커]네트워킹 (0) | 2021.06.02 |
[도커]명령어 모음 (0) | 2021.05.31 |
[도커]도커 이미지와 도커 컨테이너 (0) | 2021.04.16 |