6.2.도커 볼륨을 사용하는 컨테이너 실행하기

  • 도커 볼륨은 도커에서 스토리지를 다루는 단위로 컨테이너와 독립적으로 존재하며 별도의 생애주기를 갖는다.
  • 퍼시스턴시가 필요한 유상태 애플리케이션을 컨테이너로 실행 시 필요하며 컨테이너 파일 시스템의 한 디렉터리로 사용할 수 있다.
  • 나중에 애플리케이션을 업데이트하더라도 새로운 컨테이너에 다시 볼륨을 연결하면 데이터가 그대로 유지된다.
  • 컨테이너에서 볼륨을 사용하는 방법은 두 가지다.
  • Dockerfile 스크립트에서 VOLUME 인스트럭션을 사용, 자동으로 볼륨을 생성하여 연결
  • 수동으로 직접 볼륨을 생성해 컨테이너에 연결

Dockerfile 스크립트에서 VOLUME 인스트럭션을 사용, 자동으로 볼륨을 생성하여 연결

# Dockerfile 일부

FROM diamol/dotnet-aspnet
WORKDIR /app
ENTRYPOINT ["dotnet", "ToDoList.dll"]

VOLUME /data
COPY --from=builder /out/ .
  • 실행된 컨테이너에는 /data 디렉터리가 있다(윈도 컨테이너라면 C:\data).
  • 이 디렉터리의 파일은 볼륨에 영구적으로 저장되어 컨테이너가 삭제되어도 남는다.
001)  docker container run --name todo1 -dp 8010:80 diamol/ch06-todo-list
002)  docker container inspect --format '{{.Mounts}}' todo1
003) [{ 
004)   volume fd55f248775868e604fa2533b6e01495fc0de6daa3383390650f74c77efca9dd 
005)     /var/lib/docker/volumes/fd55f248775868e604fa2533b6e01495fc0de6daa3383390650f74c77efca9dd/_data 
006)     /data
007)     local  true 
008) }]
009)  docker volume ls
010) DRIVER    VOLUME NAME
011) local     fd55f248775868e604fa2533b6e01495fc0de6daa3383390650f74c77efca9dd
  1. 001: Dockerfile 스크립트의 정의에 따라 볼륨을 생성해 컨테이너에 연결한다.
  2. 002~008: 볼륨 ID와 해당 볼륨의 호스트 컴퓨터상 경로, 볼륨이 연결된 컨테이너 파일 시스템의 경로 등을 확인할 수 있다.

  3. 웹 브라우저에서 http://localhost:8010에 접근해 보면 to-do 애플리케이션의 화면을 볼 수 있다.

  4. 이 애플리케이션은 데이터를 /data 디렉터리에 저장하는데, 웹 페이지에서 '할 일(to-do)'을 하나 추가하면 이 데이터는 도커 볼륨에 저장된다.

다른 컨테이너에서 사용 중인 볼륨 사용

001)  docker container run -d --name t3 --volumes-from todo1 diamol/ch06-todo-list
002)  docker container exec t3 ls /data
003) todo-list.db
  1. 001: todo1 컨테이너의 볼륨을 공유

주의사항 * 볼륨은 이미지에서 정의하는 것보다는 명시적으로 관리하는 편이 더 낫다. * 컨테이너 자신만 접근해야 할 파일에 다른 컨테이너가 동시에 접근하여 애플리케이션이 비정상적으로 동작할 수도 있다. * 볼륨은 컨테이너 간 파일 공유보다는 업데이트 간 상태를 보존하기 위한 용도로 사용 해야 한다.

수동으로 직접 볼륨을 생성해 컨테이너에 연결

001)  target='/data'
002)  docker volume create todo-list
003)  docker container run -dp 8011:80 -v todo-list:$target --name todo-v1 diamol/ch06-todo-list
004) 
005) # localhost:8011에 접근하여 todo 추가
006) ...
007) 
008)  docker container rm -f todo-v1
009)  
010)  docker container run -dp 8011:80 -v todo-list:$target --name todo-v2 diamol/ch06-todo-list:v2
  1. 002: 새로운 볼륨 생성
  2. 003: -v 플래그를 사용하여 컨테이너의 파일 시스템 경로 /data에 지정한 볼륨을 마운트
  3. 008: -f 플래그를 사용하면 실행중인 컨테이너도 삭제 가능
  4. 010: 업데이트된 이미지로 새로운 컨테이너를 실행하고, 기존 볼륨을 같은 경로로 연결

links

social