라트노팜 차크라바티 는 현재 에릭슨에서 근무하는 소프트웨어 개발자입니다. 그는 오랫동안 IoT, 기계 간 기술, 커넥티드 카, 스마트 시티 분야에 집중해 왔습니다. 그는 새로운 기술을 배우고 이를 실무에 적용하는 것을 좋아합니다. 일하지 않을 때는 3살 난 아들과 함께 시간을 보내는 것을 즐깁니다.

소개
Couchbase를 Docker 컨테이너로 실행하는 것은 매우 쉽습니다. 최신 공식 Couchbase 이미지에서 상속하고 요구 사항에 따라 사용자 정의된 동작을 추가하기만 하면 됩니다. 이 글에서는 Spring Boot, Vaadin, 그리고 물론 Couchbase(백엔드로서)를 사용하여 웹 애플리케이션을 실행하는 방법(모두 Docker를 사용)을 보여드리겠습니다.
이 글은 2부로 구성된 시리즈 중 1부로서, Docker 도구 세트를 사용하여 Couchbase 기반의 완전한 기능을 갖춘 웹 애플리케이션을 NoSQL 백엔드로 실행하는 방법에 대해 설명합니다. 이 글에서는 Docker를 사용하여 Couchbase 환경을 설정하고 구성하는 단계를 설명하고, 웹 애플리케이션(이 경우에는 Vaadin을 사용하는 Spring Boot 애플리케이션)을 Docker화하는 방법과 CRUD 작업을 위해 Couchbase 백엔드에 연결하는 방법에 대해서도 언급할 것입니다.
전제 조건
Docker를 설정하고 작동시켜야 합니다. 설치에 대한 자세한 내용은 다음 링크를 참조하세요: https://docs.docker.com/engine/installation/ macOS 또는 Windows 10을 사용하는 경우 기본 Docker 패키지를 사용할 수 있습니다. 저처럼 이전 버전의 Windows(7 또는 8)를 사용 중이라면 Docker achine과 함께 제공되는 Docker Toolbox를 사용할 수 있습니다.
애플리케이션
저희는 서점을 관리하기 위한 간단한 CRUD 애플리케이션입니다. 애플리케이션 사용자는 제목 및/또는 저자 등의 정보를 입력하여 책을 추가할 수 있으며, 책 목록을 보고, 일부 정보를 편집하고, 책을 삭제할 수도 있습니다. 이 앱은 Spring Boot를 기반으로 구축되었습니다. 백엔드는 Couchbase 4.6으로 구동되며, 프론트엔드에는 Spring Boot 프레임워크와 매우 깔끔하게 통합되는 Vaadin 7을 사용했습니다.
이 앱을 구축하는 주요 단계는 다음과 같습니다:
- Docker를 사용하여 버킷 및 서비스 설정을 포함하여 Couchbase 4.6을 실행하고 구성합니다.
- Spring Boot, Vaadin 및 Couchbase를 사용하여 애플리케이션을 빌드합니다.
- 애플리케이션을 도커라이즈하고 실행합니다.
Docker를 사용하여 Couchbase 4.6 실행하기
Docker 호스트 IP를 확인합니다. 사용할 수 있습니다:
|
1 2 3 4 5 |
도커-machine IP 기본값 에 찾기 out 의 도커 호스트 IP 주소. 당신 can 또한 확인 의 환경 변수 by 하고 printenv | grep -i 도커 호스트; it would show 무언가 같은 이 -> DOCKER_HOST=tcp://192.168.99.100:2376 |
다음 작업은 카우치베이스를 실행하고 구성하기 위한 Docker파일을 작성하는 것입니다. 애플리케이션이 Couchbase 백엔드와 통신하려면 "books"라는 이름의 버킷을 설정하고 Couchbase 노드에서 인덱스 쿼리 서비스도 활성화해야 합니다. 이 모든 것을 위한 Docker 파일은 다음에서 찾을 수 있습니다. 여기.
Docker파일은 구성 스크립트를 사용하여 Couchbase 노드를 설정합니다. Couchbase는 쿼리, N1QL 및 인덱스와 같은 서비스를 쉽게 활성화할 수 있는 REST 엔드포인트를 제공합니다. 이러한 REST API를 사용하여 버킷을 설정할 수도 있습니다. 구성 스크립트는 다음에서 다운로드할 수 있습니다. 여기를 클릭하세요.
이제 Couchbase 이미지를 빌드하고 실행해 보겠습니다.
Docker파일이 있는 디렉토리로 이동합니다.
|
1 2 3 4 5 6 7 8 9 |
빌드 의 이미지 -> 도커 빌드 -t <chakrar27>/카우치베이스:책 . 교체 chakrar27 by 당신의 이미지-접두사 또는 도커 허브 id. 한 번 의 이미지 는 built, 확인 by 하고 $ 도커 이미지 |
리포지토리 태그 이미지 ID 생성된 크기
chakrar27/couchbase books 93e7ba199eef 1 시간 전 581 MB
couchbase 최신 337dab68d2d1 9 일 전 581 MB
다음을 입력하여 이미지를 실행합니다.
|
1 |
도커 실행 -p 8091-8093:8091-8093 -p 8094:8094 -p 11210:11210 chakrar27/카우치베이스:책 |
샘플 출력:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
시작 카우치베이스 서버 -- 웹 UI 사용 가능 에서 http://:8091 및 로그는 /opt/couchbase/var/lib/couchbase/logs에서 사용할 수 있습니다. 시작 구성 환경 by 호출 REST 엔드포인트 참고: 불필요한 사용 의 -X 또는 --요청, POST 는 이미 추론. * 시도 중 192.168.99.100... % 합계 % 수신됨 % Xferd 평균 속도 시간 시간 시간 현재 Dload 업로드 합계 소비 왼쪽 속도 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* 연결됨 에 127.0.0.1 (127.0.0.1) 포트 8091 (#0) > POST /풀/기본값 HTTP/1.1 > 호스트: 127.0.0.1:8091 > 사용자-에이전트: curl/7.49.1-DEV > 수락: */* > 콘텐츠 길이: 55 > 콘텐츠 유형: application/x-www-form-urlencoded > } [55 바이트 데이터] * 업로드가 완전히 전송되었습니다: 55바이트 중 55바이트 < http/1.1 200 ok < 서버: 카우치베이스 서버 < 프래그마: 캐시 없음 < 날짜 금, 24 Mar 2017 03:20:51 GMT < 콘텐츠 길이: 0 < 캐시 제어: 캐시 없음 < 100 55 0 0 100 55 0 2966 --:--:-- --:--:-- --:--:-- 3666 * 호스트 127.0.0.1에 대한 #0 연결은 그대로 유지됨 * 127.0.0.1 시도 중... % 총 % 수신 % X퍼드 평균 속도 시간 시간 현재 로드 업로드 총 남은 속도 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* 127.0.0.1(127.0.0.1) 포트 8091(#0)에 연결됨 > POST /node/controller/setupServices HTTP/1.1 > 호스트: 127.0.0.1:8091 > 사용자-에이전트: curl/7.49.1-DEV > 수락을 클릭합니다: */* > 콘텐츠-길이: 32 > 콘텐츠-유형: 애플리케이션/x-www-양식-urlencoded > } [32 바이트 데이터] * 업로드 완전히 보낸 꺼짐: 32 out 의 32 바이트 < HTTP/1.1 200 확인 < 서버: 카우치베이스 서버 < Pragma: 아니요-캐시 < 날짜: 금, 24 3월 2017 03:20:56 GMT < 콘텐츠-길이: 0 < 캐시-제어: 아니요-캐시 < 100 32 0 0 100 32 0 3389 --:--:-- --:--:-- --:--:-- 4000 * 연결 #0에서 호스트 127.0.0.1까지 그대로 유지됨 % 합계 % 수신됨 % Xferd 평균 속도 시간 시간 시간 현재 Dload 업로드 합계 소비 왼쪽 속도 100 180 100 152 100 28 8068 1486 --:--:-- --:--:-- --:--:-- 8444 HTTP/1.1 200 확인 서버: 카우치베이스 서버 Pragma: 아니요-캐시 날짜: 금, 24 3월 2017 03:21:01 GMT 콘텐츠-유형: 애플리케이션/json 콘텐츠-길이: 152 캐시-제어: 아니요-캐시 {"storageMode":"memory_optimized","indexerThreads":0,"메모리 스냅샷 간격":200,"안정적인 스냅샷 간격":5000,"최대 롤백 포인트":5,"logLevel":"정보"}참고: 불필요한 사용 의 -X 또는 --요청, POST 는 이미 추론. * 시도 중 127.0.0.1... % 합계 % 수신됨 % Xferd 평균 속도 시간 시간 시간 현재 Dload 업로드 합계 소비 왼쪽 속도 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* 연결됨 에 127.0.0.1 (127.0.0.1) 포트 8091 (#0) > POST /설정/웹 HTTP/1.1 > 호스트: 127.0.0.1:8091 > 사용자-에이전트: curl/7.49.1-DEV > 수락: */* > 콘텐츠 길이: 50 > 콘텐츠 유형: application/x-www-form-urlencoded > } [50바이트 데이터] * 업로드가 완전히 전송되었습니다: 50바이트 중 50바이트 < http/1.1 200 ok < 서버: 카우치베이스 서버 < 프래그마: 캐시 없음 < 날짜 금, 24 Mar 2017 03:21:01 GMT < 콘텐츠 유형: 애플리케이션/json < 콘텐츠 길이: 44 < 캐시 제어: 캐시 없음 < { [44 바이트 데이터] 100 94 100 44 100 50 1554 1765 --:--:-- --:--:-- --:--:-- 2380 * 호스트 127.0.0.1에 대한 #0 연결은 그대로 유지됨 {"newBaseUri":"http://127.0.0.1:8091/"}버킷 설정 시작 버킷 이름 = books 참고: -X 또는 --request를 불필요하게 사용하면 POST가 이미 추론됩니다. * 127.0.0.1 시도 중... % 총 % 수신 % X퍼드 평균 속도 시간 시간 현재 로드 업로드 총 남은 속도 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* 127.0.0.1(127.0.0.1) 포트 8091(#0)에 연결됨 * 사용자 '관리자'로 기본을 사용한 서버 인증 > POST /pools/default/buckets HTTP/1.1 > 호스트: 127.0.0.1:8091 > 인증: 기본 QWRtaW5pc3RyYXRvcjpwYXNzd29yZA== > 사용자-에이전트: curl/7.49.1-DEV > 수락을 클릭합니다: */* > 콘텐츠-길이: 55 > 콘텐츠-유형: 애플리케이션/x-www-양식-urlencoded > } [55 바이트 데이터] * 업로드 완전히 보낸 꺼짐: 55 out 의 55 바이트 < HTTP/1.1 202 수락됨 < 서버: 카우치베이스 서버 < Pragma: 아니요-캐시 < 위치: /풀/기본값/버킷/책 < 날짜: 금, 24 3월 2017 03:21:01 GMT < 콘텐츠-길이: 0 < 캐시-제어: 아니요-캐시 < 100 55 0 0 100 55 0 748 --:--:-- --:--:-- --:--:-- 820 * 연결 #0에서 호스트 127.0.0.1까지 그대로 유지됨 버킷 set up 완료 /진입점.sh 카우치베이스-서버 |
다음을 입력하여 구성을 확인합니다. http://192.168.99.100:8091 를 즐겨찾는 브라우저에 입력하세요.

