docker
에서 사용하는 Data를 Host 내에 저장하기 위한 세가지 방법이 있다
1. Volumes: Host 파일 시스템 내의 특정영역(/var/lib/docker/volumes)을 도커가 관리 및 사용한다 (도커가 아닌 다른 프로세스는 영역 접근이 불가능하고 도커에서 가장 추천하는 방식)
2. Bind Mount: Host 파일시스템 자체를 사용하여 중요 시스템 파일이나 디렉토리에도 접근이 가능하며 Host와 컨테이너가 설정 파일을 공유하거나 Host에서 개발하고 컨테이너로 배포 하는것
cp 명령어는 컨테이너가 실행되어있어야하고 로컬에서 수정한것이 컨테이너로 바로 반영이 되지 않기 때문에 계속 cp로 넘겨주고 받는 작업이 수반되어 그렇게 효율적이지 못했다.
그래서 volume 이라는 것을 잠깐 언급했었는데 이번에는 volume에대해서 작성을 해보려한다
컨테이너 -> 컨테이너로 넘기는 것도 가능하고 따로 수정을 해주지 않아도 바로 동기화가 되어서 사용하기 편한 기능이다.
도커가 관리하는 volume
docker volume ls
로 현재 만들어져 있는 볼륨을 확인 할 수 있다
docker volume create <volume_name>
을 이용하여 volume을 생성할 수 있음
도커가 관리하는 볼륨이기때문에 일반 로컬에서 설정해야하는 파일을 인식하는 것이 아닌 /var/lib/docker/volumes/test/_data
이 경로에 파일을 만들어줘야 인식을 해서 파일을 공유 할 수 있다 파일 공유를 확인하기 위해서 alpine
을 실행 시켜 확인을 해보겠다
docker run -itd -v test:/html/ --name a1 alpine
컨테이너를 만들때 -v
옵션으로 경로를 지정해줘야하는데 만약 경로에 설정한 파일 이름이 없다면 자동으로 생성을 해준다
docker exec a1 ls -al /
명령어로 한번에 확인이 가능하다 /
디렉토리에 html
디렉토리가 자동으로 잘 만들어진 모습을 확인 할 수 있다
그렇다면 로컬에서 파일을 만들어도 잘 이동을 하는지 확인을 해보겠습니다
로컬에서 touch /var/lib/docker/volumes/test/_data/index.html
을 하여 확인을 해도 잘 들어가 있는 모습이다
로컬에서 내용을 추가하고 a1에서 확인했을때도 이상 없이 잘 확인된 모습이다
만약 컨테이너로 데이터베이스를 구축하고 컨테이너를 삭제를 해야하는 상황이 온다고해도 볼륨으로 연결이 되어있다면 로컬쪽에 데이터베이스의 데이터가 남아있어서 따로 백업해둘 필요없이 다른 데이터베이스를 만들어 볼륨을 연결하면 다시 사용이 가능하다는 아주 큰 장점이 있다
컨테이너에서 파일을 생성해서 로컬로 가져오는 방법
아까 생성해두었던 volume을 삭제하기 위해선 docker volume rm <volume_name>
을 사용하여 삭제해 주면 되는데 볼륨이 사용되고 있는 컨테이너를 먼저 없애주고 볼륨을 없애줘야 한다는점 주의 해야한다
위 사진에서 보면 볼륨이 존재하지 않는 것을 확인 할 수 있고 이번에는 컨테이너에서 파일을 생성하여 로컬로 가져올것이다
아까 이야기 했듯 디렉터리가 없으면 자동으로 생성을 해주는데 이것도 같이 확인을 해 볼것이다
이전에 존재하지 않았던 볼륨이 컨테이너를 실행시켜줌과 동시에 -v
옵션을 지정하여 생성을 해주었고, 볼륨을 확인한 결과 자동으로 생성된 것을 확인 할 수 있다
exec
명령어를 통해서 접속을 하여 컨테이너에서 파일을 생성하고 로컬에서 확인했을때도 정상적으로 잘 작동되었다
Bind Mount (Host에서 개발하고 배포하는것)
Host에서 관리하는 볼륨은 상대경로를 써주는 것보다 절대경로로 써주는 것이 좋다
이전 파일들과 볼륨을 삭제하고 Host에서 관리하기 위해 최상위 디렉토리에 test
라는 디렉토리를 만들어 주고 여기서 관리하도록 진행 하겠습니다
docker run -itd -v /root/test:/html --name aaa1 alpine
이와 같이 컨테이너를 만들어 줄때 볼륨을 절대경로로 설정해 주면 Host에서 관리 할 수 있는 공유 디렉터리를 만들 수 있다
하지만 특이한 점이 있다면 docker volume ls
로 확인이 안된다는 것이다 왜냐하면 이것은 도커가 관리하는 공유 디렉터리가 아닌 호스트에서 관리하는 공유 디렉터리 이기때문이다
/html
공유 파일도 잘 생성되어있는 모습을 보실수 있습니다