728x90
- 빌드를 통해 만들어진 도커 이미지는 읽기 전용의 데이터이다.
- Dockerfile에 들어있는 명령 실행이 끝나면 이미지가 잠겨 닫히므로 이후에 무언가 변경을 하기 위해서는 새 이미지를 빌드해야 한다.
- 도커 이미지에서 다루는 데이터의 핵심은 읽기 전용이며, 새 이미지를 빌드하는 것 말고는 기존 이미지 속 데이터를 변경하는 것은 불가능하다는 점이다.
- 그런데, 이렇게만 보면 도커를 실무에서 사용하기 힘들어 보인다.
- 프로젝트를 수행하면 영구적으로 저장할 데이터가 필연적으로 발생하기 때문이다.
- 만약 위의 내용처럼 단순히 한 번 빌드한 데이터만 다루고 이후에 변경이 불가능하다면 도커를 실무에서 사용하기에는 한계가 있어 보인다.
- 다행히 도커에서 다루는 데이터는 이외에도 두 가지가 더 있다.
- 하나는 애플리케이션에서 사용하는 임시 데이터이다.
- 임시 데이터는 애플리케이션이 실행하는 동안 생성되는 데이터를 의미한다.
- 예를 들면 사용자가 웹사이트에 입력하는 입력 폼이 있다.
- 이 데이터는 실행 중인 컨테이너에서 처리하는데 코드의 변수에 저장하거나, 메모리나 데이터 베이스에 저장될 수 있다.
- 이러한 임시 데이터는 읽고 쓸 수 있으며 컨테이너가 종료되면 데이터가 사라지는 일시적인 데이터이다.
- 따라서 임시 데이터는 이미지가 아닌 컨테이너에 저장된다.
- 마지막으로 영구 애플리케이션 데이터가 있다.
- 이 데이터는 로컬 시스템에서 별도로 관리하기 때문에 영구적으로 지속되며, 실행 중인 컨테이너에서 로컬 시스템의 데이터를 가져오는 방식을 사용합니다.
- 데이터의 영구 지속이 가능하기 때문에 컨테이너가 중지되었다가 다시 실행되더라도 데이터를 그대로 사용할 수 있다.
- 도커에서는 이 기능을 볼륨(Volume)이라고 한다.
Volume(볼륨)
도커의 볼륨은 컨테이너와 호스트 시스템 간에 데이터를 유지하고 공유하는 방법을 제공한다. 볼륨을 사용하면 컨테이너의 수명 주기에서 데이터를 분리하여 컨테이너가 중지되거나 제거된 경우에도 데이터가 보존되도록 할 수 있다.
Anonymous Volume(익명 볼륨)
docker run -v /app/data ...
- docker run -p 3000:80 -d --rm -v /app --name feedback-app feedback-node:volumes
- -p :포트 설정
- -d : detach 모드
- —rm : 컨테이너 중단 시 컨테이너를 제거함
- -v /app : 익명볼륨이라 볼륨명 설정이 없고, /app은 컨테이너 내 경로임
- — name feedback-app : 컨테이너 이름 설정
- (feedback-node:volumes) : (사용이미지명:태그명)
- 컨테이너 생성 시에 이름을 만들지 않으면 익명 볼륨으로 생성된다.
- 이름이 없기 때문에 임의의 고유 식별자가 할당된다.
- 일반적으로 컨테이너 외부에서 공유하거나 액세스 할 필요가 없는 임시 또는 일회용 데이터에 사용된다.
- 컨테이너를 중단하면 볼륨 자체가 자동으로 삭제되지 않으므로 수동으로 볼륨을 정리해야 한다.
- docker volume rm <volumeName> 명령어로 개별 삭제 가능
- 단, —rm 플래그를 사용하여 실행된 컨테이너는 컨테이너 중단 시 볼륨도 함께 제거된다.
- —rm 플래그를 사용하지 않으면 볼륨이 제거되지 않으므로 제거되지 않은 볼륨의 아이디를 docker run -v 플래그에 붙여 다른 컨테이너에서 사용 가능하긴 하다.
- 컨테이너를 제거하면 익명 볼륨도 함께 제거된다.
- 이 때문에 익명 볼륨을 사용하여 컨테이너 간에 데이터를 공유할 수 없다.
- 데이터를 저장하는 용도로 사용하기 부적합하다.
- 컨테이너에 이미 존재하는 특정 데이터를 잠그는데 유용하다.
- 다른 모듈에 의해 특정 데이터가 덮어 쓰이는 것을 막을 수 있다.
- 혹은 컨테이너 안에 고의적으로 만든 temp와 같은 임시 폴더를 다루는 용도로 사용할 수 있다.
Named Volume(명명된 볼륨)
docker run -v <볼륨이름>:/도커 컨테이너 내/경로/
- docker run -p 3000:80 -d --rm -v feed:/app --name feedback-app feedback-node:volumes
- -v feed:/app : (볼륨명):컨테이너 내 경로
- 명령어 설명 위 참고
- 컨테이너 생성 시에 이름을 만들어 생성한다.
- 이름이 있기 때문에 볼륨을 참조하거나 관리하기 쉽다.
- 특정 컨테이너에 연결되어있지 않기 때문에 컨테이너를 중단하거나 제거해도 볼륨 자체가 자동으로 삭제되지 않으므로 수동으로 볼륨을 정리해야 한다.
- docker volume rm <volumeName> 명령어로 개별 삭제가 가능하다.
- 익명 볼륨과는 달리 —rm 플래그를 넣고 컨테이너를 중단시켜도 볼륨은 삭제되지 않는다.
- 때문에 여러 컨테이너 간에 데이터 공유가 수월하다.
- 다수의 컨테이너에 동일하게 명명된 볼륨 하나를 마운트 할 수 있다.
- 컨테이너의 종료 및 제거 전반에 걸쳐 데이터를 저장하는 데 사용할 수 있다.
Bind Mount
도커의 바인드 마운트는 호스트 시스템에서 도커 컨테이너로 파일 또는 디렉터리를 직접 마운트 할 수 있는 기능이다. 바인드 마운트를 사용하면 호스트의 지정된 파일 또는 디렉터리가 컨테이너 내의 특정 위치에 매핑된다. 이를 통해 컨테이너의 바인드 마운트 파일 또는 디렉터리에 대한 변경 사항이 호스트에 즉시 반영되고 그 반대의 경우도 마찬가지인 양방향 액세스가 가능하다.
docker run -v /호스트/머신 내/경로:/도커 컨테이너 내/경로
- 호스트 머신의 어느 경로에 데이터가 저장할 것인지 사용자가 직접 정할 수 있다.
- 다수의 컨테이너에 연결할 수 있고, 컨테이너를 종료하거나 제거해도 데이터는 유지된다.
- 도커에 의해 관리되는 볼륨이 아니기 때문에 도커 명령으로 데이터를 삭제할 수 없다.
- 삭제하려면 호스트 머신(로컬)에서 지워야 한다.
읽기 전용 볼륨
-v “/호스트/머신/내부/경로:도커/컨테이너/내부/경로:ro”
볼륨 명령어에서 도커 컨테이너 내부 경로 뒤에 콜론을 추가하고 read only를 뜻하는 ‘ro’를 추가하면 해당 볼륨을 읽기 전용으로 변경할 수 있다. 이를 통해 도커가 해당 폴더와 그 하위 폴더에 쓸 수 없게 강제한다.
참고
chatGPT
Udemy - Docker & Kubernetes : 실전가이드
728x90
'[DevOps] > Docker' 카테고리의 다른 글
Docker로 다중 컨테이너 애플리케이션 구축하기 - 1 (여러 개의 컨테이너 만들기) (0) | 2023.07.07 |
---|---|
Docker - 컨테이너 통신 (0) | 2023.07.05 |
도커 이미지에 대해 자세히 살펴보기(dangling image, image inspect) (0) | 2023.06.21 |
도커 이미지 & 컨테이너 삭제 명령어 정리 (0) | 2023.06.21 |
도커 컨테이너와 상호작용할 수 있는 Interactive Mode에 대해 알아보기 (0) | 2023.06.16 |