컨테이너와 로컬 파일 공유하기
컨테이너와 로컬 파일 공유하기
컨테이너는 기본적으로 호스트 머신의 데이터에 직접 접근할 수 없어요. 호스트와 컨테이너 간에 파일을 공유하려면 볼륨(volume)과 바인드 마운트(bind mount) 두 가지 저장 옵션을 사용할 수 있어요. 이 가이드에서는 특히 바인드 마운트로 호스트와 컨테이너를 연결하는 방법을 배워요.
출처: 문서
본문
설명
각 컨테이너는 호스트 머신에 사전 설치된 의존성에 의존하지 않고 기능하는 데 필요한 모든 것을 갖추고 있어요. 컨테이너는 격리된 환경에서 실행되므로 호스트와 다른 컨테이너에 미치는 영향이 최소화돼요. 이런 격리에는 큰 장점이 있어요. 컨테이너가 호스트 시스템 및 다른 컨테이너와의 충돌을 최소화한다는 거예요. 하지만 동시에 이 격리는 컨테이너가 기본적으로 호스트 머신의 데이터에 직접 접근할 수 없다는 뜻이기도 해요.
호스트 시스템의 파일에 저장된 구성 설정에 접근해야 하는 웹 애플리케이션 컨테이너가 있다고 가정해 봐요. 이 파일에는 데이터베이스 자격 증명이나 API 키 같은 민감한 데이터가 포함될 수 있어요. 이런 민감한 정보를 컨테이너 이미지에 직접 저장하는 건, 특히 이미지 공유 시 보안 위험을 초래해요. 이 문제를 해결하기 위해 Docker는 컨테이너 격리와 호스트 머신의 데이터 사이의 간극을 메우는 저장 옵션을 제공해요.
Docker는 호스트 머신과 컨테이너 간에 데이터를 유지하고 파일을 공유하기 위한 두 가지 주요 저장 옵션, 즉 볼륨(volumes)과 바인드 마운트(bind mounts)를 제공해요.
볼륨 대 바인드 마운트
컨테이너 안에서 생성되거나 수정된 데이터가 컨테이너가 중지된 후에도 유지되도록 하고 싶다면 볼륨을 선택해요. 볼륨과 그 사용 사례에 대해 더 알아보려면 컨테이너 데이터 유지하기를 참고하세요.
호스트 시스템의 특정 파일이나 디렉터리를 컨테이너와 직접 공유하고 싶다면, 예를 들어 구성 파일이나 개발 코드 같은 것이라면 바인드 마운트를 사용해요. 호스트와 컨테이너 사이에 공유를 위한 직접적인 포털을 여는 것과 같아요. 바인드 마운트는 호스트와 컨테이너 간의 실시간 파일 접근과 공유가 중요한 개발 환경에 이상적이에요.
호스트와 컨테이너 사이에서 파일 공유
docker run 명령과 함께 사용하는 -v(또는 --volume)와 --mount 플래그는 둘 다 로컬 머신(호스트)과 Docker 컨테이너 사이에서 파일이나 디렉터리를 공유하게 해 줘요. 하지만 동작과 사용 방식에는 몇 가지 중요한 차이가 있어요.
-v 플래그는 기본적인 볼륨이나 바인드 마운트 작업에 더 간단하고 편리해요. -v나 --volume을 사용할 때 호스트 위치가 존재하지 않으면 디렉터리가 자동으로 생성돼요.
자신이 프로젝트를 진행 중인 개발자라고 상상해 봐요. 코드가 있는 개발 머신에 소스 디렉터리가 있어요. 코드를 컴파일하거나 빌드할 때 생성되는 산출물(컴파일된 코드, 실행 파일, 이미지 등)은 소스 디렉터리 안의 별도 하위 디렉터리에 저장돼요. 다음 예시에서 이 하위 디렉터리는 /HOST/PATH예요. 이제 이 빌드 산출물을 애플리케이션을 실행하는 Docker 컨테이너 안에서 접근할 수 있게 하고 싶어요. 또한 코드를 다시 빌드할 때마다 컨테이너가 최신 빌드 산출물에 자동으로 접근하길 원해요.
바인드 마운트를 사용해 컨테이너를 시작하고 컨테이너 파일 위치에 매핑하는 docker run 사용법은 이래요.
$ docker run -v /HOST/PATH:/CONTAINER/PATH -it nginx
--mount 플래그는 더 고급 기능과 세밀한 제어를 제공해 복잡한 마운트 시나리오나 프로덕션 배포에 적합해요. 기본적으로 --mount로 Docker 호스트에 아직 존재하지 않는 파일이나 디렉터리를 바인드 마운트하면, docker run 명령이 자동으로 생성하지 않고 오류를 발생시켜요.
$ docker run --mount type=bind,source=/HOST/PATH,target=/CONTAINER/PATH,readonly nginx
Note Docker는
-v대신--mount문법을 사용할 것을 권장해요. 마운트 과정을 더 잘 제어할 수 있고, 누락된 디렉터리로 인한 잠재적 문제를 피할 수 있어요.
호스트 파일에 대한 Docker 접근의 파일 권한
바인드 마운트를 사용할 때 Docker가 호스트 디렉터리에 접근하는 데 필요한 권한을 갖추도록 하는 게 중요해요. 읽기/쓰기 접근을 부여하려면 컨테이너 생성 시 -v 또는 --mount 플래그와 함께 :ro 플래그(읽기 전용)나 :rw(읽기-쓰기)를 사용할 수 있어요.
예를 들어 다음 명령은 읽기-쓰기 접근 권한을 부여해요.
$ docker run -v HOST-DIRECTORY:/CONTAINER-DIRECTORY:rw nginx
읽기 전용 바인드 마운트는 컨테이너가 호스트의 마운트된 파일을 읽을 수는 있지만 변경하거나 삭제할 수는 없게 해요. 읽기-쓰기 바인드 마운트에서는 컨테이너가 마운트된 파일을 수정하거나 삭제할 수 있고, 이런 변경이나 삭제는 호스트 시스템에도 반영돼요. 읽기 전용 바인드 마운트는 호스트의 파일이 컨테이너에 의해 실수로 수정되거나 삭제되지 않도록 보장해요.
동기화된 파일 공유 (Synchronized File Share)
코드베이스가 커질수록 바인드 마운트 같은 기존의 파일 공유 방식은 비효율적이거나 느려질 수 있어요. 특히 파일 접근이 잦은 개발 환경에서요. 동기화된 파일 공유는 동기화된 파일시스템 캐시를 활용해 바인드 마운트 성능을 개선해요. 이 최적화는 호스트와 가상 머신(VM) 사이의 파일 접근이 빠르고 효율적이도록 보장해요.
직접 해보기
이 실습 가이드에서는 바인드 마운트를 만들고 사용해 호스트와 컨테이너 사이에서 파일을 공유하는 연습을 해요.
컨테이너 실행
- Docker Desktop을 다운로드하고 설치해요.
- httpd 이미지로 다음 명령을 사용해 컨테이너를 시작해요.
이 명령은$ docker run -d -p 8080:80 --name my_site httpd:2.4httpd서비스를 백그라운드에서 시작하고 웹페이지를 호스트의 포트8080에 게시해요. - 브라우저를 열고 http://localhost:8080 에 접속하거나 curl 명령으로 제대로 동작하는지 확인해요.
$ curl localhost:8080
바인드 마운트 사용하기
바인드 마운트를 사용해 호스트 컴퓨터의 구성 파일을 컨테이너 안의 특정 위치에 매핑할 수 있어요. 이 예시에서는 바인드 마운트를 사용해 웹페이지의 모양과 느낌을 바꾸는 방법을 볼게요.
- Docker Desktop 대시보드로 기존 컨테이너를 삭제해요.
- 호스트 시스템에
public_html이라는 새 디렉터리를 만들어요.$ mkdir public_html - 새로 만든
public_html디렉터리로 이동해 다음 내용으로index.html파일을 만들어요. 이는 친근한 고래가 여러분을 환영하는 간단한 웹페이지를 만드는 기본 HTML 문서예요.<html lang="en"> <head> <meta charset="UTF-8"> <title> My Website with a Whale & Docker!</title> </head> <body> <h1>Whalecome!!</h1> <p>Look! There's a friendly whale greeting you!</p> <pre id="docker-art"> ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""""\___/ === { / ===- \______ O __/ \ \ __/ \____\_______/ Hello from Docker! </pre> </body> </html> - 컨테이너를 실행할 차례예요.
--mount와-v예시는 같은 결과를 만들어요. 첫 번째 예시를 실행한 뒤my_site컨테이너를 제거하지 않으면 둘 다 실행할 수 없어요.$ docker run -d --name my_site -p 8080:80 -v .:/usr/local/apache2/htdocs/ httpd:2.4$ docker run -d --name my_site -p 8080:80 --mount type=bind,source=./,target=/usr/local/apache2/htdocs/ httpd:2.4Tip Windows PowerShell에서
-v나--mount플래그를 사용할 때는./대신 디렉터리의 절대 경로를 제공해야 해요. PowerShell은 Mac과 Linux 환경에서 흔히 사용되는 bash와 상대 경로를 다르게 처리하기 때문이에요. - 모든 게 실행되고 나면 http://localhost:8080 으로 사이트에 접근할 수 있고, 친근한 고래가 여러분을 환영하는 새 웹페이지를 볼 수 있어요.
Docker Desktop 대시보드에서 파일 접근하기
- 컨테이너의 Files 탭을 선택하고
/usr/local/apache2/htdocs/디렉터리 안의 파일을 선택하면 컨테이너 안의 마운트된 파일을 볼 수 있어요. 그런 다음 Open file editor를 선택해요. - 호스트에서 파일을 삭제하고 컨테이너에서도 파일이 삭제됐는지 확인해요. Docker Desktop 대시보드의 Files 아래에 더 이상 파일이 존재하지 않는 걸 확인할 수 있을 거예요.
- 호스트 시스템에서 HTML 파일을 다시 만들고 Docker Desktop 대시보드의 Containers 아래 Files 탭에 파일이 다시 나타나는지 확인해요. 이제 사이트에도 접근할 수 있을 거예요.
컨테이너 중지
컨테이너는 중지할 때까지 계속 실행돼요.
- Docker Desktop 대시보드의 Containers 뷰로 이동해요.
- 중지하려는 컨테이너를 찾아요.
- Actions 열에서 Stop 동작을 선택해요.
추가 자료
바인드 마운트에 대해 더 알아보는 데 다음 자료가 도움이 될 거예요.
다음 단계
컨테이너와 로컬 파일 공유에 대해 배웠으니, 이제 멀티 컨테이너 애플리케이션을 배울 차례예요.