라파엘 우골리니 는 현재 벨기에 브뤼셀에 본사를 둔 풀스택 소프트웨어 개발업체입니다. He 는 10년 이상 소프트웨어 개발 분야에서 일해 왔으며 최근에는 웹 솔루션 디자인에 주력하고 있습니다. 개발 파이썬과 자바스크립트를 사용합니다. 라파엘 우골리니는 파모코의 수석 소프트웨어 개발자입니다.
소개
Docker는 전 세계 개발자들이 다음에서 애플리케이션을 실행하는 데 도움을 주는 훌륭한 프로젝트입니다. 컨테이너. 이렇게 하면 소프트웨어를 더 빨리 출시하는 데 도움이 될 뿐만 아니라 "내 컴퓨터에서 작동합니다"라는 유명한 문구도 얻을 수 있습니다. 이 글에서는 바로 사용할 수 있는 데이터베이스를 갖기 위해 웹 UI 상호 작용이 필요 없는 모듈식 Couchbase 이미지를 만드는 방법을 설명합니다.
모든 코드를 사용할 수 있습니다. 여기 온라인.
도커파일
첫 번째 단계는 도커파일을 만드는 것입니다.
카우치베이스 버전
1 |
FROM 카우치베이스/서버:엔터프라이즈-4.6.1 |
이 예제는 Couchbase Server Enterprise 4.6.1을 기반으로 하지만, 사용자 환경에서 실행 중인 특정 버전으로 자유롭게 변경할 수 있습니다.
메모리 구성
1 2 3 |
환경 메모리_쿼터 256 환경 INDEX_MEMORY_쿼터 256 환경 FTS_MEMORY_쿼터 256 |
여기의 모든 값은 MB 단위입니다:
- MEMORY_QUOTA: 노드당 데이터 서비스 램 할당량
- 인덱스 메모리 쿼터: 노드별 인덱스 서비스 램 할당량
- FTS_MEMORY_QUOTA: 노드 인덱스별 서비스 램 할당량
서비스
1 |
환경 서비스 "KV,N1QL,INDEX,FTS" |
생성된 노드에서 사용할 수 있는 서비스입니다:
- kv: 데이터
- n1ql: 쿼리
- 색인: 색인
- fts: 전체 텍스트 검색
자격 증명
1 2 |
환경 사용자 이름 "관리자" 환경 비밀번호 "비밀번호" |
카우치베이스 서버에서 사용할 사용자 이름과 비밀번호입니다.
클러스터 옵션
1 2 |
환경 클러스터_호스트 "" 환경 클러스터_리밸런스 "" |
이 옵션은 클러스터에 노드를 두 개 이상 추가하려는 경우에만 사용됩니다.
- 클러스터_호스트: 이 노드가 가입할 클러스터의 호스트 이름
- 클러스터 재조정: 노드가 조인된 후 클러스터를 재조정하려면 "true"를 설정합니다.
엔트리포인트
1 2 3 |
COPY 진입점.sh /구성-진입점.sh 엔트리포인트 ["/config-entrypoint.sh"] |
Couchbase Server 이미지는 이미 entrypoint.sh 스크립트와 함께 제공되므로 이를 재정의하고 싶지 않습니다. 여기서 요령은 entrypoint.sh 버전을 /config-entrypoint.sh에 복사하고, 백그라운드에서 Couchbase Server entrypoint.sh를 실행한 다음, 노드를 구성한 후 스크립트를 원본에 다시 첨부하는 것입니다. 엔트리포인트.
엔트리포인트
그리고 엔트리포인트 는 카우치베이스 서버 이미지의 원본 스크립트와 함께 사용됩니다. 어떻게 작동하는지 한 줄 한 줄 살펴보겠습니다.
카우치베이스 서버 초기화
1 2 3 4 |
# 모니터 모드(카우치베이스 엔트리포인트에 연결할 때 사용) set -m # 백그라운드로 보내기 /진입점.sh 카우치베이스-서버 & |
먼저 set -m을 사용하여 작업 제어, 백그라운드에서 실행되는 프로세스(원본과 같은 엔트리포인트)를 별도의 프로세스 그룹에서 실행합니다. 이 옵션은 스크립트와 같은 비대화형 모드에서는 기본적으로 꺼져 있습니다.
유틸리티 기능
1 2 3 4 5 |
# 카우치베이스 서버가 가동 중인지 확인하기 check_db() { curl --침묵 http://127.0.0.1:8091/pools > /dev/null echo $? } |
이 함수는 카우치베이스 서버가 HTTP 호출에 응답하기 시작하는 시점을 확인하는 데 사용됩니다.
1 2 3 4 5 6 7 |
에코에 사용되는 # 변수 i=1 # 에코와 넘버링된_에코() { echo "[$i] $@" i=`expr $i + 1` } |
이것은 스크립트에서 에코 앞에 숫자를 추가하면 자동으로 걸음 수를 계산하는 유틸리티 함수입니다.
1 2 3 4 5 6 7 8 |
# JSON 구문 분석 및 클러스터에서 노드 가져오기 read_nodes() { cmd="import sys,json;" cmd="${cmd} print(','.join([node['otpNode']" cmd="${cmd} for node in json.load(sys.stdin)['nodes']" cmd="${cmd} ]))" python -c "${cmd}" } |
Couchbase Server API에서 노드의 출력을 구문 분석하기 위해 ython을 실행하여 다음을 읽는 함수를 사용하고 있습니다. STDIN를 사용하여 JSON과 Couchbase 노드로 변환합니다. 이는 리밸런싱에 사용됩니다.
노드 구성
1 2 3 4 5 6 7 8 |
# 준비될 때까지 기다림 까지 [[ $(check_db) = 0 ]]; do >&2 번호_echo "카우치베이스 서버를 사용할 수 있기를 기다리는 중" 수면 1 완료 echo "# 카우치베이스 서버 온라인" echo "# 설정 프로세스 시작" |
첫 번째 단계는 서버가 준비될 때까지 기다린 다음 다음 기능을 사용하는 것입니다. 넘버링된_에코 에서 Couchbase Server가 API 호출을 사용할 수 있게 되는 데 걸린 시간을 확인할 수 있습니다.
1 2 3 4 |
호스트 이름=`호스트 이름 -f` # 초기화 단계 i=1 |
그런 다음 변수를 설정합니다. 호스트 이름 를 사용하여 모든 API 호출에 사용하도록 설정하고 카운터도 넘버링된_에코 1로 설정하면 됩니다.
1 2 3 4 5 6 7 8 |
번호_echo "노드 초기화" curl --침묵 "http://${HOSTNAME}:8091/nodes/self/controller/settings" \ -d 경로="/옵트/카우치베이스/변수/라이브/카우치베이스/데이터" \ -d index_path="/옵트/카우치베이스/변수/라이브/카우치베이스/데이터" 번호_echo "호스트 이름 설정" curl --침묵 "http://${HOSTNAME}:8091/node/controller/rename" \ -d 호스트 이름=${호스트 이름} |
먼저 디스크 스토리지 구성을 설정한 다음 호스트 이름을 설정합니다.
클러스터에 참여하기
1 2 3 4 5 6 7 8 |
만약 [[ ${클러스터_호스트} ]];다음 번호_echo "클러스터 ${CLUSTER_HOST} 가입" curl --침묵 -u ${사용자 이름}:${비밀번호} \ "http://${CLUSTER_HOST}:8091/controller/addNode" \ -d 호스트 이름="${호스트명}" \ -d 사용자="${사용자 이름}" \ -d 비밀번호="${비밀번호}" \ -d 서비스="${서비스}" > /dev/null |
만약 클러스터_호스트 가 설정되어 있으면 스크립트가 현재 컨테이너 를 클러스터에 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
만약 [[ ${클러스터_재조정} ]]; 다음 # "절전 모드에서 예기치 않은 서버 오류 발생 2 수면 2 번호_echo "노드 검색" 알려진 노드=$( curl --침묵 -u ${사용자 이름}:${비밀번호} http://${CLUSTER_HOST}:8091/pools/default | read_nodes ) 번호_echo "클러스터 재조정" curl -u ${사용자 이름}:${비밀번호} \ "http://${CLUSTER_HOST}:8091/controller/rebalance" \ -d 알려진 노드="${known_nodes}" fi else |
클러스터에 노드를 추가한 후 스크립트에서 변수를 확인할 수도 있습니다. 클러스터_재조정 를 실행하여 클러스터를 자동으로 재조정해야 하는지 확인합니다. 여기에서 Python 함수를 사용하여 다음에서 노드를 읽습니다. /pools/default 엔드포인트.
클러스터에 참여하지 않음
1 2 3 4 5 |
번호_echo "메모리 설정" curl --침묵 "http://${HOSTNAME}:8091/pools/default" \ -d 메모리 쿼터=${MEMORY_QUOTA} \ -d 인덱스메모리쿼터=${인덱스_메모리_쿼터} \ -d ftsMemoryQuota=${fts_memory_quota} |
서비스에 대한 메모리 설정.
1 2 3 |
번호_echo "서비스 설정" curl --침묵 "http://${HOSTNAME}:8091/node/controller/setupServices" \ -d 서비스="${서비스}" |
노드에서 사용할 서비스입니다.
1 2 3 4 5 6 7 |
번호_echo "사용자 자격 증명 설정하기" curl --침묵 "http://${HOSTNAME}:8091/settings/web" \ -d 포트=8091 \ -d 사용자 이름=${사용자 이름} \ -d 비밀번호=${비밀번호} > /dev/null fi |
노드에 대한 자격 증명을 설정합니다.
마무리
1 2 3 |
# 카우치베이스 엔트리포인트에 연결 번호_echo "카우치베이스-서버 엔트리포인트에 연결" fg 1 |
스크립트를 종료하려면 원본에 스크립트를 첨부합니다. 엔트리포인트.
예
사용 방법을 보여드리기 위해 다음 이미지에 등록된 이미지를 사용하겠습니다. 도커 허브 코드와 함께 여기.
단일 노드
1 2 3 4 5 6 7 |
도커 실행 -ti --이름 카우치베이스-서버-nosetup \ -h node1.클러스터 \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -p 21100-21299:21100-21299 \ 루골리니/카우치베이스-서버-nosetup |
이는 필요한 최소 메모리와 기본 자격 증명을 사용하여 단일 노드를 실행합니다(관리자/비밀번호) 이미지에 등록되어 있습니다. 모든 네트워크 포트 카우치베이스 서버 사용도 노출됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
도커 실행 -ti --이름 카우치베이스-서버-nosetup \ -h node1.클러스터 \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -e MEMORY_QUOTA=512 \ -e 인덱스_메모리_쿼터=512 \ -e fts_memory_quota=512 \ -e 사용자 이름=관리자 \ -e 비밀번호=관리자 \ -p 21100-21299:21100-21299 \ 루골리니/카우치베이스-서버-nosetup |
위의 명령은 Docker파일에서 사용할 수 있는 환경 변수를 약간 사용합니다.
클러스터
이 예제에서는 클러스터에 3개의 노드를 연결합니다.
1 |
도커 네트워크 create 카우치베이스 |
먼저 모든 노드를 연결할 네트워크 카우치베이스를 만들어야 합니다.
1 2 3 4 5 6 7 8 |
도커 실행 -ti --이름 node1.클러스터 \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -p 21100-21299:21100-21299 \ -h node1.클러스터 \ --네트워크=카우치베이스 \ 루골리니/카우치베이스-서버-nosetup |
그런 다음 첫 번째 노드를 생성합니다.
1 2 3 4 5 6 |
도커 실행 -ti --이름 node2.클러스터 \ --네트워크=카우치베이스 \ -h node2.클러스터 \ -e 클러스터_호스트=node1.클러스터 \ -e 클러스터_재조정=true \ 루골리니/카우치베이스-서버-nosetup |
모든 네트워크 포트는 첫 번째 노드에 노출되어 있으므로 여기에 노출할 필요가 없습니다.
다음과 같은 세부 사항에 주의하세요. 클러스터_호스트 로 설정되어 있습니다. node1.cluster (첫 번째 노드의 호스트 이름)와 클러스터_재조정 도 true. 노드가 클러스터에 추가되면 자동으로 재조정됩니다.
1 2 3 4 5 |
도커 실행 -ti --이름 node3.클러스터 \ --네트워크=카우치베이스 \ -h node3.클러스터 \ -e 클러스터_호스트=node1.클러스터 \ 루골리니/카우치베이스-서버-nosetup |
노드3도 클러스터에 추가되지만, 이후 클러스터_재조정 가 설정되지 않은 경우 클러스터를 수동으로 재조정해야 사용할 수 있게 됩니다.