배경
Docker 볼륨은 도커 컨테이너를 시작할 때 이미지 내 원본 파일을 덮어쓰기 위해 일부 파일(예: 구성 파일)을 동적으로 마운트할 수 있게 해주지만, 호스트에 아직 존재하지 않는 폴더나 파일을 컨테이너에 마운트하면 어떻게 되나요? LZ는 자신의 작업 중 이러한 문제를 겪었기에 직접 연습하고 실험 결과를 다음과 같이 기록했습니다:
폴더 마운트
Docker의 폴더 마운트 동작은 다음과 같이 일관적입니다:
- 만약 폴더가 존재하지 않는다면, 폴더가 먼저 생성됩니다(또는 다단계 폴더일 경우 재귀적으로 생성됩니다)
- 컨테이너 내 폴더 내용을 호스트의 폴더 내용으로 덮어쓰세요
자세한 내용은 다음과 같습니다:
호스트의 폴더는 존재하며 비어 있지 않습니다
호스트 | 컨테이너 | 마운트 결과 | | 비어 있지 않은 폴더 A가 존재합니다. | 존재하지 않는 폴더 B | 먼저 Contanier에 폴더 B를 만들고, 그 다음 폴더 A에 있는 모든 파일을 복사해서 B로 옮깁니다 | | 비어 있지 않은 폴더 A가 존재합니다. | 비어 있지 않은 폴더 B가 존재합니다. | 먼저, 컨테이너 중국어 폴더 B의 원본 내용을 비우고, 그 다음 A 중국어 복사본을 B로 복사하세요 |
컨테이너 내 폴더 B가 존재하든 없든, A는 B의 내용을 완전히 덮어씁니다
호스트에 있는 폴더는 존재하지만 비어 있습니다
호스트 | 컨테이너 | 마운트 결과 | | 존재하는 빈 폴더 A | 비어 있지 않은 폴더 B가 존재합니다. | 컨테이너 중국어 폴더 B 안의 내용물이 비워졌습니다 |
컨테이너 내 해당 폴더의 내용물이 비워집니다
호스트 폴더는 존재하지 않습니다
호스트 | 컨테이너 | 마운트 결과 | | 존재하지 않는 폴더 A | 비어 있지 않은 폴더 B가 존재합니다. | 호스트에서 폴더 A를 생성하면 컨테이너 중국어 폴더 B의 내용물이 비워집니다 | | 존재하지 않는 폴더 A/B/C | 비어 있지 않은 폴더 B가 존재합니다. | 호스트에서 A/B/C 폴더를 만들고, 컨테이너 중국어 폴더 B의 내용은 비워집니다 |
컨테이너 내 해당 폴더의 내용물이 비워집니다
요약
호스트 폴더는 컨테이너 중국어 폴더를 확실히 덮어씁니다:
호스트 | 컨테이너 | 마운트 결과 | | 폴더가 존재하지 않음/폴더가 존재하지만 비어 있습니다 | 폴더는 존재하지 않고/존재하지만, 비어 있거나 비어 있지 않습니다 | 용기 중국산 조각 덮개(비워짐) | | 폴더는 존재하며 비어 있지 않습니다 | 폴더는 존재하지 않고/존재하지만, 비어 있거나 비어 있지 않습니다 | 컨테이너 중국어 폴더 내용이 덮어쓰여집니다(원래 내용은 비워지고, 호스트의 폴더 내용도 덮어쓰입니다) |
파일 마운트
파일 마운트와 폴더 마운트의 가장 큰 차이점은 다음과 같습니다:
- 도커는 호스트에 존재하지 않는 파일을 컨테이너에 이미 존재하는 파일에 마운트하는 것을 금지합니다
- 파일 마운트는 같은 폴더 내 다른 파일에는 영향을 미치지 않습니다
또한, 덮어쓰기 동작은 폴더 마운트와 일치합니다. 즉:
- 컨테이너 내 파일 내용을 호스트의 파일 내용으로 덮어쓰세요
자세한 내용은 다음과 같습니다:
호스트
호스트 | 컨테이너 | 마운트 결과 | | 존재하지 않는 파일들configA.js | 이미 존재하는 문서들congfigB.js | 오류, 디렉터리를 파일에 마운트하려는 건가요? 지정된 호스트 경로가 존재하는지, 그리고 예상 타입인지 확인하세요. 호스트에서 동시에 두 개의 빈 configB.js configA.js디렉터리를 생성하지만, 컨테이너는 시작되지 않습니다 |
호스트
호스트 | 컨테이너 | 마운트 결과 | | 파일 configA.js | 현재 파일 congfigB.js | 컨테이너 중국어 항목은 동일하게 유지되configB.js, 파일 내용은 congfigA.js 내용에 의해 덮어쓰여집니다 | | 파일 configA.js | 존재하지 않는 파일들congfigB.js | configA.js 파일의 내용이 담긴 컨테이너에 새로 configB.js 파일은 그 파일 내 다른 모든 파일configB.js 변경되지 않습니다 |
요약
호스트의 파일은 항상 컨테이너 중국어 폴더를 덮어씁니다
호스트 | 컨테이너 | 마운트 결과 | | 존재하지 않는 파일 | 이미 존재하는 문서 | 금지된 행위 | | 존재하는 문서 | 존재하지 않는 파일 / 이미 존재하는 파일 | 추가/덮어쓰기 (존재하지 않는 디렉터리를 생성) |
결론
폴더 마운트
- 존재하지 않는 폴더나 빈 폴더를 컨테이너에 마운트하면, 해당 폴더들도 비워집니다
- 비어 있지 않은 폴더를 컨테이너에 붙이면 컨테이너 내 원래 폴더가 덮어쓰여집니다
파일 마운트
- 컨테이너에 이미 존재하는 파일에 존재하지 않는 파일을 마운트하는 것은 금지되어 있습니다
- 기존 파일은 컨테이너에 부착될 때 덮어쓰어지며, 파일이 존재하지 않으면 생성됩니다
응용 시나리오
- 위 분석에서 알 수 있듯이, 폴더 마운트는 전체 폴더의 파일을 덮어쓰는 데 사용되며, 많은 파일을 컨테이너에 마운트해야 할 때 사용할 수 있습니다. 또한, 빈 폴더나 존재하지 않는 폴더가 마운트될 경우, 일반적으로 반대로 사용됩니다. 즉, 컨테이너가 시작된 후 일부 파일(예: 로그)이 컨테이너 내 마운트 지점의 폴더 아래에 생성되고, 이 시점에서는 해당 호스트의 폴더에서 직접 볼 수 있습니다.
- 파일 마운트는 종종 구성 파일을 마운트하여 실행 시 기본 구성을 동적으로 수정하는 데 사용되는데, 이는 컨테이너 내 같은 폴더 내 다른 파일에는 영향을 주지 않고 단일 파일만 덮어쓰기 때문입니다.
전근 출처:하이퍼링크 로그인이 보입니다.
(끝) |