우리 상황에 대한 설명을 건너 뛰고 싶다면 질문이 굵게 표시되어 있습니다.
저는 서버 네트워크의 개발자입니다. 우리는 서버의 여러 인스턴스를 배포합니다. 우리는 각 유형마다 3~5개의 인스턴스를 포함하는 5가지 서버 유형을 보유하고 있습니다. 우리는 부가 기능을 개발하기 위해 API가 있는 별도의 서버를 사용합니다. 각 서버 유형에는 서로 다른 필수 추가 기능 세트가 있습니다.
현재 우리는 폴더 구조를 사용하고 있으며 다음과 같이 인스턴스를 수동으로 실행하고 있습니다.
/servers
/server1
/instance1/.
/instance2/.
/server2
/instance1/.
등...
각 인스턴스에는 module\이라는 폴더가 있고 해당 폴더에는 jar 파일이 있습니다(시스템은 Java에서 실행됨).
추가 기능이 업데이트될 때마다 추가 기능이 필요한 서버의 모든 인스턴스에 이를 복사해야 합니다. 우리는 심볼릭 링크(ln -s )를 사용하고 각 추가 기능의 인스턴스를 하나만 저장하려고 합니다. 가상 인스턴스 관리로 전환하려는 점을 제외하면 이는 이상적입니다. 우리는 몇 가지 옵션을 분류했고 Docker는 내장된 로드 밸런싱 시스템 덕분에 우리 요구에 가장 적합한 옵션인 것처럼 보였습니다.
대부분의 가상화 플랫폼은 파일 시스템도 가상화합니다. 예를 들어 대부분의 가상 머신은 파일에 대한 모든 정보가 포함된 파일을 생성합니다.
여기서 문제는,Docker는 파일 시스템을 가상화합니까, 아니면 기본 Ubuntu 파일 시스템에서 인스턴스를 마운트합니까? Docker가 가능한 경우 LXC를 사용한다는 것을 알고 있지만 LXC 작동 방식과 인스턴스 간 심볼릭 링크 작동 여부에 대해서는 잘 모릅니다.가상화된다면 이는 분명히 심볼릭 링크가 더 이상 옵션이 아니라는 것을 의미합니다. 이 경우 효율성을 위해 파일 시스템을 단일 파일 또는 파일 세트에 저장하는 시스템은 변경 사항 이후 하드 드라이브에 대한 쓰기 양도 증가하기 때문에 Docker를 사용하지 않을 것입니다. 파일을 다시 작성해야 하며 서버 인스턴스가 매우 클 수 있습니다(수 GB).
답변1
귀하의 질문을 올바르게 이해했는지 잘 모르겠지만 Docker를 사용하면 게스트/가상 시스템의 파일 시스템 내부에 호스트 시스템의 디렉터리를 탑재할 수 있습니다. 호스트에서 여러 게스트 시스템으로 동일한 디렉터리를 마운트할 수 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.https://docs.docker.com/userguide/dockervolumes/
다음과 같이 작동해야 합니다:
docker create --name=instance1 -v /home/shared/addon/:/usr/local/addon/:ro ...
docker create --name=instance2 -v /home/shared/addon/:/usr/local/addon/:ro ...
docker create --name=instance3 -v /home/shared/addon/:/usr/local/addon/:ro ...
이는 /home/shared/addon/
인스턴스 간에 공유되며 각 인스턴스는 내부적으로 액세스할 수 있으며 /usr/local/addon/
인스턴스는 이를 읽을 수만 있습니다( ro
). 그럴 필요도 없습니다 ln -s
.
이는 가능한 접근 방식 중 하나일 뿐이며 문서에 더 많은 고급 옵션이 있습니다.
답변2
여기서 내 경험을 공유하겠습니다. Docker는 심볼릭 링크를 잘 처리하지 못하는 것 같습니다. 일반적인 방법으로 실제 디렉터리를 컨테이너 디렉터리에 마운트했습니다(명확성을 위해 EXTERNAL_DATA는 환경 변수입니다: /data/projectA라고 가정).
-v $EXTERNAL_DATA:/docker/data
나는 심볼릭 링크 파일을 가지고 있으며 외부 보기에서 보면 다음과 같습니다.
symlink_file -> /data/projA/somereal_file.txt
컨테이너 내부에 있을 때 ls 명령은 컨테이너 외부에 입력한 명령과 정확히 일치하는 명령을 표시합니다. somereal_file.txt는 Symlink_file과 동일한 디렉터리에 있습니다.
실제 파일에 접근할 수 있지만 심볼릭 링크를 사용하려고 하면 오류가 발생합니다.
head symlink_file
head: cannot open 'simlink_file' for reading: No such file or directory
내 애플리케이션 중 하나를 Docker 컨테이너로 마이그레이션하는 동안 이 사실을 발견했습니다. 이것이 docker의 설계 결함인지, 아니면 이 특정 사례를 처리하기 위해 원래 애플리케이션을 다시 작성하지 않고 이 문제를 해결할 수 있는 방법이 있는지 확실하지 않습니다. 응용 프로그램을 변경할 수 있더라도 이것이 이 문제를 해결하는 최선의 방법은 아닙니다.
이것을 Docker의 근본적인 심볼릭 링크 결함이라고 해야 할까요?