Docker Volumn과 데이터 영속성
Container 데이터와 영속성 문제
Container 실행 중 생성되거나 변경된 데이터를 기본적으로 Container의 Writeable Layer에 저장됨.
, Container를 삭제하면 해당 Container의 Writeable Layer도 함께 제거 됨
=> DB 처럼 Container가 다시 생성되어도 유지되어야 하는 데이터는 Container 외부에 저장해야 함.
Volumn
개념
Container와 독립적으로 데이터를 저장하기 위한 관리형 Storage
명령어
| 명령어 | 역할 |
| docker volume ls | Volume 목록 확인 |
| docker volume create NAME | Volume 생성 |
| docker volume inspect NAME | Volume 상세 정보 확인 |
| docker volume rm NAME | Volume 삭제 |
실행]
-v Volume_Name:Container_Path
ex)
docker volume create mysql-data
# 실행
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
mysql
# MySQL이 /var/lib/mysql에 저장하는 데이터를 mysql-data Volumn에 보관.
Bind Mount
개념
Host의 특정 File이나 Directory를 Container 내부 경로에 직접 연결하는 방식
=> Host의 실제 File System을 Container에서 그대로 사용할 수 있게 함
ex)
Host
/home/user/project
│
│ Bind Mount
↓
Container
/usr/share/nginx/html
의의
일반적으로 Container 내부에서 생성하거나 수정한 데이터는 Container의 Writable Layer에 저장됨
하지만 개발 과정에는 Host에서 작성하는 Source Code를 Container에서도 바로 사용하고 싶은 경우가 많다.
=> Local 개발 환경에서 Souce Code를 Container에 연결할 때 자주 사용.
ex) PHP 개발환경에서 Host에서 코드를 수정할 때마다 Image를 Build하는 것은 비효율적,
Bind Mount를 사용하면 Host에서 수정한 파일을 Container가 바로 사용할 수 있음.
사용법
-v Host_Path:Container_Path
# 현재 디렉토리에 연결
-v "$(pwd)":/usr/share/nginx/html \
# mount 사용 (-v보다 길지만 의미가 명확)
--mount type=bind,source=/home/user/project,target=/usr/share/nginx/html \
# type=bind => Bind Mount 사용
# source => Host의 File/Directory
# target => Container에서 연결할 경로
ex)
docker run -d \
--name web \
-p 8080:80 \
-v /home/user/project:/usr/share/nginx/html \
nginx
docker run -d \
--name web \
-p 8080:80 \
-v "$(pwd)":/usr/share/nginx/html \
nginx
docker run -d \
--name web \
--mount type=bind,source=/home/user/project,target=/usr/share/nginx/html \
nginx
Read Only 설정
-v /home/user/project:/app:ro
--mount type=bind,source=/home/user/project,target=/app,readonly
주로 사용하는 경우
개발 환경에서 많이 사용 됨
ex) Souce Code 연결
Host
Project Source
│
↓
Container
Application Runtime
=> HOST의 VS Code등에서 Source Code를 수정하면서,
Container 안에서 PHP, Node.js등의 Runtime을 실행할 수 있음.