Jay's Cookbook
Menu
  • Tags
  • Categories
  • Projects
Computer Science
OS
Network
Data Structure
Algorithm
Language
Code Architecture
Python
Javascript
Typescript
Java
Backend
Backend Theory
TypeORM
Node.js
NestJS
FastAPI
Frontend
HTML/CSS
React
Next.js
Data Engineering
DE Theory
MySQL
MongoDB
Elastic
Redis
Kafka
Spark
Airflow
AI
Basic
Pytorch
NLP
Computer Vision
Data Analytics
Statistics
Pandas
Matplotlib
DevOps
Git
Docker
Kubernetes
AWS
[Docker] 퍼시스턴시한 어플리케이션 만들기
devops
docker

[Docker] 퍼시스턴시한 어플리케이션 만들기

Jay Kim
Jay Kim 08 Feb 2024
[Docker] 컨테이너에 저장된 데이터는 어떻게 될까? [Docker] 네트워크 이해하기

Table of Contents

  • 도커에서 데이터 관리하기
  • Volume
    • 실습
      • 볼륨 생성
        • Dockerfile VOLUME 인스트럭션
        • docker volume 명령어
        • docker compose
      • 볼륨 삭제
      • 볼륨 확인
      • 볼륨 마운트
  • Bind Mount
    • 실습
  • 참고

도커에서 데이터 관리하기

  • 기본적으로 컨테이너 안에서 생성된 모든 파일은 컨테이너 레이어에 저장된다
  • 그래서, 해당 컨테이너가 삭제되면 데이터도 함께 사라진다 (컨테이너 종료는 데이터를 삭제하지 않는다)
  • 따라서 컨테이너의 생명 주기와 관계없이 데이터를 영구적으로 저장하기 위한 방법이 필요하다
  • 또한 여러 컨테이너가 데이터를 공유할 수 있으면 데이터를 컨테이너별로 중복 저장할 필요가 없어 컨테이너를 더욱 효율적으로 관리할 수 있게 될 것이다
  • 이러한 이유로 도커는 영구적인 요소와의 마운트를 다음의 두 가지 방법으로 제공한다
    • 볼륨(volume)
    • 바인드(bind)

Volume

  • 도커 볼륨은 도커에서 스토리지를 다루는 단위다
  • 데이터베이스처럼 영구성이 필요한 애플리케이션을 컨테이너로 실행하려면 볼륨을 사용해야 한다
  • 볼륨을 사용하면 컨테이너의 데이터가 호스트 컴퓨터 내에 있는 도커에 의해 관리되는 파일 시스템(Linux기준 /var/lib/docker/volumes/)에 데이터가 저장된다
  • 볼륨은 완전히 도커에 의해서만 관리되어 호스트 머신의 디렉토리 구조나 OS에 독립적인, 도커에서 데이터를 유지하기 위한 권장되는 메커니즘이다
  • 볼륨 드라이버를 사용해 클라우드 또는 리모트 호스트에 데이터를 저장할 수도 있다
볼륨을 사용하기 좋은 경우
  • 여러 컨테이너에 마운트하고 싶은 경우 (명시적으로 표현한 볼륨이 없으면 자동으로 생성하고 마운트 해준다)
  • 도커 호스트의 파일 구조를 모르는 경우 (bind mount와 달리 Volume은 볼륨 명으로 관리)
  • 백업, 데이터 통합이 필요한 경우

실습

볼륨 생성

  • 볼륨은 도커에서 이미지나 컨테이너와 동급인 요소다

Dockerfile VOLUME 인스트럭션

  • Dockerfile 의 VOLUME 인스트럭션으로 만들 수 있다
  • 하지만 이 방법은 볼륨명(source)을 지정할 수 없고, 컨테이너의 마운트 지점(target)만 지정할 수 있다
  • Dockerfile에서 VOLUME의 용도는 이미지가 데이터베이스 같은 유상태 애플리케이션의 경우 사용자가 볼륨을 지정하지 않더라도 데이터를 유실하지 않기 위한 안전장치 용도이다
  • 컨테이너를 실행할 때 볼륨을 새로 정의하면 VOLUME 은 무시된다

docker volume 명령어

  • docker volume 명령어를 사용해 볼륨을 만들고 확인하고 삭제할 수 있다
  • 볼륨은 docker volume create 명령어를 이용해 명시적으로 볼륨을 생성할 수 있다
# 볼륨 생성
docker volume create my-volume

# 볼륨 마운트
docker container run -v my-volume:/data <이미지명>

