도커 컨테이너 파일 시스템의 생명 주기는 컨테이너의 생명 주기와 같습니다. 그렇기 때문에 컨테이너가 지워지면 컨테이너에서 기록한 데이터도 같이 지워지는데요. 이런 경우를 방지하기 위해 컨테이너의 데이터를 유지하고 관리할 수 있어야 합니다. 이런 기능을 제공하는 것이 대표적으로 2가지가 있는데 바로 volume과 bind mount입니다. 이번에는 volume과 bind mount에 대해서 정리하였습니다.
Docker volume
volume 생성하기
volume 명령어를 사용하여 직접적으로 volume을 생성하게 되면 /var/lib/docker/volumes/볼륨명으로 해당 볼륨의 디렉토리가 생성됩니다. 컨테이너는 해당 디렉토리를 컨테이너 경로로 마운트 하여 데이터를 읽고 쓰게 되면서 컨테이너가 기록하는 데이터를 유지할 수 있습니다.
$ docker volume create 볼륨명
volume 확인하기
생성된 volume을 `docker volume ls` 를 통하여 확인할 수 있습니다.
$ docker volume ls
volume 컨테이너에 마운트 하기
생성한 볼륨을 컨테이너에 마운트 합니다.
$ docker run 이미지명 --name 컨테이너명 -d -v <볼륨명>:<컨테이너 경로>
volume 삭제하기
`docker volume rm 볼륨명`을 통하여 볼륨을 삭제할 수 있는데 만약 해당 볼륨을 컨테이너가 사용 중이라면 해당 컨테이너부터 삭제하고 볼륨을 삭제해야 합니다.
$ docker volume rm 볼륨명
사용하지 않은 volume 전부 삭제하기
볼륨을 무작위로 생성하다 보면 사용하지 않는 볼륨들이 많이 존재하게 되는데 다음과 같은 명령어를 통하여 사용하지 않는 볼륨을 한 번에 삭제할 수 있습니다.
$ docker volume prune --all --force
dockerfile로 볼륨 생성하기
도커파일에서 생성한 볼륨은 호스트 경로의 /var/lib/docker/volumes/볼륨해쉬에 만들어집니다. Dockerfile로 생성한 volume은 매번 컨테이너를 생성할 때마다 무작위로 생성되기 때문에 사용할 때 주의해야 하며 나중에 사용 안 하는 볼륨을 지워줘야 한다.
FROM ubuntu:latest
# 볼륨을 마운트할 디렉토리 생성
RUN mkdir /app
# 볼륨 마운트 지정
VOLUME /app
# 컨테이너 내부의 파일 생성
RUN echo "Hello, Docker Volume!" > /app/data.txt
--volume-from 옵션 사용하기
Docker 컨테이너에게 다른 컨테이너에서 마운트 된 볼륨을 공유하도록 지시하는 명령어입니다. 이를 통해 볼륨을 한 컨테이너에서 생성하고 다른 컨테이너에서 사용할 수 있습니다.
$ docker volume create my-volume
$ docker run -d --name test-1 ubuntu:20.04 -v my-volume:/data
$ docker run -d --name test-2 ubuntu:20.04 --volume-from test-1
위 명령어를 이용하면 test-1에서 사용 중인 my-volume을 test-2에서도 사용할 수 있습니다.
Bind Mount
바인드 마운트는 호스트 시스템의 특정 경로를 컨테이너 내부 경로에 직접 연결을 하기 때문에 호스트와 컨테이너 간에 파일이 실시간으로 동기화할 수 있습니다. 저 같은 경우 개발을 한 애플리케이션의 로그를 확인하기 쉽게 하기 위해 로그 파일의 경로를 바인트 마운트 경로로 잡아서 사용하는 경우가 많습니다.
$ docker run -v 호스트경로:컨테이너경로 이미지:태그
또한 --mount 옵션을 이용하여 Bind Mount를 수행할 수 있는데 --mount를 이용하면 보다 섬세한 설정을 할 수 있습니다.
아래를 --mount 옵션을 이용하여 readonly 설정을 통해 컨테이너는 해당 파일 시스템에 readonly 권한으로 밖에 접근할 수 없도록 설정한 예시입니다.
$ docker run --mount type=bind,source=~/data,target=/data,readonly -d 이미지:태그
그밖에 옵션을 통해 여러가지 형식으로 마운트를 할 수 있습니다.
$ docker run --mount type=bind,source=호스트경로,target=컨테이너경로,옵션=값,옵션=값,...
'Docker' 카테고리의 다른 글
Docker resource 설정 (0) | 2023.07.27 |
---|---|
컨테이너 HEALTHCHECK (0) | 2023.07.23 |