[Docker] 도커 파일 시스템과 볼륨
도커에서 관리되는 컨테이너들은 모두 독립된 파일 시스템을 가진다.
파일 시스템은 단일 디스크이고, 이 디스크는 이미지 레이어와 기록 가능 레이어로 구성된다.
여기서 이미지 레이어는 모든 컨테이너가 공유하지만, 기록 가능 레이어는 컨테이너마다 다르다.
같은 데이터베이스 엔진 이미지로 실행된 두 컨테이너가 전혀 다른 데이터를 담을 수 있는 이유도 바로 이 부분 때문이다.
기록 가능 레이어는 컨테이너와 같은 생애주기를 가지고, 컨테이너가 삭제될 때 함께 삭제되는 방식으로 동작한다.
이미지 레이어를 기록 가능 레이어로 복사한 후 이미지 레이어를 수정하는 방식을 사용하면 읽기 전용인 이미지 레이어도 수정할 수 있다.
컨테이너로 데이터베이스를 실행해서 사용하고 있는데, 데이터베이스 버전을 업데이트한다고 생각해보자. 그럼 모든 데이터가 사라지는데..
컨테이너의 파일 시스템이 이미지 레이어와 기록 가능 레이어로만 구성된다면 컨테이너를 삭제 시 데이터를 보존할 수 없다.
도커 볼륨과 도커 마운트를 사용해 이를 방지할 수 있다.
볼륨은 스토리지를 다루는 단위이다.
컨테이너와 독립적으로 존재하고, 별도의 생애주기를 가지지만 컨테이너에 연결할 수 있다. (USB와 비슷하다)
볼륨을 사용해 컨테이너와 스토리지의 생애주기를 분리하면서도 스토리지를 다룰 수 있다.
볼륨 데이터는 호스트의 특정 경로에 저장되지만 그 경로는 도커가 관리한다.
도커가 관리한다는건 컨테이너를 실행할 때 해당 볼륨이 없으면 도커가 호스트의 어딘가에 위치를 만든다는걸 의미한다.
FROM node
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
VOLUME [ "/app/datastore" ]
CMD ["node", "server.js"]
이렇게 Dockerfile을 작성하고 컨테이너를 실행시키면 익명 볼륨이 호스트에 생성되고, 컨테이너 내부의 /app/datastore 경로와 매핑된다.
익명 볼륨은 컨테이너가 삭제될 때 삭제되지는 않지만.. 식별할 수 있는 값이 없으니 지속적으로 데이터를 저장하기는 힘들다. (--rm 옵션을 붙여서 실행했다면 볼륨도 삭제된다)
따라서
docker run -d -p 3000:80 --rm --name app1 -v volumnApp:/app/datastore imageName
-v 사용할 볼륨 이름: 컨테이너 내부의 경로 명령어로 볼륨의 이름을 직접 지정해 주고 사용하자.
볼륨은 호스트에 저장되지만, 도커가 관리하기에 사용자가 경로로 직접 접근할 필요는 없다.
docker volumn ls 로 볼륨 목록을 살펴볼 수 있고, 이미지에서 사용하던 inspect 명령어로 상세 정보를 확인할 수 있으니 참고하자.
바인드 마운트도 스토리지를 다룬다는 측면에서는 볼륨과 유사하지만, 스토리지를 컨테이너에 좀 더 직접적으로 연결하는 수단이다.
바인드 마운트는 호스트 컴퓨터 파일 시스템의 디렉토리를 컨테이너 파일 시스템의 디렉토리로 만든다.
호스트 시스템이 지정한 경로를 컨테이너에 직접 마운트하는 방법으로, 볼륨과는 다르게 사용자가 직접 경로를 다룬다.
docker run -v /path/to/myapp:/app -p 80:80 myimage
호스트의 /path/to/myapp 디렉토리를 컨테이너 내부의 /app 디렉토리에 마운트하고, 호스트 시스템의 코드를 변경할 때 마다 /app 디렉토리의 코드도 실시간으로 변경한다.
개발 환경에서 소스코드를 반영할 때 사용한다.
바인드 마운트로 호스트의 소스코드를 컨테이너에서 사용하는데, 컨테이너 내부의 특정 파일은 호스트의 파일으로 대체학고 싶지 않은 경우 익명 볼륨을 사용해서 덮어쓰기를 막을 수 있다. (node_modules 같은 빌드 파일에서 사용한다)
바인드 마운트는 도커 환경에서 개발할 때 사용하고, 도커 환경에서 배포할 때는 COPY 명령어로 소스코드를 이미지에 복사한 후 사용하자.
컨테이너의 파일 시스템을 정리하면 아래와 같다.
1. 기록 가능 레이어 : 컨테이너와 같은 생애 주기를 가진다. (컨테이너가 정지되도 사라지지 않고, 삭제됐을 때 사라진다)
2. 로컬 바인드 마운트 : 호스트 컴퓨터와 컨테이너 간 데이터를 공유한다. (양방향)
3. 분산 바인드 마운트 : 네트워크 스토리지와 컨테이너 간 데이터를 공유한다.
4, 볼륨 마운트 : USB를 생각하면 이해하기 쉽다. 컨테이너와 도커 객체인 볼륨 간 데이터를 공유한다.
5. 이미지 레이어 : 컨테이너의 초기 파일 시스템을 구성한다.
'DevOps > Docker && Kubernetes' 카테고리의 다른 글
[Docker] Dockerfile 프로젝트 배포하기 (2) | 2023.12.06 |
---|---|
[Docker] Docker Compose (0) | 2023.03.24 |
[Docker] 도커 활용하기 (0) | 2023.03.08 |
[Docker] 도커와 컨테이너 기술 (0) | 2023.03.07 |
[Docker] 시스템 기초 지식 (0) | 2023.03.06 |
댓글
이 글 공유하기
다른 글
-
[Docker] Dockerfile 프로젝트 배포하기
[Docker] Dockerfile 프로젝트 배포하기
2023.12.06 -
[Docker] Docker Compose
[Docker] Docker Compose
2023.03.24 -
[Docker] 도커 활용하기
[Docker] 도커 활용하기
2023.03.08 -
[Docker] 도커와 컨테이너 기술
[Docker] 도커와 컨테이너 기술
2023.03.07