Docker Elasticsearch 구성

원본 보기

Docker Elasticsearch 구성

Docker에서 실행할 때 Elasticsearch 구성 파일/usr/share/elasticsearch/config/에서 로드됩니다.

사용자 지정 구성 파일을 사용하려면 이미지의 구성 파일 위에 파일을 바인드 마운트합니다.

Docker 환경 변수를 사용하여 개별 Elasticsearch 구성 매개변수를 설정할 수 있습니다. 샘플 compose 파일단일 노드 예제에서는 이 방법을 사용합니다. 설정 이름을 환경 변수 이름으로 직접 사용할 수 있습니다. 오케스트레이션 플랫폼에서 환경 변수 이름에 마침표를 사용할 수 없는 등의 이유로 이 방법을 사용할 수 없다면 다음과 같이 설정 이름을 변환하는 대체 형식을 사용할 수 있습니다.

  1. 설정 이름을 대문자로 변경합니다
  2. 앞에 ES_SETTING_를 붙입니다
  3. 밑줄(_)을 두 번 입력하여 이스케이프합니다
  4. 모든 마침표(.)를 밑줄(_)로 변환합니다

예를 들어 -e bootstrap.memory_lock=true-e ES_SETTING_BOOTSTRAP_MEMORY__LOCK=true가 됩니다.

파일 내용을 사용하여 ELASTIC_PASSWORD 또는 KEYSTORE_PASSWORD 환경 변수의 값을 설정하려면 환경 변수 이름 뒤에 _FILE을 붙이면 됩니다. 비밀번호와 같은 보안 정보를 직접 지정하지 않고 Elasticsearch에 전달할 때 유용합니다.

예를 들어 파일에서 Elasticsearch 부트스트랩 비밀번호를 설정하려면 파일을 바인드 마운트하고 ELASTIC_PASSWORD_FILE 환경 변수를 마운트 위치로 설정하면 됩니다. 비밀번호 파일을 /run/secrets/bootstrapPassword.txt에 마운트하는 경우 다음과 같이 지정합니다.

-e ELASTIC_PASSWORD_FILE=/run/secrets/bootstrapPassword.txt
		

이미지의 기본 명령을 재정의하여 Elasticsearch 구성 매개변수를 명령줄 옵션으로 전달할 수 있습니다. 예:

docker run <various parameters> bin/elasticsearch -Ecluster.name=mynewclustername
		

프로덕션에서는 일반적으로 구성 파일을 바인드 마운트하는 방법이 권장되지만, 구성이 포함된 사용자 지정 Docker 이미지를 생성할 수도 있습니다.

사용자 지정 구성 파일을 생성하고 Docker 이미지의 해당 파일 위에 바인드 마운트합니다. 예를 들어 custom_elasticsearch.ymldocker run으로 바인드 마운트하려면 다음과 같이 지정합니다.

-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
		

사용자 지정 elasticsearch.yml 파일을 바인드 마운트하는 경우 network.host: 0.0.0.0 설정이 포함되어 있는지 확인합니다. 포트가 노출되어 있다면 이 설정을 통해 HTTP 및 전송 트래픽에서 노드에 접근할 수 있습니다. Docker 이미지에 기본 제공되는 elasticsearch.yml 파일에는 이 설정이 기본적으로 포함되어 있습니다.

중요

컨테이너는 elasticsearch 사용자와 uid:gid 1000:0을 사용하여 Elasticsearch를 실행합니다. 바인드 마운트된 호스트 디렉터리와 파일은 이 사용자가 접근할 수 있어야 하며, 데이터 및 로그 디렉터리는 이 사용자가 쓸 수 있어야 합니다.

기본적으로 Elasticsearch는 보안 설정을 위한 키 저장소 파일을 자동으로 생성합니다. 이 파일은 난독화되지만 암호화되지는 않습니다.

보안 설정을 비밀번호로 암호화하고 컨테이너 외부에 유지하려면 대신 docker run 명령을 사용하여 키 저장소를 수동으로 생성합니다. 명령은 다음 조건을 충족해야 합니다.

  • config 디렉터리를 바인드 마운트합니다. 명령은 이 디렉터리에 elasticsearch.keystore 파일을 생성합니다. 오류를 방지하려면 elasticsearch.keystore 파일을 직접 바인드 마운트하지 마세요.
  • elasticsearch-keystore 도구를 create -p 옵션과 함께 사용합니다. 키 저장소의 비밀번호를 입력하라는 메시지가 표시됩니다.

예:

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:9.5.1 \
bin/elasticsearch-keystore create -p
		

<SPECIFIC.VERSION.NUMBER>를 다운로드한 Docker 이미지의 버전으로 바꿉니다.

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER> \
bin/elasticsearch-keystore create -p
		

