모든 컨테이너는 독립된 파일 시스템을 갖는다. 같은 이미지에서 실행한 여러 개의 컨테이너는 처음에는 디스크의 내용이 모두 같지만, 그중 한 컨테이너에서 애플리케이션이 파일을 수정해도 다른 컨테이너나 이미지는 영향을 받지 않는다.

같은 이미지로부터 두 개의 컨테이너 실행. 위 이미지에 담긴 애플리케이션은 컨테이너 속 파일에 무작위 숫자를 쓰는기능

 

이 두 컨테이너는 같은 이미지로부터 실행됐으나 파일 시스템의 내용이 서로 다르다.

컨테이너를 종료해도 파일 시스템은 삭제되지 않기 때문에 컨테이너의 파일과 디렉터리는 그대로 남아 있을 것이다.

 

"docker container cp" 명령으로 컨테이너와 로컬 컴퓨터 간에 파일을 복사할 수 있다.

위 파일을 로컬 컴퓨터로 복사해서 내용을 확인했을 때, 두 파일이 서로 다른 것을 확인할 수 있다.

즉, 컨테이너의 파일 시스템이 서로 독립적임을 알 수 있다.


도커 볼륨을 통한 컨테이너 실행

도커 볼륨은 도커에서 스토리지를 다루는 단위이다. 볼륨은 컨테이너와는 독립적으로 존재하며 별도의 생명주기를 갖으며, 컨테이너에 연결이 가능하다. 퍼시스턴시가 필요한 stateful 애플리케이션을 컨테이너로 실행하려면 볼륨을 사용해야 한다. 볼륨을 생성해 애플리케이션 컨테이너에 연결하면 컨테이너 파일 시스템의 한 디렉터리가 되고 애플리케이션을 업데이트하더라도 새로운 컨테이너에 다시 볼륨을 연결하면 데이터가 그대로 유지된다.

 

컨테이너에서 볼륨을 사용하는 방법

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

2. Dockerfile 스크립트에서 VOLUME 인스트럭션 사용

-> 이 인스트럭션을 사용해 만든 이미지로 컨테이너를 실행하면 자동으로 볼륨을 생성

-> VOLUME 인스트럭션 문법은 VOLUME <target-directory> 형식

# 볼륨이 사용된 멀티 스테이지 빌드 Dockerfile 스크립트 일부
FROM diamol/dotnet-aspnet
WORKDIR /app
ENTRYPOINT ["dotnet", "ToDoList.dll"]

VOLUME /data
COPY --from=builder /out/ .

 

이 이미지로부터 컨테이너를 실행하면 자동으로 볼륨을 생성해 컨테이너에 연결해 준다. 실행된 컨테이너에는 /data 디렉터리가 있고 다른 디렉터리와 똑같이 사용할 수 있지만 이 디렉터리의 내용은 볼륨에 영구적으로 저장된다.

 

이후 웹 브라우저에서 http://localhost:8010에 접근하면 to-do 애플리케이션의 화면을 볼 수 있는데 웹에서 to-do 리스트를 추가하면 데이터는 도커 볼륨에 저장된다.

 

같은 데이터를 공유하는 to-do 애플리케이션 컨테이너 두 개를 만들 것이다.

위 코드에서 확인해봤을 때, 두 번째 컨테이너는 새로운 볼륨을 생성해 연결하기 때문에 /data 디렉터리가 비어 있지만, 세 번째 컨테이너는 첫 번째 컨테이너와 볼륨을 공유하므로 애플리케이션의 데이터를 세 번째 컨테이너의 디렉터리에서도 볼 수 있다.

 

하지만 볼륨은 컨테이너 간 파일 공유보다는 업데이트 간 상태를 보존하기 위한 용도로 사용해야 하며, 이미지에서 정의하는 것보다는 명시적으로 관리하는 것이 더 좋다. 그렇기때문에 볼륨에 이름을 붙여 생성하고 업데이트 시 다른 컨테이너로 옮겨 연결하면 된다.

# 복사 대상 경로를 환경 변수로 정의

# 볼륨을 연결해 v1 애플리케이션 실행

# v1 애플리케이션이 실행 중인 컨테이너 삭제

# 그 다음에는 같은 볼륨을 사용하도록 v2 애플리케이션 실행

 

<ref>

https://github.com/gilbutITbook

'DevOps > DOCKER' 카테고리의 다른 글

[Docker] 도커 컴포즈  (0) 2024.03.14
[Docker] 이미지 생성  (0) 2024.03.13
[Docker] 컨테이너를 이용해 웹 사이트 호스팅  (0) 2024.03.11

+ Recent posts