프로덕션 Docker 설치
원본 보기프로덕션 Docker 설치
프로덕션 환경의 Docker에서 Elasticsearch를 실행할 때는 중요 시스템 구성에 설명된 일부 지침을 포함하여 다음 요구 사항과 권장 사항이 적용됩니다.
프로덕션 환경의 Docker에서 Elasticsearch를 실행할 때는 다음 요구 사항과 권장 사항이 적용됩니다.
vm.max_map_count 커널 설정은 1048576으로 설정해야 합니다.
vm.max_map_count 설정 방법은 플랫폼에 따라 다릅니다.
vm.max_map_count 설정의 현재 값을 확인하려면 다음을 실행합니다.
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=1048576
실행 중인 시스템에 설정을 적용하려면 다음을 실행합니다.
sysctl -w vm.max_map_count=1048576
vm.max_map_count 설정값을 영구적으로 변경하려면 /etc/sysctl.conf의 값을 업데이트합니다.
vm.max_map_count 설정은 xhyve 가상 머신 내에서 지정해야 합니다.
명령줄에서 다음을 실행합니다.
screen ~/Library/Containers/com.docker.docker/Data/vms/0/ttyEnter 키를 누르고
sysctl을 사용하여vm.max_map_count를 구성합니다.sysctl -w vm.max_map_count=1048576screen세션을 종료하려면Ctrl a d를 입력합니다.
vm.max_map_count 설정은 docker-machine을 통해 지정해야 합니다.
docker-machine ssh
sudo sysctl -w vm.max_map_count=1048576
Elasticsearch 컨테이너가 정상적으로 시작되기 전에 vm.max_map_count 설정을 "docker-desktop" WSL 인스턴스에서 지정해야 합니다. Windows와 WSL 버전에 따라 여러 방법을 사용할 수 있습니다.
Windows 10 버전 22H2 이전을 사용하거나 기본 제공 WSL이 설치된 Windows 10 버전 22H2를 사용하는 경우, Elasticsearch 컨테이너를 시작하기 전에 Docker를 재시작할 때마다 이 설정을 수동으로 지정하거나, 재시작할 때마다 지정하지 않으려면 모든 WSL2 인스턴스의 vm.max_map_count가 변경되도록 전역으로 설정해야 합니다. 이러한 WSL 버전은 /etc/sysctl.conf 파일을 올바르게 처리하지 못하기 때문입니다.
재부팅할 때마다 수동으로 설정하려면 Docker를 재시작할 때마다 명령 프롬프트 또는 PowerShell 창에서 다음 명령어를 실행해야 합니다.
wsl -d docker-desktop -u root
sysctl -w vm.max_map_count=1048576
이러한 WSL 버전을 사용하면서 Docker를 재시작할 때마다 해당 명령어를 실행하지 않으려면 다음과 같이 %USERPROFILE%.wslconfig를 수정하여 모든 WSL 배포판에 이 설정을 전역으로 적용할 수 있습니다.
[wsl2]
kernelCommandLine = "sysctl.vm.max_map_count=1048576"
그러면 모든 WSL2 VM이 시작될 때 이 설정이 적용됩니다.
Windows 11을 사용하거나 Microsoft Store 버전의 WSL이 설치된 Windows 10 버전 22H2를 사용하는 경우, 다음과 같은 명령어로 "docker-desktop" WSL 배포판 내의 /etc/sysctl.conf를 수정할 수 있습니다.
wsl -d docker-desktop -u root
vi /etc/sysctl.conf
그리고 다음과 같은 줄을 추가합니다.
vm.max_map_count = 1048576
기본적으로 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,data및logs디렉터리를 바인드 마운트합니다. 플러그인을 설치할 예정이며 사용자 지정 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에 바인드된 볼륨을 사용해야 합니다.
- 컨테이너가 삭제되어도 Elasticsearch 노드의 데이터가 손실되지 않습니다.
- Elasticsearch는 I/O에 민감하며 Docker 스토리지 드라이버는 빠른 I/O에 적합하지 않습니다.
- 고급 Docker 볼륨 플러그인을 사용할 수 있습니다.
워크로드에 overlay2 스토리지 드라이버를 사용하도록 docker-engine을 구성하는 것이 좋습니다.
다른 로깅 드라이버를 사용하여 로그를 중앙화하는 방안을 고려하세요. 또한 기본 json-file 로깅 드라이버는 프로덕션 환경에 적합하지 않다는 점에 유의하세요.