docker run 명령을 사용하여 키 저장소의 보안 설정을 추가하거나 업데이트할 수도 있습니다. 설정 값을 입력하라는 메시지가 표시됩니다. 키 저장소가 암호화되어 있으면 키 저장소 비밀번호도 입력하라는 메시지가 표시됩니다.

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:9.5.1 \
bin/elasticsearch-keystore \
add my.secure.setting \
my.other.secure.setting
		

<SPECIFIC.VERSION.NUMBER>를 다운로드한 Docker 이미지의 버전으로 바꿉니다.

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER> \
bin/elasticsearch-keystore \
add my.secure.setting \
my.other.secure.setting
		

이미 키 저장소를 생성했고 업데이트할 필요가 없다면 elasticsearch.keystore 파일을 직접 바인드 마운트할 수 있습니다. KEYSTORE_PASSWORD 환경 변수를 사용하여 시작 시 컨테이너에 키 저장소 비밀번호를 제공할 수 있습니다. 예를 들어 docker run 명령에는 다음 옵션을 사용할 수 있습니다.

-v full_path_to/config/elasticsearch.keystore:/usr/share/elasticsearch/config/elasticsearch.keystore
-e KEYSTORE_PASSWORD=mypassword
		

클러스터를 최신 버전으로 업그레이드하면 Elasticsearch는 elasticsearch.keystore 파일도 이에 맞게 자동으로 업그레이드하려고 합니다. 하지만 바인드 마운트된 파일은 읽기 전용이므로 Elasticsearch는 바인드 마운트된 elasticsearch.keystore 파일을 자동으로 업그레이드할 수 없습니다. 따라서 elasticsearch.keystore 파일을 직접 바인드 마운트하는 경우 각 노드를 업그레이드할 때 bin/elasticsearch-keystore upgrade 명령을 사용하여 해당 노드의 키 저장소를 수동으로 업그레이드해야 합니다.

일부 환경에서는 구성이 포함된 사용자 지정 이미지를 준비하는 것이 더 적합할 수 있습니다. 이를 위한 Dockerfile은 다음과 같이 간단할 수 있습니다.

FROM docker.elastic.co/elasticsearch/elasticsearch:9.5.1
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/
		

<SPECIFIC.VERSION.NUMBER>를 다운로드한 Docker 이미지의 버전으로 바꿉니다.

FROM docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER>
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/
		

그런 다음 다음 명령으로 이미지를 빌드하고 실행할 수 있습니다.

docker build --tag=elasticsearch-custom .
docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom
		

일부 플러그인에는 추가 보안 권한이 필요합니다. 다음 방법 중 하나로 명시적으로 권한을 수락해야 합니다.

  • Docker 이미지를 실행할 때 tty를 연결하고 메시지가 표시되면 권한을 허용합니다.
  • 보안 권한을 검토하고 플러그인 설치 명령에 --batch 플래그를 추가하여 권한을 수락합니다(적절한 경우).

자세한 내용은 플러그인 관리를 참조하세요.

Docker에서 Elasticsearch를 실행할 때 발생하는 일반적인 오류를 해결하는 방법은 다음과 같습니다.

Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.io.IOException: Is a directory: SimpleFSIndexInput(path="/usr/share/elasticsearch/config/elasticsearch.keystore") Likely root cause: java.io.IOException: Is a directory
		

키 저장소 관련 docker run 명령이 존재하지 않는 elasticsearch.keystore 파일을 직접 바인드 마운트하려고 했습니다. -v 또는 --volume 플래그를 사용하여 존재하지 않는 파일을 마운트하면 Docker는 대신 같은 이름의 디렉터리를 생성합니다.

이 오류를 해결하려면 다음 단계를 따르세요.

  1. elasticsearch.keystore 디렉터리를 config 디렉터리에서 삭제합니다.
  2. -v 또는 --volume 플래그가 키 저장소 파일 경로가 아닌 config 디렉터리 경로를 가리키도록 업데이트합니다. 예시는 암호화된 Elasticsearch 키 저장소 생성을 참조하세요.
  3. 명령을 다시 실행합니다.

Exception in thread "main" java.nio.file.FileSystemException: /usr/share/elasticsearch/config/elasticsearch.keystore.tmp -> /usr/share/elasticsearch/config/elasticsearch.keystore: Device or resource busy
		

docker run 명령이 키 저장소를 업데이트하려고 할 때 elasticsearch.keystore 파일을 직접 바인드 마운트했습니다. 키 저장소를 업데이트하려면 컨테이너가 config 디렉터리의 keystore.tmp와 같은 다른 파일에 접근할 수 있어야 합니다.

이 오류를 해결하려면 다음 단계를 따르세요.

  1. -v 또는 --volume 플래그가 키 저장소 파일 경로가 아닌 config 디렉터리 경로를 가리키도록 업데이트합니다. 예시는 암호화된 Elasticsearch 키 저장소 생성을 참조하세요.
  2. 명령을 다시 실행합니다.