docker compose

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - my-volume:/data # 볼륨 마운트
volumes:
  my-volume: # 볼륨 생성

볼륨 삭제

  • 특정 볼륨을 삭제할 때는 docker volume rm <볼륨명> 명령어를 사용한다
  • 만약 사용하지 않는 불특정 볼륨들을 제거하고 싶다면 docker volume prune 명령어를 사용하면 된다

볼륨 확인

  • 특정 볼륨을 확인할 때는 docker volume inspect <볼륨명> 명렁어를 사용한다
  • 볼륨 목록을 확인할 때는 docker volume ls 명령어를 사용한다

볼륨 마운트

  • 볼륨(바인드 포함)을 마운트 할 때는 -v 옵션과 --mount 옵션 두 가지가 있다
  • -v는 기존에 있던 옵션이고, --mount는 이 후에 나온 좀 더 명시적인 옵션이다 (도커에서 --mount 옵션 권장)
  • 차이점은 -v는 콜론(:)으로 값들을 구분하고, --mount는 키-밸류 페어로 구분해 조금 더 명시적이다
  • 바인드 마운트의 경우 -v는 명시한 디렉터리가 존재하지 않으면 생성하고, --mount는 에러를 발생한다
-v <볼륨명>:<컨테이너 마운트 지점>:<옵션 ex. ro> # 볼륨 마운트
-v <호스트 디렉터리>:<컨테이너 마운트 지점>:<옵션 ex. ro> # 바인드 마운트

--mount type=volume, source=<볼륨명>, target=<컨테이너 마운트 지점>, readonly # 볼륨 마운트
--mount type=bind, source=<호스트 디렉터리>, target=<컨테이너 마운트 지점>, readonly # 바인드 마운트
docker volume inspect my-vol

[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

Bind Mount

  • 바인드 마운트는 호스트 컴퓨터 파일 시스템의 디렉터리를 컨테이너 파일 시스템의 디렉터리로 만든다
  • (볼륨은 볼륨명이라는 가상의 식별자를 사용하고, 바인드는 호스트 컴퓨터 파일 시스템의 절대 경로를 사용한다)
  • 바인드 마운트는 양방향으로 동작한다. 컨테이너에서 만든 파일을 호스트 컴퓨터에서 수정할 수도 있고, 반대로 호스트에서 만든 파일도 컨테이너에서 수정할 수 있다
  • 만약 컨테이너의 마운트 경로에 이미지에서 만들어뒀던 파일이 이미 존재하는 경우, 이 파일들은 완전히 대체된다 (볼륨, 바인드 모두)
  • 컨테이너에서 호스트 파일 시스템에 접근할 수 있다는 점 때문에 보안에 안좋은 영향을 끼칠 수 있다
바인드를 사용하기 좋은 경우
  • 컨테이너의 애플리케이션에 필요한 설정 파일을 호스트 컴퓨터에서 관리할 때 유용하다

실습

  • 바인드는 말그대로 호스트 컴퓨터의 경로와 바인드만 하면된다. 볼륨처럼 따로 생성할 필요 없다
-v <호스트 디렉터리>:<컨테이너 마운트 지점>:<옵션 ex. ro> # -v 옵션

--mount type=bind, source=<호스트 디렉터리>, target=<컨테이너 마운트 지점>, readonly # --mount 옵션 (권장방식)

참고

  • 도커 공식문서: Manage data in Docker
  • 도커 공식문서: Docker-compose volume configuration
  • DaleSeo: Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트)
  • stack overflow: Understanding “VOLUME” instruction in DockerFile
[Docker] 컨테이너에 저장된 데이터는 어떻게 될까? [Docker] 네트워크 이해하기

You may also like

See all docker
10 Feb 2024 [Docker]: 진화하는 컨테이너 표준
devops
docker

[Docker]: 진화하는 컨테이너 표준

09 Feb 2024 [Docker] 네트워크 이해하기
devops
docker

[Docker] 네트워크 이해하기

도커에서 외부와의 통신, 컨테이너 간 통신 방법에 대해 배운다

07 Feb 2024 [Docker] 컨테이너에 저장된 데이터는 어떻게 될까?
devops
docker

[Docker] 컨테이너에 저장된 데이터는 어떻게 될까?

도커 컨테이너의 파일 시스템 생성 원리에 대해 배운다

Jay Kim

Jay Kim

Web development, data engineering for human for the Earth. I share posts, free resources and inspiration.

Rest
Lifestyle
Hobby
Hobby
Hobby
Hobby
2025 © Jay's Cookbook. Crafted & Designed by Artem Sheludko.