Docker 컨테이너에 호스트 디렉토리 마운트

Isaac Tony 2023년1월30일
  1. 바인드 마운트를 사용하여 호스트 디렉토리를 Docker 컨테이너에 마운트
  2. 결론
Docker 컨테이너에 호스트 디렉토리 마운트

다른 기능 외에도 Docker는 호스트 운영 체제 및 컨테이너 파일 시스템과 함께 작동하는 도구를 제공합니다. 이러한 기능 중에는 컨테이너에 데이터를 유지하고 디렉터리를 Docker 컨테이너에 탑재하여 컨테이너 간에 데이터를 공유하는 기능이 있습니다.

Docker 컨테이너에 디렉토리를 마운트하는 것은 개발 환경 및 프로덕션에서 유용합니다. 호스트 시스템 디렉토리에 의존하는 서비스를 생성하는 것 외에도 Docker 컨테이너가 파괴되는 경우 전체 파일 시스템이 파괴되지 않도록 합니다.

컨테이너의 새 버전을 빌드하려고 한다고 가정합니다. 이 경우 Docker 컨테이너에 디렉터리를 직접 탑재하면 핫 리로딩이 가능합니다.

이 문서에서는 Docker가 올바르게 설정되어 있고 Docker 이미지와 컨테이너가 있어야 합니다. 이것은 wsl 또는 Linux에서 Docker를 실행하는지 여부에 관계없이 작동합니다.

바인드 마운트를 사용하여 호스트 디렉토리를 Docker 컨테이너에 마운트

바인드 마운트는 Docker 컨테이너를 호스트 시스템의 디렉토리에 마운트하여 데이터를 지속할 수 있는 가장 초기 솔루션 중 하나입니다. 이를 통해 대상 디렉토리의 절대 파일 경로를 참조하여 디렉토리를 참조할 수 있습니다.

이 경우 Docker는 Docker 볼륨의 경우와 달리 이 디렉토리를 제어하지 않습니다. Docker 볼륨은 Docker가 관리하는 Docker 스토리지 시스템 내에 디렉토리를 생성합니다.

또한 Docker 볼륨과 달리 Docker CLI 또는 Docker API를 통해 컨테이너에 탑재된 디렉터리를 직접 관리할 수 없습니다. 그러나 Docker 마운트는 Docker 볼륨이 약간 성능이 좋은 MAC 또는 Windows와 같은 호스트에서 고성능입니다.

또한 바인드 마운트를 사용하여 컨테이너를 디렉토리에 마운트하면 컨테이너의 크기가 확실히 팽창한다는 점에 유의해야 합니다.

컨테이너를 시작하는 동안 두 개의 플래그를 사용하여 디렉터리를 컨테이너에 마운트할 수 있습니다. 여기에는 -v--mount 플래그가 포함됩니다.

-v 또는 --volume 플래그를 사용하여 호스트 디렉토리를 Docker 컨테이너에 마운트

항상 올바른 순서로 콜론으로 구분되어야 하는 세 개의 필드로 구성됩니다. 여기에는 다음이 포함됩니다.

  • 마운트하려는 호스트 시스템의 디렉토리 경로.
  • 이 디렉토리를 마운트해야 하는 컨테이너의 디렉토리 경로입니다.
  • ro와 같은 기타 옵션 옵션은 읽기 전용 모드를 지정합니다.
docker run -t -i -v <host_dir>:<container_dir

함께 마운트하려는 호스트 및 컨테이너 디렉토리를 식별하면 위의 명령을 구현할 수 있습니다. 그러나 민감한 파일을 수정해서는 안 됩니다.

마운트를 통해 민감한 파일에 액세스할 수 있기 때문입니다. 이 파일은 변조될 경우 시스템에 치명적인 오류가 발생할 수 있습니다.

이 경우 공식 루비 이미지를 사용하여 컨테이너를 만들고 디렉토리를 마운트합니다. Docker 컨테이너와 동일한 디렉토리 이름으로 스크립트의 이름을 지정했습니다.

