it-gundan.com

Docker 컨테이너 내에 SMB / CIFS 공유 마운트

Docker 컨테이너에서 웹 응용 프로그램을 실행 중입니다. 이 응용 프로그램은 회사 파일 서버 (Active Directory 도메인 컨트롤러가있는 Windows Server)의 일부 파일에 액세스해야합니다. 내가 액세스하려는 파일은 고객을 위해 만든 이미지 파일이며 웹 응용 프로그램은 해당 파일을 고객 포트폴리오의 일부로 표시합니다.

개발 시스템에는 /etc/fstab의 항목을 통해 적절한 폴더가 마운트되어 있고 호스트 마운트 포인트는 --volume 인수를 통해 Docker 컨테이너에 마운트됩니다. 이것은 완벽하게 작동합니다.

이제 다른 서버에서 실행되고 호스트에 마운트되는 CIFS 공유에 의존하지 않는 프로덕션 컨테이너를 구성하려고합니다. 따라서 컨테이너의 /etc/fstab 파일에 적절한 항목을 추가하고 mount -a로 마운트하려고했습니다. mount error(13): Permission denied을 얻습니다.

온라인에서 약간의 연구를 통해 도커 보안에 관한 기사 로 연결되었습니다. 이 글을 올바르게 읽으면 Docker가 컨테이너 내에 파일 시스템을 마운트하는 기능을 명시 적으로 거부하는 것으로 보입니다. 공유를 읽기 전용으로 마운트하려고 시도했지만 이것도 (실제로) 실패했습니다.

그래서 두 가지 질문이 있습니다.

  1. Docker가 컨테이너 내부에서 mount의 사용을 막는다는 것을 이해하고 있습니까?

  2. 누구든지 이것을 수행하는 다른 방법을 생각할 수 있습니까? without 호스트에 CIFS 공유를 마운트 한 다음 Docker 컨테이너에 호스트 폴더를 마운트하십시오.

31
Kryten

예, Docker는 보안 조치로 컨테이너 내부에 원격 볼륨을 마운트하지 못하게합니다. 이미지와 이미지를 실행하는 사람들을 신뢰하면 --privileged 플래그가 docker run 이러한 보안 조치를 사용하지 않습니다.

또한 --cap-add--cap-drop 컨테이너에 실제로 필요한 기능 만 제공합니다. (문서 참조)SYS_ADMIN 기능은 마운트 권한을 부여하는 기능입니다.

31
Nathaniel Waisbrot
  1. 컨테이너 내에 닫힌 문제가 있습니다 mount.cifs

https://github.com/docker/docker/issues/22197

어떤 추가에 따라

--cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH

실행 옵션을 사용하면 mount -t cifs가 작동합니다.

나는 그것을 시도하고 :

mount -t cifs //<Host>/<path> /<localpath> -o user=<user>,password=<user>

컨테이너 내에서 작동

13
Wolfgang Fahl

smbclient 명령 (Samba 패키지의 일부)을 사용하여 curl를 사용하여 다운로드하는 것과 같은 방식으로 Docker 컨테이너 내에서 SMB/CIFS 서버에 마운트하지 않고 액세스 할 수 있습니다. 또는 파일을 업로드하십시오.

이것을 다루는 StackExchange Unix 에 대한 질문이 있지만 간단히 말하면 :

smbclient //server/share -c 'cd /path/to/file; put myfile'

여러 파일의 경우 -T 생성하거나 추출 할 수있는 옵션 .tar 보관 처리는 2 단계 프로세스 (1 개는 .tar 그리고 다른 하나는 로컬로 추출합니다. 파이프를 사용하여 한 번에 파이프를 사용할 수 있는지 확실하지 않습니다.

3
Malvineous

Netshare docker volume plugin을 사용하여 원격 CIFS/Samba를 볼륨으로 마운트 할 수 있음

0
andrey

공유를 마운트하기 위해 많은 포트를 노출시켜 컨테이너의 보안을 떨어 뜨리지 마십시오. 또는 --privileged로 실행하여

이 문제를 해결 한 방법은 다음과 같습니다.

  • 먼저 docker를 실행하는 서버에 볼륨을 마운트하십시오.

Sudo mount -t cifs -o username=YourUserName,uid=$(id -u),gid=$(id -g) //SERVER/share ~/WinShare

여기에서 사용자 이름, 서버 및 WinShare를 변경하십시오. 이것은 Sudo 비밀번호를 요구 한 다음 원격 공유에 대한 비밀번호를 요구합니다.

홈 폴더 안에 WinShare 폴더를 만들었다 고 가정 해 봅시다. 이 명령을 실행하면 WinShare 폴더의 모든 공유 폴더와 파일을 볼 수 있습니다. 그 외에도 uidgid 태그를 사용하므로 항상 Sudo를 사용하지 않고도 쓰기 권한이 있습니다.

  • 이제 -v 태그를 사용하여 컨테이너를 실행하고 서버와 컨테이너간에 볼륨을 공유 할 수 있습니다.

다음과 같이 실행했다고 가정 해 봅시다.

docker run -d --name mycontainer -v /home/WinShare:/home 2d244422164

이제 Windows 공유에 액세스하여 컨테이너에서이를 수정할 수 있어야합니다.

그것을 테스트하려면 다음을 수행하십시오.

docker exec -it yourRunningContainer /bin/bash

cd /Home

touch testdocfromcontainer.txt

Windows 공유에 testdocfromcontainer.txt가 표시되어야합니다.

0
nPcomp