사용자 아이디에 '관리자'를 입력하고 비밀번호 필드에 '비밀번호'를 입력한 다음 로그인을 클릭합니다.
Couchbase 노드의 설정을 확인하고 위에서 사용한 configure.sh와 일치하는지 확인합니다.

버킷 "책".

이 시점에서 백엔드 Couchbase 인프라가 가동되고 실행 중입니다. 이제 이 백엔드를 사용하여 기능적인 무언가를 만들 수 있는 애플리케이션을 구축해야 합니다.
Spring Boot, Vaadin, Couchbase를 사용하여 애플리케이션 빌드하기
start.spring.io로 이동하여 Couchbase를 종속성으로 추가합니다. 이렇게 하면 애플리케이션 클래스 경로에 spring-data-couchbase 라이브러리가 배치됩니다. Couchbase는 Spring Boot 에코시스템의 일류 시민으로 간주되므로, 런타임에 Spring Boot 자동 구성 기능을 사용하여 Couchbase 버킷에 액세스할 수 있습니다.
또한 프로젝트에 Vaadin을 종속성으로 추가하세요. UI 레이어를 빌드하는 데 사용할 것입니다.
프로젝트 객체 모델(pom) 파일은 다음과 같이 찾을 수 있습니다. 여기.
다음과 같이 Couchbase 리포지토리를 생성합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@인덱싱된 보기(디자인 문서 = "book") @N1qlPrimaryIndexed @N1qlSecondaryIndexed(인덱스 이름 = "책 보조 인덱스") public 인터페이스 북스토어 저장소 확장 카우치베이스 페이징 및 정렬 저장소<예약, Long> { 목록<예약> findAll(); 목록<예약> 작성자별 찾기(문자열 작성자); 목록<예약> findByTitleStartsWithIgnoreCase(문자열 title); 목록<예약> 카테고리별 찾기(문자열 카테고리); } |
이 주석은 뷰 기반 쿼리를 지원하기 위해 런타임에 "book"이라는 이름의 뷰가 제공되도록 합니다. N1QL 쿼리를 지원하기 위해 기본 인덱스가 생성됩니다. 또한 보조 인덱스도 제공됩니다.
메서드는 List을 반환하도록 정의되었습니다. 이는 스프링 데이터 카우치베이스에서 이미 백그라운드에서 제공되므로 구현을 제공할 필요가 없습니다.
엔티티를 정의해야 하는데, 이 경우 Book입니다. 문서에 주석을 달면 됩니다.
문서
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public 클래스 예약 { @Id 비공개 문자열 id = UUID.randomUUID().toString(); 비공개 문자열 title; 비공개 문자열 작성자; 비공개 문자열 isbn; 비공개 문자열 카테고리; } |
자동 구성을 사용하려면 아래와 같이 application.properties 또는 application.yml 파일을 사용하세요:
|
1 2 3 4 5 6 7 |
봄.카우치베이스.부트스트랩-호스트=127.0.0.1 봄.카우치베이스.버킷.이름=책 봄.카우치베이스.버킷.비밀번호= 봄.데이터.카우치베이스.자동-색인=true |
여기서 한 가지 주의해야 할 점은 애플리케이션 컨테이너가 실행될 때 Couchbase 컨테이너에 연결하고 자동 구성을 설정해야 한다는 것입니다. 속성 spring.couchbase.bootstrap-hosts 에는 Couchbase 노드의 IP 주소가 나열됩니다. 여기서는 127.0.0.1을 지정했는데, 런타임에 앱 컨테이너가 해당 IP에서 실행 중인 Couchbase 컨테이너를 찾지 못하기 때문에 작동하지 않습니다. 따라서 애플리케이션의 Docker 이미지를 실행할 때 환경 변수(env 변수)를 전달해야 합니다.
위에서 언급한 대로 환경 변수를 전달하려면 애플리케이션의 도커파일을 작성하여 spring.couchbase.bootstrap-hosts 속성을 환경 변수로 전달할 수 있습니다. 다음은 앱의 도커파일입니다:
|
1 2 3 4 5 6 7 8 9 |
FROM frolvlad/알파인-oraclejdk8:전체 볼륨 /tmp ADD 대상/서점-1.0.0-스냅샷.jar 앱.jar RUN sh -c '터치 /app.jar' CMD 자바 -Dspring.카우치베이스.부트스트랩-호스트=$호스트 -Djava.보안.egd=파일:/dev/./urandom -jar /앱.jar |
보시다시피, 우리는 기본적으로 spring.couchbase.bootstrap-hosts 환경 변수 HOSTS에 의해 application.properties 파일에 정의된 속성입니다.
이것이 스프링 부트를 Couchbase와 연결하기 위해 해야 할 거의 모든 것입니다.
UI(U 및 I)
UI의 경우 스프링-바딘 통합을 활용하고 있습니다. 저는 Vaadin 버전 7.7.3, vaadin-spring 버전 1.1.0, 그리고 유용한 Vaadin 애드온인 "Viritin"을 사용하고 있습니다. Viritin을 설치하려면 다음 종속성을 추가하세요:
|
1 2 3 4 5 6 7 8 9 |
<종속성> <groupId>org.vaadin</groupId> <artifactId>비리틴</artifactId> <버전>1.57</버전> </종속성> |
UI 클래스에 다음과 같이 주석을 추가합니다.
SpringUI
@Theme("valo")
public 클래스 BookstoreUI extends UI {
//////
}
그런 다음 리포지토리 메소드를 UI 요소와 연결합니다.
구현하는 빈은 CommandLineRunner 인터페이스는 일부 초기 값으로 데이터베이스를 미리 채우는 데 사용됩니다.
전체 소스 코드는 다음을 참조하세요. 이 링크.
애플리케이션 도커화
Maven을 사용하면 Spotify의 docker-maven 플러그인을 사용하여 애플리케이션을 매우 쉽게 도커화할 수 있습니다. pom.xml 파일 플러그인 섹션을 확인하세요.
또는 Docker 명령줄 -> ->을 사용하여 빌드할 수 있습니다.
|
1 |
도커 빌드 -t chakrar27/책:독립형 . |
그런 다음 이미지를 실행합니다 -> 앱 컨테이너가 Couchbase 컨테이너에 연결을 시도할 때 찾을 변수 HOSTS의 값을 전달해야 한다는 점에 유의하세요. 실행 명령은 다음과 같습니다:
|
1 |
도커 실행 -p 8080:8080 -e 호스트=192.168.99.100 chakrar27/책:독립형 |
애플리케이션이 시작되면 다음으로 이동합니다. http://192.168.99.100:8080/
다음 페이지가 표시됩니다:

항목을 편집하고 저장할 수 있습니다.

그 아래에서 실행되는 N1QL 쿼리가 제공하는 깔끔한 필터링 기능도 있습니다.

사용자는 새 책을 추가하고 기존 기록을 삭제할 수도 있습니다. 이 간단한 애플리케이션의 모든 CRUD(만들기/읽기/업데이트/삭제) 기능은 Couchbase N1QL 쿼리에 의해 구동되며, "BookStoreRepository"를 생성하여 활성화하고 "CouchbasePagingAndSortingRepository"를 차례로 확장합니다.
[...] Docker 도구 세트를 사용하여 Couchbase 기반, 완전한 기능을 갖춘 Spring Boot 웹 애플리케이션을 실행하세요. 시리즈의 1부에서는 [...]를 사용하여 두 개의 Docker 컨테이너를 실행하여 기능적인 애플리케이션을 실행하는 방법을 보여드렸습니다.