isaac@DESKTOP-HV44HT6:~/isaac$ docker run -it --rm -v$HOME/Desktop/scripts:/scripts --name scripts ruby bash
Unable to find image 'ruby:latest' locally
latest: Pulling from library/ruby
e4d61adff207: Pull complete
4ff1945c672b: Pull complete
ff5b10aec998: Pull complete
12de8c754e45: Pull complete
ada1762e7602: Pull complete
f8f0dec0b2ef: Pull complete
7109f2ab3080: Pull complete
fe1e1dda18a5: Pull complete
Digest: sha256:a1ebc64daa170324dde5b668829de85487575eaa2bdea5216b4c983b1822f9df
Status: Downloaded newer image for ruby:latest

로컬에 이미지가 없으면 Docker가 자동으로 이미지를 다운로드합니다. 컨테이너 구축 프로세스가 완료되면 Docker가 컨테이너를 엽니다.

root@9d057cf9e33d:/#
root@9d057cf9e33d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  scripts  srv  sys  tmp  usr  var
root@9d057cf9e33d:/# cd scripts
root@9d057cf9e33d:/scripts# ls

컨테이너의 스크립트 디렉토리가 비어 있음을 알 수 있습니다.

이제 호스트 시스템의 scripts 디렉토리로 이동하여 해당 디렉토리에 새 파일을 생성해 보겠습니다. Docker 컨테이너 디렉토리 스크립트에 자동으로 반영됩니다.

isaac@DESKTOP-HV44HT6:~/Desktop$ cd scripts
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ touch new_file.txt
touch: cannot touch 'new_file.txt': Permission denied
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ ls
new_file.txt
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$

로컬 디렉토리에 파일을 생성하면 아래 컨테이너 디렉토리에 표시됩니다.

root@913609933be2:/scripts# ls
new_file.txt

--mount 플래그를 사용하여 호스트 디렉토리를 Docker 컨테이너에 마운트

이것은 -v 태그보다 더 간단한 방법이며 쉼표로 구분된 여러 키-값 쌍으로 구성됩니다. 이러한 태그의 경우 필드 순서는 문제가 되지 않습니다.

그러나 -v 태그와 비교할 때 더 장황합니다.

이러한 메서드는 다음 명령으로 구성됩니다.

  • 바인드, 볼륨 또는 tmpfs와 같은 마운트 유형입니다.
  • 소스, 즉 우리가 마운트하려는 호스트의 디렉토리 경로는 일반적으로 src로 표시됩니다.
  • 대상, 즉, 디렉토리를 마운트하려는 컨테이너의 디렉토리 경로입니다.
  • 이 디렉토리를 개인 또는 공유로 지정할 수 있는 읽기 전용 옵션 및 바인드 전파와 같은 다른 옵션도 있습니다.

필요한 모든 필드, 특히 소스와 대상을 메모했으면 아래와 같이 명령을 실행할 수 있습니다.

이 경우 공식 Nginx 이미지를 사용하여 컨테이너를 빌드하고 로컬 디렉토리 이름 new_scriptsetc/nginx에 있는 디렉토리에 매핑합니다.

$ docker run -d \
> -it \
> --mount type=bind,source=$HOME/Desktop/scripts/new_scripts,target=/etc/nginx \
> nginx \
> bash
e079e3254970e290ae68473239e101c6aa8ba4ba56482c75cd21f9bb9f49600b

이제 두 디렉토리를 성공적으로 매핑했으므로 호스트의 디렉토리에 대한 변경 사항은 컨테이너의 디렉토리에 자동으로 반영됩니다.

isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ ls
new_file.txt

이 파일은 이 디렉터리에 매핑된 docker 디렉터리에 반영되어 두 디렉터리를 성공적으로 매핑했음을 보여줍니다.

root@e079e3254970:/etc# cd nginx
root@e079e3254970:/etc/nginx# ls
new_file.txt

결론

Docker -v-mount 태그를 사용하여 디렉토리를 마운트하는 방법을 성공적으로 시연했습니다.

그러나 -v 태그를 사용하여 존재하지 않는 디렉토리를 마운트할 때 Docker는 자동으로 디렉토리를 생성합니다. 이것은 Docker --mount 태그를 사용할 때와 동일한 경우가 아닙니다.

새 애플리케이션을 개발할 때 대신 Docker 볼륨을 사용하는 것을 고려해야 합니다.

작가: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

관련 문장 - Docker Container