라파엘 우골리니 는 현재 벨기에 브뤼셀에 본사를 둔 풀스택 소프트웨어 개발업체입니다. He 는 10년 이상 소프트웨어 개발 분야에서 일해 왔으며 최근에는 웹 솔루션 디자인에 주력하고 있습니다. 개발 파이썬과 자바스크립트를 사용합니다. 라파엘 우골리니는 파모코의 수석 소프트웨어 개발자입니다.
소개
Docker는 전 세계 개발자들이 다음에서 애플리케이션을 실행하는 데 도움을 주는 훌륭한 프로젝트입니다. 컨테이너. 이렇게 하면 소프트웨어를 더 빨리 출시하는 데 도움이 될 뿐만 아니라 "내 컴퓨터에서 작동합니다"라는 유명한 문구도 얻을 수 있습니다. 이 글에서는 바로 사용할 수 있는 데이터베이스를 갖기 위해 웹 UI 상호 작용이 필요 없는 모듈식 Couchbase 이미지를 만드는 방법을 설명합니다.
모든 코드를 사용할 수 있습니다. 여기 온라인.
도커파일
첫 번째 단계는 도커파일을 만드는 것입니다.
카우치베이스 버전
|
1 |
FROM couchbase/server:enterprise-4.6.1 |
이 예제는 Couchbase Server Enterprise 4.6.1을 기반으로 하지만, 사용자 환경에서 실행 중인 특정 버전으로 자유롭게 변경할 수 있습니다.
메모리 구성
|
1 2 3 |
ENV MEMORY_QUOTA 256 ENV INDEX_MEMORY_QUOTA 256 ENV FTS_MEMORY_QUOTA 256 |
여기의 모든 값은 MB 단위입니다:
- MEMORY_QUOTA: 노드당 데이터 서비스 램 할당량
- 인덱스 메모리 쿼터: 노드별 인덱스 서비스 램 할당량
- FTS_MEMORY_QUOTA: 노드 인덱스별 서비스 램 할당량
서비스
|
1 |
ENV SERVICES "kv,n1ql,index,fts" |
생성된 노드에서 사용할 수 있는 서비스입니다:
- kv: 데이터
- n1ql: 쿼리
- 색인: 색인
- fts: 전체 텍스트 검색
자격 증명
|
1 2 |
ENV USERNAME "Administrator" ENV PASSWORD "password" |
카우치베이스 서버에서 사용할 사용자 이름과 비밀번호입니다.
클러스터 옵션
|
1 2 |
ENV CLUSTER_HOST "" ENV CLUSTER_REBALANCE "" |
이 옵션은 클러스터에 노드를 두 개 이상 추가하려는 경우에만 사용됩니다.
- 클러스터_호스트: 이 노드가 가입할 클러스터의 호스트 이름
- 클러스터 재조정: 노드가 조인된 후 클러스터를 재조정하려면 "true"를 설정합니다.
엔트리포인트
|
1 2 3 |
COPY entrypoint.sh /config-entrypoint.sh ENTRYPOINT ["/config-entrypoint.sh"] |
Couchbase Server 이미지는 이미 entrypoint.sh 스크립트와 함께 제공되므로 이를 재정의하고 싶지 않습니다. 여기서 요령은 entrypoint.sh 버전을 /config-entrypoint.sh에 복사하고, 백그라운드에서 Couchbase Server entrypoint.sh를 실행한 다음, 노드를 구성한 후 스크립트를 원본에 다시 첨부하는 것입니다. 엔트리포인트.
엔트리포인트
그리고 엔트리포인트 는 카우치베이스 서버 이미지의 원본 스크립트와 함께 사용됩니다. 어떻게 작동하는지 한 줄 한 줄 살펴보겠습니다.
카우치베이스 서버 초기화
|
1 2 3 4 |
# Monitor mode (used to attach into couchbase entrypoint) set -m # Send it to background /entrypoint.sh couchbase-server & |
먼저 set -m을 사용하여 작업 제어, 백그라운드에서 실행되는 프로세스(원본과 같은 엔트리포인트)를 별도의 프로세스 그룹에서 실행합니다. 이 옵션은 스크립트와 같은 비대화형 모드에서는 기본적으로 꺼져 있습니다.
유틸리티 기능
|
1 2 3 4 5 |
# Check if couchbase server is up check_db() { curl --silent https://127.0.0.1:8091/pools > /dev/null echo $? } |
이 함수는 카우치베이스 서버가 HTTP 호출에 응답하기 시작하는 시점을 확인하는 데 사용됩니다.
|
1 2 3 4 5 6 7 |
# Variable used in echo i=1 # Echo with numbered_echo() { echo "[$i] $@" i=`expr $i + 1` } |
이것은 스크립트에서 에코 앞에 숫자를 추가하면 자동으로 걸음 수를 계산하는 유틸리티 함수입니다.
|
1 2 3 4 5 6 7 8 |
# Parse JSON and get nodes from the cluster 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 |
# Wait until it's ready until [[ $(check_db) = 0 ]]; do >&2 numbered_echo "Waiting for Couchbase Server to be available" sleep 1 done echo "# Couchbase Server Online" echo "# Starting setup process" |
첫 번째 단계는 서버가 준비될 때까지 기다린 다음 다음 기능을 사용하는 것입니다. 넘버링된_에코 에서 Couchbase Server가 API 호출을 사용할 수 있게 되는 데 걸린 시간을 확인할 수 있습니다.
|
1 2 3 4 |
HOSTNAME=`hostname -f` # Reset steps i=1 |
그런 다음 변수를 설정합니다. 호스트 이름 를 사용하여 모든 API 호출에 사용하도록 설정하고 카운터도 넘버링된_에코 1로 설정하면 됩니다.
|
1 2 3 4 5 6 7 8 |
numbered_echo "Initialize the node" curl --silent "https://${HOSTNAME}:8091/nodes/self/controller/settings" \ -d path="/opt/couchbase/var/lib/couchbase/data" \ -d index_path="/opt/couchbase/var/lib/couchbase/data" numbered_echo "Setting hostname" curl --silent "https://${HOSTNAME}:8091/node/controller/rename" \ -d hostname=${HOSTNAME} |
먼저 디스크 스토리지 구성을 설정한 다음 호스트 이름을 설정합니다.
클러스터에 참여하기
|
1 2 3 4 5 6 7 8 |
if [[ ${CLUSTER_HOST} ]];then numbered_echo "Joining cluster ${CLUSTER_HOST}" curl --silent -u ${USERNAME}:${PASSWORD} \ "https://${CLUSTER_HOST}:8091/controller/addNode" \ -d hostname="${HOSTNAME}" \ -d user="${USERNAME}" \ -d password="${PASSWORD}" \ -d services="${SERVICES}" > /dev/null |
만약 클러스터_호스트 가 설정되어 있으면 스크립트가 현재 컨테이너 를 클러스터에 추가합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if [[ ${CLUSTER_REBALANCE} ]]; then # "Unexpected server error without the sleep 2 sleep 2 numbered_echo "Retrieving nodes" known_nodes=$( curl --silent -u ${USERNAME}:${PASSWORD} https://${CLUSTER_HOST}:8091/pools/default | read_nodes ) numbered_echo "Rebalancing cluster" curl -u ${USERNAME}:${PASSWORD} \ "https://${CLUSTER_HOST}:8091/controller/rebalance" \ -d knownNodes="${known_nodes}" fi else |
클러스터에 노드를 추가한 후 스크립트에서 변수를 확인할 수도 있습니다. 클러스터_재조정 를 실행하여 클러스터를 자동으로 재조정해야 하는지 확인합니다. 여기에서 Python 함수를 사용하여 다음에서 노드를 읽습니다. /pools/default 엔드포인트.
클러스터에 참여하지 않음
|
1 2 3 4 5 |
numbered_echo "Setting up memory" curl --silent "https://${HOSTNAME}:8091/pools/default" \ -d memoryQuota=${MEMORY_QUOTA} \ -d indexMemoryQuota=${INDEX_MEMORY_QUOTA} \ -d ftsMemoryQuota=${FTS_MEMORY_QUOTA} |
서비스에 대한 메모리 설정.
|
1 2 3 |
numbered_echo "Setting up services" curl --silent "https://${HOSTNAME}:8091/node/controller/setupServices" \ -d services="${SERVICES}" |
노드에서 사용할 서비스입니다.
|
1 2 3 4 5 6 7 |
numbered_echo "Setting up user credentials" curl --silent "https://${HOSTNAME}:8091/settings/web" \ -d port=8091 \ -d username=${USERNAME} \ -d password=${PASSWORD} > /dev/null fi |
노드에 대한 자격 증명을 설정합니다.
마무리
|
1 2 3 |
# Attach to couchbase entrypoint numbered_echo "Attaching to couchbase-server entrypoint" fg 1 |
스크립트를 종료하려면 원본에 스크립트를 첨부합니다. 엔트리포인트.
예
사용 방법을 보여드리기 위해 다음 이미지에 등록된 이미지를 사용하겠습니다. 도커 허브 코드와 함께 여기.
단일 노드
|
1 2 3 4 5 6 7 |
docker run -ti --name couchbase-server-nosetup \ -h node1.cluster \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -p 21100-21299:21100-21299 \ rugolini/couchbase-server-nosetup |
이는 필요한 최소 메모리와 기본 자격 증명을 사용하여 단일 노드를 실행합니다(관리자/비밀번호) 이미지에 등록되어 있습니다. 모든 네트워크 포트 카우치베이스 서버 사용도 노출됩니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
docker run -ti --name couchbase-server-nosetup \ -h node1.cluster \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -e MEMORY_QUOTA=512 \ -e INDEX_MEMORY_QUOTA=512 \ -e FTS_MEMORY_QUOTA=512 \ -e USERNAME=admin \ -e PASSWORD=adminadmin \ -p 21100-21299:21100-21299 \ rugolini/couchbase-server-nosetup |
위의 명령은 Docker파일에서 사용할 수 있는 환경 변수를 약간 사용합니다.
클러스터
이 예제에서는 클러스터에 3개의 노드를 연결합니다.
|
1 |
docker network create couchbase |
먼저 모든 노드를 연결할 네트워크 카우치베이스를 만들어야 합니다.
|
1 2 3 4 5 6 7 8 |
docker run -ti --name node1.cluster \ -p 8091-8093:8091-8093 \ -p 11210:11210 \ -p 4369:4369 \ -p 21100-21299:21100-21299 \ -h node1.cluster \ --network=couchbase \ rugolini/couchbase-server-nosetup |
그런 다음 첫 번째 노드를 생성합니다.
|
1 2 3 4 5 6 |
docker run -ti --name node2.cluster \ --network=couchbase \ -h node2.cluster \ -e CLUSTER_HOST=node1.cluster \ -e CLUSTER_REBALANCE=true \ rugolini/couchbase-server-nosetup |
모든 네트워크 포트는 첫 번째 노드에 노출되어 있으므로 여기에 노출할 필요가 없습니다.
다음과 같은 세부 사항에 주의하세요. 클러스터_호스트 로 설정되어 있습니다. node1.cluster (첫 번째 노드의 호스트 이름)와 클러스터_재조정 도 true. 노드가 클러스터에 추가되면 자동으로 재조정됩니다.
|
1 2 3 4 5 |
docker run -ti --name node3.cluster \ --network=couchbase \ -h node3.cluster \ -e CLUSTER_HOST=node1.cluster \ rugolini/couchbase-server-nosetup |
노드3도 클러스터에 추가되지만, 이후 클러스터_재조정 가 설정되지 않은 경우 클러스터를 수동으로 재조정해야 사용할 수 있게 됩니다.
