도커는 모든 컨테이너를 격리하기 때문에 컨테이너 삭제시 컨테이너 내부에서 변경된 데이터는 저장되지 않고 사라진다.
데이터를 유지하기 위해서는 볼륨(volume)을 사용해야 한다.
도커 볼륨에는 두 가지 종류가 있다.
- Volume Mount (Docker가 관리)
- Bind Mount (호스트 디렉토리를 직접 마운트)
volume mount는 docker에서 관리하기 때문에 volume을 생성하면 docker 측에서 자체 생성한 디렉토리에 데이터가 저장되지만 bind mount는 직접 마운트하기 위한 host 디렉토리를 지정한다.
Volume Mount
1. 볼륨 생성
$ docker volume create todo-db
2. 생성한 볼륨을 연결해 컨테이너 실행
$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
볼륨 이름이 todo-db 이고, 컨테이너 내부의 /etc/todos 디렉토리에 볼륨을 연결한다.
3. 컨테이너 종료 후 다시 실행
$ docker stop <container-id>
4. 수행 결과
컨테이너 종료 후 재실행 시 이전에 생성해둔 볼륨과 자동으로 연결되어 이전의 데이터가 로드되는 것을 확인할 수 있다.
<명령어 분석/>
1. docker run :
Docker 컨테이너를 생성하고 실행하는 명령어
2. d :
컨테이너를 백그라운드(detached mode)에서 실행
실행 후 터미널에 연결되지 않고 컨테이너가 계속 실행됨
3. p 127.0.0.1:3000:3000 :
포트 매핑을 설정
- 127.0.0.1: 컨테이너가 로컬 머신에서만 접근 가능하게 제한, 외부 네트워크에서 접근할 수 없음
- 3000:3000:
- 왼쪽 3000: 호스트 머신의 포트 번호
- 오른쪽 3000: 컨테이너 내부의 포트 번호. 호스트의 127.0.0.1:3000을 컨테이너의 3000 포트로 연결
4. -mount type=volume,src=todo-db,target=/etc/todos :
컨테이너에 데이터 볼륨을 마운트
이 볼륨이 이미 존재하면 해당 볼륨이 사용되고, 존재하지 않으면 Docker가 자체적으로 새로 생성
- type=volume : 마운트 유형이 볼륨임을 지정
- src=todo-db : 볼륨 이름을 todo-db로 설정
- target=/etc/todos : 컨테이너 내부의 /etc/todos 디렉토리에 볼륨을 연결하고, 이 디렉토리를 사용하여 데이터를 저장하거나 공유
5. getting-started :
실행할 Docker 이미지 이름
Docker는 getting-started 이미지를 로컬에서 찾고, 없으면 Docker Hub에서 다운로드
Bind Mount
1. docker에 공유할 host 디렉토리 추가
docker desktop > Settings > Resources > File Sharing에 공유할 디렉토리 'getting-started-app' 추가
2. 등록한 디렉토리로 이동 및 컨테이너 실행
$ docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
❗️ubuntu 이미지를 만든 적 없는데 어떻게 돌리지? --> 없는 이미지는 알아서 라이브러리에 있는지 확인 후 다운받아온다!
3. 컨테이너 내부 /src 디렉토리로 이동 후(target=/src로 설정했으므로) 파일 생성
$ cd src
$ touch myfile.txt
4. host 디렉토리에서도 myfile.txt가 추가됨을 확인
+ 소스코드를 Bind Mount하여 서비스 돌려보기
host PC에 있는 소스코드를 컨테이너에 mount하여 모든 dependency를 설치해 서비스를 돌릴 수 있다.
이 경우 nodemon을 사용해 host PC의 소스코드 변경사항을 컨테이너에 즉각 반영하도록 할 수 있다.
$ docker run -dp 127.0.0.1:3000:3000 \
-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
sh -c "yarn install && yarn run dev"
Volume Mount vs Bind Mount
비교 항목 | Volume Mount | Bind Mount |
관리 주체 | Docker가 관리 | 사용자가 직접 관리 |
데이터 저장 위치 | /var/lib/docker/volumes/... | 사용자가 지정한 호스트 경로 |
보안 | 비교적 안전 (도커가 제어) | 보안 위험 증가 (호스트 디렉토리 접근 가능) |
백업 및 이식성 | 쉽게 백업 및 이동 가능 | 호스트에 종속됨 |
성능 | 다소 낮음 (스토리지 드라이버 사용) | 빠름 (직접 파일 접근) |
사용 예시 | 데이터 영속성 유지, 컨테이너 간 공유 | 호스트의 특정 파일/디렉토리 활용 |
(Thanks to chatGPT)
'Cloud > Docker' 카테고리의 다른 글
[Docker] Multi-stage Build (0) | 2025.02.12 |
---|---|
[Docker] Node.js 경량 웹서버 컨테이너화 및 MySQL 연동 (0) | 2025.02.10 |
[Docker] Networking (0) | 2025.02.06 |
[Docker] 도커를 이용한 애플리케이션 컨테이너화 및 배포 과정 (0) | 2025.02.05 |