- 도커 볼륨은 도커에서 스토리지를 다루는 단위로 컨테이너와 독립적으로 존재하며 별도의 생애주기를 갖는다.
- 퍼시스턴시가 필요한 유상태 애플리케이션을 컨테이너로 실행 시 필요하며 컨테이너 파일 시스템의 한 디렉터리로 사용할 수 있다.
- 나중에 애플리케이션을 업데이트하더라도 새로운 컨테이너에 다시 볼륨을 연결하면 데이터가 그대로 유지된다.
- 컨테이너에서 볼륨을 사용하는 방법은 두 가지다.
- 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
- 001: Dockerfile 스크립트의 정의에 따라 볼륨을 생성해 컨테이너에 연결한다.
-
002~008: 볼륨 ID와 해당 볼륨의 호스트 컴퓨터상 경로, 볼륨이 연결된 컨테이너 파일 시스템의 경로 등을 확인할 수 있다.
-
웹 브라우저에서
http://localhost:8010
에 접근해 보면 to-do 애플리케이션의 화면을 볼 수 있다. - 이 애플리케이션은 데이터를 /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
- 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
- 002: 새로운 볼륨 생성
- 003:
-v
플래그를 사용하여 컨테이너의 파일 시스템 경로 /data에 지정한 볼륨을 마운트 - 008:
-f
플래그를 사용하면 실행중인 컨테이너도 삭제 가능 - 010: 업데이트된 이미지로 새로운 컨테이너를 실행하고, 기존 볼륨을 같은 경로로 연결