프로덕션 Docker 설치

원본 보기

프로덕션 Docker 설치

프로덕션 환경의 Docker에서 Elasticsearch를 실행할 때는 중요 시스템 구성에 설명된 일부 지침을 포함하여 다음 요구 사항과 권장 사항이 적용됩니다.

프로덕션 환경의 Docker에서 Elasticsearch를 실행할 때는 다음 요구 사항과 권장 사항이 적용됩니다.

vm.max_map_count 커널 설정은 1048576으로 설정해야 합니다.

vm.max_map_count 설정 방법은 플랫폼에 따라 다릅니다.

Linux
Docker for Mac을 사용하는 macOS
Docker Desktop을 사용하는 Windows 및 macOS
Docker Desktop WSL 2 백엔드를 사용하는 Windows

기본적으로 Elasticsearch는 컨테이너 내에서 uid:gid 1000:0을 사용하는 elasticsearch 사용자로 실행됩니다.

로컬 디렉터리나 파일을 바인드 마운트하는 경우 elasticsearch 사용자가 이를 읽을 수 있어야 합니다. 또한 이 사용자에게 config, data 및 log 디렉터리에 대한 쓰기 권한이 있어야 합니다(Elasticsearch가 키 저장소를 생성할 수 있도록 config 디렉터리에 대한 쓰기 권한이 필요합니다). 로컬 디렉터리의 gid 0에 그룹 접근 권한을 부여하는 것이 좋은 방법입니다.

중요

한 가지 예외는 임의로 할당된 사용자 ID를 사용하여 컨테이너를 실행하는 Openshift입니다. Openshift는 gid가 0으로 설정된 영구 볼륨을 제공하므로 별도의 조정 없이 작동합니다.

예를 들어 바인드 마운트를 통해 데이터를 저장할 로컬 디렉터리를 준비하려면 다음을 실행합니다.

mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir
		

사용자 지정 UID와 GID를 모두 사용하여 Elasticsearch 컨테이너를 실행할 수도 있습니다. 파일 권한으로 인해 Elasticsearch 실행이 차단되지 않도록 해야 합니다. 다음 두 옵션 중 하나를 사용할 수 있습니다.

  • config, datalogs 디렉터리를 바인드 마운트합니다. 플러그인을 설치할 예정이며 사용자 지정 Docker 이미지 생성을 원하지 않는 경우 plugins 디렉터리도 바인드 마운트해야 합니다.
  • docker run--group-add 0 명령줄 옵션을 전달합니다. 그러면 Elasticsearch가 실행되는 사용자도 컨테이너 내부의 root(GID 0) 그룹에 속하게 됩니다.

Elasticsearch 컨테이너에서 열린 파일사용자 프로세스 제한에 대해 상향된 ulimit를 사용할 수 있어야 합니다. Docker 데몬의 init 시스템이 이를 적절한 값으로 설정하는지 확인합니다.

Docker 데몬의 기본 ulimit를 확인하려면 다음을 실행합니다.

docker run --rm docker.elastic.co/elasticsearch/elasticsearch:9.5.1 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
		

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

docker run --rm docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER> /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
		

필요하면 데몬에서 이를 조정하거나 컨테이너별로 재정의합니다. 예를 들어 docker run을 사용할 때는 다음과 같이 설정합니다.

--ulimit nofile=65535:65535
		

성능과 노드 안정성을 위해 스와핑을 비활성화해야 합니다. 이를 수행하는 방법은 스와핑 비활성화를 참조하세요.

bootstrap.memory_lock: true 방식을 선택하는 경우 memlock: true ulimit도 Docker 데몬에 정의하거나 샘플 compose 파일에 표시된 것처럼 컨테이너에 명시적으로 설정해야 합니다. docker run을 사용할 때는 다음과 같이 지정할 수 있습니다.

-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1
		

이 이미지는 TCP 포트 9200과 9300을 노출합니다. 호스트당 하나의 컨테이너를 고정하는 경우가 아니라면 프로덕션 클러스터에서는 --publish-all을 사용하여 공개 포트를 무작위로 지정하는 것이 좋습니다.

기본적으로 Elasticsearch는 노드의 역할과 노드 컨테이너에서 사용할 수 있는 총 메모리를 기준으로 JVM 힙 크기를 자동으로 조정합니다. 대부분의 프로덕션 환경에서는 이 기본 크기 조정을 권장합니다. 필요한 경우 JVM 힙 크기를 수동으로 설정하여 기본 크기 조정을 재정의할 수 있습니다.

프로덕션에서 힙 크기를 수동으로 설정하려면 JVM 옵션 파일을 /usr/share/elasticsearch/config/jvm.options.d 아래에 바인드 마운트하고, 이 파일에 원하는 힙 크기 설정을 포함합니다.

테스트 시에는 ES_JAVA_OPTS 환경 변수를 사용하여 힙 크기를 수동으로 설정할 수도 있습니다. 예를 들어 1GB를 사용하려면 다음 명령어를 실행합니다.

docker run -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e ENROLLMENT_TOKEN="<token>" --name es01 -p 9200:9200 --net elastic -it docker.elastic.co/elasticsearch/elasticsearch:9.5.1
		

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

docker run -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e ENROLLMENT_TOKEN="<token>" --name es01 -p 9200:9200 --net elastic -it docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER>
		

ES_JAVA_OPTS 변수는 다른 모든 JVM 옵션을 재정의합니다. 프로덕션에서는 ES_JAVA_OPTS를 사용하지 않는 것이 좋습니다.

배포를 특정 버전의 Elasticsearch Docker 이미지로 고정합니다. 예:

docker.elastic.co/elasticsearch/elasticsearch:9.5.1
		

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

docker.elastic.co/elasticsearch/elasticsearch:<SPECIFIC.VERSION.NUMBER>
		

다음과 같은 이유로 /usr/share/elasticsearch/data에 바인드된 볼륨을 사용해야 합니다.

  1. 컨테이너가 삭제되어도 Elasticsearch 노드의 데이터가 손실되지 않습니다.
  2. Elasticsearch는 I/O에 민감하며 Docker 스토리지 드라이버는 빠른 I/O에 적합하지 않습니다.
  3. 고급 Docker 볼륨 플러그인을 사용할 수 있습니다.

워크로드에 overlay2 스토리지 드라이버를 사용하도록 docker-engine을 구성하는 것이 좋습니다.

다른 로깅 드라이버를 사용하여 로그를 중앙화하는 방안을 고려하세요. 또한 기본 json-file 로깅 드라이버는 프로덕션 환경에 적합하지 않다는 점에 유의하세요.