Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ

우리의 μš”μ²­μ— 따라 Habr은 ν—ˆλΈŒλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. Kubernetes 그리고 μš°λ¦¬λŠ” 그것에 첫 번째 μΆœνŒλ¬Όμ„ κ²Œμž¬ν•˜κ²Œ 된 것을 기쁘게 μƒκ°ν•©λ‹ˆλ‹€. κ΅¬λ…ν•˜λ‹€!

μΏ λ²„λ„€ν‹°μŠ€λŠ” μ‰½μŠ΅λ‹ˆλ‹€. λˆ„κ΅¬λ‚˜ 단 λͺ‡ μ‹œκ°„ λ§Œμ— 이 κΈ°μˆ μ„ λ§ˆμŠ€ν„°ν•  수 μžˆλŠ”λ° μ€ν–‰μ—μ„œ 이 λΆ„μ•Όμ—μ„œ μΌν•˜κΈ° μœ„ν•΄ λ§Žμ€ λˆμ„ μ§€λΆˆν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ

μΏ λ²„λ„€ν‹°μŠ€λ₯Ό κ·Έλ ‡κ²Œ 빨리 배울 수 μžˆλŠ”μ§€ μ˜μ‹¬μ΄ λ“ λ‹€λ©΄ 직접 ν•΄λ³΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 즉, 이 자료λ₯Ό λ§ˆμŠ€ν„°ν•˜λ©΄ Kubernetes ν΄λŸ¬μŠ€ν„°μ—μ„œ 마이크둜 μ„œλΉ„μŠ€λ₯Ό 기반으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ œκ°€ μ—¬κΈ°μ„œ κ³ κ°μ—κ²Œ Kubernetes둜 μž‘μ—…ν•˜λŠ” 방법을 κ°€λ₯΄μΉ˜λŠ” 데 μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•œ 방법둠을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 이것을 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ°€μ΄λ“œκ°€ λ‹€λ₯Έ κ°€μ΄λ“œμ™€ λ‹€λ₯Έ 점은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? 사싀, λ§Žμ€ 것듀이 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ΄λŸ¬ν•œ 자료의 λŒ€λΆ€λΆ„μ€ Kubernetes의 κ°œλ…κ³Ό kubectl λͺ…λ Ήμ˜ κΈ°λŠ₯κ³Ό 같은 λ‹¨μˆœν•œ λ‚΄μš©μ— λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ‹œμž‘λ©λ‹ˆλ‹€. 이 κΈ°μ‚¬μ˜ μž‘μ„±μžλŠ” λ…μžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 Docker μ»¨ν…Œμ΄λ„ˆμ— μ΅μˆ™ν•˜λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ‹€λ₯Έ λ°©ν–₯으둜 갈 κ²ƒμž…λ‹ˆλ‹€. λ¨Όμ € μ»΄ν“¨ν„°μ—μ„œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό 기반으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 방법에 λŒ€ν•΄ 이야기해 λ³΄κ² μŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ 각 마이크둜 μ„œλΉ„μŠ€μ— λŒ€ν•œ μ»¨ν…Œμ΄λ„ˆ 이미지 λΉŒλ“œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ Kubernetes에 λŒ€ν•΄ μ•Œμ•„λ³΄κ³  Kubernetesκ°€ κ΄€λ¦¬ν•˜λŠ” ν΄λŸ¬μŠ€ν„°μ—μ„œ 마이크둜 μ„œλΉ„μŠ€ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포λ₯Ό λΆ„μ„ν•©λ‹ˆλ‹€.

μΏ λ²„λ„€ν‹°μŠ€μ— λŒ€ν•œ 점진적인 μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λŠ” 이 μ ‘κ·Ό 방식은 λͺ¨λ“  것이 μΏ λ²„λ„€ν‹°μŠ€μ— μ–΄λ–»κ²Œ κ°„λ‹¨ν•˜κ²Œ λ°°μ—΄λ˜μ–΄ μžˆλŠ”μ§€ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ 일반인이 ν•„μš”λ‘œ ν•˜λŠ” 상황에 λŒ€ν•œ 깊이 μžˆλŠ” 이해λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μΏ λ²„λ„€ν‹°μŠ€λ₯Ό λ§ˆμŠ€ν„°ν•˜λ €λŠ” μ‚¬λžŒμ΄λΌλ©΄ λˆ„κ΅¬λ‚˜ μ‚¬μš© μœ„μΉ˜μ™€ 방법을 μ•ˆλ‹€λ©΄ μΏ λ²„λ„€ν‹°μŠ€λŠ” λΆ„λͺ… λ‹¨μˆœν•œ κΈ°μˆ μž…λ‹ˆλ‹€.

이제 더 이상 κ³ λ―Όν•˜μ§€ μ•Šκ³  μž‘μ—…μ„ μ‹œμž‘ν•˜κ³  μž‘μ—…ν•  μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ‹€ν—˜μ  μ•±

우리의 μ‘μš© ν”„λ‘œκ·Έλž¨μ€ ν•˜λ‚˜μ˜ κΈ°λŠ₯만 μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν•œ λ¬Έμž₯을 μž…λ ₯으둜 받은 ν›„ ν…μŠ€νŠΈ 뢄석 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ 이 λ¬Έμž₯에 λŒ€ν•œ 감정 뢄석을 μˆ˜ν–‰ν•˜μ—¬ νŠΉμ • λŒ€μƒμ— λŒ€ν•œ λ¬Έμž₯ μž‘μ„±μžμ˜ 감정적 νƒœλ„λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€.

이것은 이 μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ κΈ°λ³Έ μ°½ λͺ¨μ–‘μž…λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
감정 뢄석 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜

기술적인 κ΄€μ μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ XNUMX개의 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ‘œ κ΅¬μ„±λ˜λ©° 각 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λŠ” νŠΉμ • μž‘μ—… μ„ΈνŠΈλ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

  • SA-FrontendλŠ” React 정적 νŒŒμΌμ„ μ œκ³΅ν•˜λŠ” Nginx μ›Ή μ„œλ²„μž…λ‹ˆλ‹€.
  • SA-WebApp은 ν”„λŸ°νŠΈμ—”λ“œμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” Java둜 μž‘μ„±λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.
  • SA-Logic은 ν…μŠ€νŠΈ 감정 뢄석을 μˆ˜ν–‰ν•˜λŠ” Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λŠ” κ³ λ¦½λ˜μ–΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그듀은 "직무 뢄리"λΌλŠ” 아이디어λ₯Ό κ΅¬ν˜„ν•˜μ§€λ§Œ λ™μ‹œμ— μ„œλ‘œ μƒν˜Έ μž‘μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터 흐름

μœ„μ˜ λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터 흐름을 μ„€λͺ…ν•˜λŠ” μ‹œμŠ€ν…œμ˜ 단계 번호λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 그것듀을 λΆ„ν•΄ν•©μ‹œλ‹€:

  1. λΈŒλΌμš°μ €κ°€ μ„œλ²„μ—μ„œ νŒŒμΌμ„ μš”μ²­ν•©λ‹ˆλ‹€. index.html (μ΄λŠ” μ°¨λ‘€λ‘œ React μ•± νŒ¨ν‚€μ§€λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€).
  2. μ‚¬μš©μžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μƒν˜Έ μž‘μš©ν•˜λ©° 이둜 인해 Spring 기반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  3. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν…μŠ€νŠΈλ₯Ό ꡬ문 λΆ„μ„ν•˜λΌλŠ” μš”μ²­μ„ Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
  4. Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν…μŠ€νŠΈμ˜ 감정을 λΆ„μ„ν•˜κ³  μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  5. Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 응닡을 λ³΄λƒ…λ‹ˆλ‹€(결과적으둜 μ‚¬μš©μžμ—κ²Œ ꡬ문 λΆ„μ„λœ ν…μŠ€νŠΈμ˜ κ²°κ³Ό ν‘œμ‹œ).

μ΄λŸ¬ν•œ λͺ¨λ“  μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ μ½”λ“œλ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 여기에. μ•žμœΌλ‘œ ν₯미둜운 μ‹€ν—˜μ΄ 많이 있기 λ•Œλ¬Έμ— μ§€κΈˆ 이 μ €μž₯μ†Œλ₯Ό μžμ‹ μ—κ²Œ λ³΅μ‚¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

둜컬 λ¨Έμ‹ μ—μ„œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μž‘λ™ν•˜λ €λ©΄ μ„Έ 가지 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό λͺ¨λ‘ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ°€μž₯ 예쁜 ν”„λŸ°νŠΈ μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λΆ€ν„° μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

β–λ‘œμ»¬ κ°œλ°œμ„ μœ„ν•œ React μ„€μ •

React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €λ©΄ 컴퓨터에 Node.js ν”„λ ˆμž„μ›Œν¬μ™€ NPM을 μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 λͺ¨λ“  것을 μ„€μΉ˜ν•œ ν›„ 터미널을 μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ νŠΈ ν΄λ”λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. sa-frontend λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€.

npm install

ν΄λ”μ—μ„œ 이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ node_modules React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 쒅속성이 λ‘œλ“œλ˜λ©° κ·Έ 기둝은 νŒŒμΌμ— μžˆμŠ΅λ‹ˆλ‹€. package.json. λ™μΌν•œ 폴더에 쒅속성을 λ‹€μš΄λ‘œλ“œν•œ ν›„ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

npm start

그게 λ‹€μ•Ό. 이제 React 앱이 μ‹€ν–‰ 쀑이며 λΈŒλΌμš°μ € μ£Όμ†Œλ‘œ μ΄λ™ν•˜μ—¬ μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. localhost:3000. 그의 μ½”λ“œμ—μ„œ 무언가λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ €μ—μ„œ μ΄λŸ¬ν•œ λ³€κ²½ μ‚¬ν•­μ˜ 효과λ₯Ό μ¦‰μ‹œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ†Œμœ„ "ν•«" λͺ¨λ“ˆ ꡐ체 덕뢄에 κ°€λŠ₯ν•©λ‹ˆλ‹€. 덕뢄에 ν”„λŸ°νŠΈ μ—”λ“œ κ°œλ°œμ€ κ°„λ‹¨ν•˜κ³  즐거운 κ²½ν—˜μ΄ λ©λ‹ˆλ‹€.

β–ν”„λ‘œλ•μ…˜μ„ μœ„ν•œ React μ•± μ€€λΉ„

React 앱을 μ‹€μ œλ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이λ₯Ό 정적 파일 μ„ΈνŠΈλ‘œ λ³€ν™˜ν•˜κ³  μ›Ή μ„œλ²„λ₯Ό μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

React 앱을 λΉŒλ“œν•˜λ €λ©΄ λ‹€μ‹œ 터미널을 μ‚¬μš©ν•˜μ—¬ ν΄λ”λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. sa-frontend λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€.

npm run build

그러면 ν”„λ‘œμ νŠΈ 폴더에 디렉토리가 μƒμ„±λ©λ‹ˆλ‹€. build. μ—¬κΈ°μ—λŠ” React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μž‘λ™ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  정적 파일이 ν¬ν•¨λ©λ‹ˆλ‹€.

▍Nginx둜 정적 파일 제곡

λ¨Όμ € Nginx μ›Ή μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜κ³  μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 여기에 λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ„€μΉ˜ 및 μ‹€ν–‰ 지침을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ ν΄λ”μ˜ λ‚΄μš©μ„ 볡사해야 ν•©λ‹ˆλ‹€. sa-frontend/build ν΄λ”λ‘œ [your_nginx_installation_dir]/html.

이 μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‘°λ¦½ν•˜λŠ” λ™μ•ˆ μƒμ„±λœ 파일이 index.html μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [your_nginx_installation_dir]/html/index.html. 기본적으둜 Nginx μ„œλ²„κ°€ μ•‘μ„ΈμŠ€ν•  λ•Œ λ°œκΈ‰ν•˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€. μ„œλ²„κ°€ ν¬νŠΈμ—μ„œ μˆ˜μ‹  λŒ€κΈ°ν•˜λ„λ‘ κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 80, κ·ΈλŸ¬λ‚˜ νŒŒμΌμ„ νŽΈμ§‘ν•˜μ—¬ μ›ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©μž μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. [your_nginx_installation_dir]/conf/nginx.conf.

이제 λΈŒλΌμš°μ €λ₯Ό μ—΄κ³  λ‹€μŒμœΌλ‘œ μ΄λ™ν•˜μ‹­μ‹œμ˜€. localhost:80. React μ•± νŽ˜μ΄μ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
Nginx μ„œλ²„μ—μ„œ μ œκ³΅ν•˜λŠ” React μ•±

이제 ν•„λ“œμ— 무언가λ₯Ό μž…λ ₯ν•˜λ©΄ Type your sentence 그리고 λ²„νŠΌμ„ λˆ„λ₯΄μ„Έμš” Send - 아무것도 μ•ˆ 일어날거야. κ·ΈλŸ¬λ‚˜ μ½˜μ†”μ„ 보면 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μœ„μΉ˜λ₯Ό μ •ν™•νžˆ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό 뢄석해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

β–ν”„λŸ°νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ½”λ“œ 뢄석

파일의 μ½”λ“œλ₯Ό 보면 App.js, λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ Send 방법을 호좜 analyzeSentence(). 이 λ©”μ„œλ“œμ˜ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ™μ‹œμ— μ–‘μ‹μ˜ 주석이 μžˆλŠ” 각 행에 λŒ€ν•΄ λ‹€μŒκ³Ό 같은 사싀에 μ£Όμ˜ν•˜μ‹­μ‹œμ˜€. # НомСр, μ½”λ“œ μ•„λž˜μ— μ„€λͺ…이 μžˆμŠ΅λ‹ˆλ‹€. 같은 λ°©μ‹μœΌλ‘œ λ‹€λ₯Έ μ½”λ“œ 쑰각을 ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€.

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. POST μš”μ²­μ΄ 이루어진 URLμž…λ‹ˆλ‹€. 이 μ£Όμ†ŒλŠ” μ΄λŸ¬ν•œ μš”μ²­μ„ κΈ°λ‹€λ¦¬λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

2.μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ „μ†‘λœ μš”μ²­ λ³Έλ¬Έμž…λ‹ˆλ‹€. λ‹€μŒμ€ μš”μ²­ 본문의 μ˜ˆμž…λ‹ˆλ‹€.

{
    sentence: "I like yogobella!"
}

3.μš”μ²­μ— λŒ€ν•œ 응닡을 λ°›μœΌλ©΄ ꡬ성 μš”μ†Œμ˜ μƒνƒœκ°€ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. 이둜 인해 ꡬ성 μš”μ†Œκ°€ λ‹€μ‹œ λ Œλ”λ§λ©λ‹ˆλ‹€. 데이터(즉, μž…λ ₯ν•œ 데이터와 κ³„μ‚°λœ ν…μŠ€νŠΈ 점수λ₯Ό ν¬ν•¨ν•˜λŠ” JSON 개체)λ₯Ό μˆ˜μ‹ ν•˜λ©΄ ꡬ성 μš”μ†Œλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. Polarity쑰건이 μΆ©μ‘±λ˜λŠ” ν•œ. ꡬ성 μš”μ†Œλ₯Ό μ„€λͺ…ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

μ½”λ“œκ°€ κ½€ 잘 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ–΄μ¨Œλ“  여기에 무엇이 잘λͺ» λ˜μ—ˆμŠ΅λ‹ˆκΉŒ? μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ POST μš”μ²­μ„ λ³΄λ‚΄λ €λŠ” μ£Όμ†Œμ— 이 μš”μ²­μ„ μˆ˜λ½ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆλŠ” 것이 아직 아무것도 μ—†λ‹€κ³  κ°€μ •ν•œλ‹€λ©΄ λ‹Ήμ‹ μ˜ 생각이 μ˜³μ„ κ²ƒμž…λ‹ˆλ‹€. 즉, μ£Όμ†Œλ‘œ μ˜€λŠ” μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ http://localhost:8080/sentiment, Spring 기반의 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
POST μš”μ²­μ„ μˆ˜λ½ν•  수 μžˆλŠ” Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

▍Spring 기반 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •

Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜λ €λ©΄ JDK8 및 Mavenκ³Ό μ μ ˆν•˜κ²Œ κ΅¬μ„±λœ ν™˜κ²½ λ³€μˆ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 이 λͺ¨λ“  것을 μ„€μΉ˜ν•œ ν›„μ—λŠ” ν”„λ‘œμ νŠΈ μž‘μ—…μ„ 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

β–μ‘μš© ν”„λ‘œκ·Έλž¨μ„ jar 파일둜 μ••μΆ•

터미널을 μ‚¬μš©ν•˜μ—¬ ν΄λ”λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. sa-webapp λ‹€μŒ λͺ…령을 μž…λ ₯ν•˜μ‹­μ‹œμ˜€.

mvn install

ν΄λ”μ—μ„œ 이 λͺ…령을 μ‹€ν–‰ν•œ ν›„ sa-webapp 디렉토리가 μƒμ„±λ©λ‹ˆλ‹€ target. 이것은 파일둜 ν‘œμ‹œλ˜λŠ” jar νŒŒμΌμ— νŒ¨ν‚€μ§•λœ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžˆλŠ” μœ„μΉ˜μž…λ‹ˆλ‹€. sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

β–μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

ν΄λ”λ‘œ 이동 target λ‹€μŒ λͺ…λ ΉμœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

이 λͺ…령을 μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μˆ˜μ •μ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ μŠ€νƒ 좔적 λ°μ΄ν„°μ—μ„œ μ˜ˆμ™Έ μ„ΈλΆ€ 정보λ₯Ό ꡬ문 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

μš°λ¦¬μ—κ²Œ μ—¬κΈ°μ„œ κ°€μž₯ μ€‘μš”ν•œ 것은 의미λ₯Ό λͺ…ν™•νžˆ ν•  수 μ—†λ‹€λŠ” μ–ΈκΈ‰μž…λ‹ˆλ‹€. sa.logic.api.url. 였λ₯˜κ°€ λ°œμƒν•œ μ½”λ“œλ₯Ό 뢄석해 λ΄…μ‹œλ‹€.

β–μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ 뢄석

λ‹€μŒμ€ 였λ₯˜κ°€ λ°œμƒν•œ μ½”λ“œ μŠ€λ‹ˆνŽ«μž…λ‹ˆλ‹€.

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. Sμ—μ„œentimentController λ“€νŒμ΄ μžˆλ‹€ saLogicApiUrl. κ·Έ 값은 속성에 μ˜ν•΄ μ„€μ •λ©λ‹ˆλ‹€. sa.logic.api.url.
  2. μ„  saLogicApiUrl κ°’κ³Ό μ—°κ²° /analyse/sentiment. 그듀은 ν•¨κ»˜ ν…μŠ€νŠΈ 뢄석을 μˆ˜ν–‰ν•˜λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ μ£Όμ†Œλ₯Ό ν˜•μ„±ν•©λ‹ˆλ‹€.

▍속성 κ°’ μ„€μ •

Springμ—μ„œ 속성 κ°’μ˜ κΈ°λ³Έ μ†ŒμŠ€λŠ” νŒŒμΌμž…λ‹ˆλ‹€. application.propertiesμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. sa-webapp/src/main/resources. κ·ΈλŸ¬λ‚˜ 그것을 μ‚¬μš©ν•˜λŠ” 것이 속성 값을 μ„€μ •ν•˜λŠ” μœ μΌν•œ 방법은 μ•„λ‹™λ‹ˆλ‹€. λ‹€μŒ λͺ…λ ΉμœΌλ‘œλ„ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

이 μ†μ„±μ˜ 값은 Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ£Όμ†Œλ₯Ό κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€.

이λ₯Ό κ΅¬μ„±ν•¨μœΌλ‘œμ¨ ν…μŠ€νŠΈ ꡬ문 뢄석 μš”μ²­μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ 이동해야 ν•˜λŠ” μœ„μΉ˜λ₯Ό Spring μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ•Œλ €μ€λ‹ˆλ‹€.

우리의 삢을 λ³΅μž‘ν•˜κ²Œ λ§Œλ“€μ§€ μ•ŠκΈ° μœ„ν•΄ Python μ‘μš© ν”„λ‘œκ·Έλž¨μ„ λ‹€μŒμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ κ²°μ •ν•  κ²ƒμž…λ‹ˆλ‹€. localhost:5000 그리고 그것을 μžŠμ§€ μ•ŠμœΌλ €κ³  λ…Έλ ₯ν•˜μ„Έμš”. 결과적으둜 Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•˜λŠ” λͺ…령은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
μ‹œμŠ€ν…œμ— Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€.

이제 Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

▍Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •

Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €λ©΄ Python 3 및 Pipκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜λ©° μ μ ˆν•œ ν™˜κ²½ λ³€μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

▍쒅속성 μ„€μΉ˜

ν”„λ‘œμ νŠΈ ν΄λ”λ‘œ 이동 sa-logic/sa λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍앱 μ‹€ν–‰

쒅속성이 μ„€μΉ˜λ˜μ—ˆμœΌλ―€λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

python sentiment_analysis.py

이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

μ΄λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑이고 μš”μ²­μ„ 기닀리고 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. localhost:5000/

β–μ½”λ“œ 연ꡬ

μš”μ²­μ— μ‘λ‹΅ν•˜λŠ” 방법을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                                   #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                     #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. 개체 μ΄ˆκΈ°ν™” Flask.
  2. POST μš”μ²­μ„ ν•˜κΈ° μœ„ν•œ μ£Όμ†Œ 지정.
  3. 속성 검색 sentence μš”μ²­ λ³Έλ¬Έμ—μ„œ.
  4. 읡λͺ… 객체 μ΄ˆκΈ°ν™” TextBlob 그리고 κ°€μΉ˜λ₯Ό μ–»λŠ” polarity μš”μ²­ λ³Έλ¬Έμ—μ„œ 받은 첫 번째 μ œμ•ˆμ— λŒ€ν•΄(이 경우 뢄석을 μœ„ν•΄ 제좜된 μœ μΌν•œ μ œμ•ˆμž…λ‹ˆλ‹€).
  5. μ œμ•ˆμ˜ ν…μŠ€νŠΈμ™€ 이에 λŒ€ν•΄ κ³„μ‚°λœ μ§€ν‘œλ₯Ό ν¬ν•¨ν•˜λŠ” 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. polarity.
  6. λ‹€μŒμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” Flask μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 0.0.0.0:5000 (ν˜•μ‹μ˜ ꡬ성을 μ‚¬μš©ν•˜μ—¬ μ•‘μ„ΈμŠ€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. localhost:5000).

이제 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€κ°€ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€. 그듀은 μ„œλ‘œ μƒν˜Έ μž‘μš©ν•˜λ„λ‘ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 이 μž‘μ—… λ‹¨κ³„μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹€μ΄μ–΄κ·Έλž¨μ˜ λͺ¨μŠ΅μž…λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€κ°€ 정상 μƒνƒœκ°€ λ©λ‹ˆλ‹€.

이제 κ³„μ†ν•˜κΈ° 전에 λΈŒλΌμš°μ €μ—μ„œ React 앱을 μ—΄κ³  일뢀 λ¬Έμž₯을 ꡬ문 뢄석해 λ΄…λ‹ˆλ‹€. λͺ¨λ“  것이 μ˜¬λ°”λ₯΄κ²Œ μ™„λ£Œλ˜λ©΄ λ²„νŠΌμ„ λˆ„λ₯Έ ν›„ Send ν…μŠ€νŠΈ μƒμž μ•„λž˜μ— 뢄석 κ²°κ³Όκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

λ‹€μŒ μ„Ήμ…˜μ—μ„œλŠ” Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•©λ‹ˆλ‹€. μ΄λŠ” Kubernetes ν΄λŸ¬μŠ€ν„°μ—μ„œ μ‹€ν–‰ν•  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ€€λΉ„ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€.

도컀 μ»¨ν…Œμ΄λ„ˆ

Kubernetes μ»¨ν…Œμ΄λ„ˆν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 배포, ν™•μž₯ 및 관리λ₯Ό μžλ™ν™”ν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. "μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄ν„°"라고도 ν•©λ‹ˆλ‹€. Kubernetesκ°€ μ»¨ν…Œμ΄λ„ˆμ™€ ν•¨κ»˜ μž‘λ™ν•˜λŠ” 경우 이 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜κΈ° 전에 λ¨Όμ € μ΄λŸ¬ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό 확보해야 ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¨Όμ € μ»¨ν…Œμ΄λ„ˆκ°€ 무엇인지에 λŒ€ν•΄ 이야기해 λ΄…μ‹œλ‹€. μ•„λ§ˆλ„ 그것이 무엇인지에 λŒ€ν•œ μ§ˆλ¬Έμ— λŒ€ν•œ κ°€μž₯ 쒋은 λŒ€λ‹΅μ€ λ‹€μŒμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 선적 μ„œλ₯˜ λΉ„μΉ˜ λ„μ»€λ‘œ:

μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ, λŸ°νƒ€μž„ ν™˜κ²½, μ‹œμŠ€ν…œ 도ꡬ 및 라이브러리, 섀정을 μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  것을 ν¬ν•¨ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν¬ν•¨ν•˜λŠ” κ²½λŸ‰μ˜ 자체 포함 μ‹€ν–‰ κ°€λŠ₯ νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆν™”λœ ν”„λ‘œκ·Έλž¨μ€ Linux 및 Windows ν™˜κ²½ λͺ¨λ‘μ—μ„œ μ‚¬μš©ν•  수 있으며 인프라에 관계없이 항상 λ™μΌν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

즉, ν”„λ‘œλ•μ…˜ μ„œλ²„λ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  μ»΄ν“¨ν„°μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  수 있으며 λͺ¨λ“  ν™˜κ²½μ—μ„œ μ»¨ν…Œμ΄λ„ˆμ— ν¬ν•¨λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯을 νƒμƒ‰ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” λ‹€λ₯Έ 방법과 λΉ„κ΅ν•˜κΈ° μœ„ν•΄ 가상 λ¨Έμ‹ κ³Ό μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ œκ³΅ν•˜λŠ” 예λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

▍가상 머신을 μ‚¬μš©ν•˜μ—¬ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 정적 파일 제곡

가상 머신을 μ‚¬μš©ν•˜μ—¬ 정적 파일의 μœ μ§€ 관리λ₯Ό κ΅¬μ„±ν•˜λ €κ³  ν•˜λ©΄ λ‹€μŒκ³Ό 같은 단점이 μžˆμŠ΅λ‹ˆλ‹€.

  1. 각 가상 머신이 μ™„μ „ν•œ 운영 체제이기 λ•Œλ¬Έμ— λ¦¬μ†ŒμŠ€λ₯Ό λΉ„νš¨μœ¨μ μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  2. ν”Œλž«νΌ 쒅속성. 일뢀 둜컬 μ»΄ν“¨ν„°μ—μ„œ μž‘λ™ν•˜λŠ” 것이 ν”„λ‘œλ•μ…˜ μ„œλ²„μ—μ„œλŠ” μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 가상 λ¨Έμ‹  μ†”λ£¨μ…˜μ˜ 느리고 λ¦¬μ†ŒμŠ€ 집약적인 ν™•μž₯.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
가상 λ¨Έμ‹ μ—μ„œ μ‹€ν–‰λ˜λŠ” 정적 νŒŒμΌμ„ μ œκ³΅ν•˜λŠ” Nginx μ›Ή μ„œλ²„

μœ μ‚¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 가상 λ¨Έμ‹ κ³Ό 비ꡐ할 λ•Œ λ‹€μŒκ³Ό 같은 강점을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. λ¦¬μ†ŒμŠ€μ˜ 효율적인 μ‚¬μš©: Dockerλ₯Ό μ‚¬μš©ν•˜μ—¬ 운영 μ²΄μ œμ™€ μž‘μ—…ν•©λ‹ˆλ‹€.
  2. ν”Œλž«νΌ 독립성. κ°œλ°œμžκ°€ μžμ‹ μ˜ μ»΄ν“¨ν„°μ—μ„œ μ‹€ν–‰ν•  수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλŠ” μ–΄λ””μ—μ„œλ‚˜ μ‹€ν–‰λ©λ‹ˆλ‹€.
  3. 이미지 λ ˆμ΄μ–΄ μ‚¬μš©μ„ ν†΅ν•œ κ²½λŸ‰ 배포.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ˜λŠ” 정적 νŒŒμΌμ„ μ œκ³΅ν•˜λŠ” Nginx μ›Ή μ„œλ²„

μš°λ¦¬λŠ” 가상 λ¨Έμ‹ κ³Ό μ»¨ν…Œμ΄λ„ˆλ₯Ό λͺ‡ 가지 μ§€μ μ—μ„œ λΉ„κ΅ν–ˆμ„ λΏμ΄μ§€λ§Œ κ·Έκ²ƒλ§ŒμœΌλ‘œλ„ μ»¨ν…Œμ΄λ„ˆμ˜ 강점을 λŠλΌκΈ°μ— μΆ©λΆ„ν•©λ‹ˆλ‹€. 여기에 Docker μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ μ„ΈλΆ€ 정보λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

▍React μ•±μš© μ»¨ν…Œμ΄λ„ˆ 이미지 λΉŒλ“œ

Docker μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λ³Έ λΉŒλ”© 블둝은 νŒŒμΌμž…λ‹ˆλ‹€. Dockerfile. 이 파일의 μ‹œμž‘ 뢀뢄에 μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λ³Έ 이미지가 기둝된 λ‹€μŒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš”κ΅¬ 사항을 μΆ©μ‘±ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“œλŠ” 방법을 λ‚˜νƒ€λ‚΄λŠ” 일련의 지침이 ν¬ν•¨λ©λ‹ˆλ‹€.

파일 μž‘μ—…μ„ μ‹œμž‘ν•˜κΈ° 전에 Dockerfile, Nginx μ„œλ²„μ— μ—…λ‘œλ“œν•˜κΈ° μœ„ν•΄ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŒŒμΌμ„ μ€€λΉ„ν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•œ μž‘μ—…μ„ κΈ°μ–΅ν•˜μ‹­μ‹œμ˜€.

  1. React μ•± νŒ¨ν‚€μ§€ λΉŒλ“œ(npm run build).
  2. Nginx μ„œλ²„λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.
  3. 디렉토리 λ‚΄μš© 볡사 build ν”„λ‘œμ νŠΈ ν΄λ”μ—μ„œ sa-frontend μ„œλ²„ 폴더에 nginx/html.

μ•„λž˜μ—μ„œ μ»¨ν…Œμ΄λ„ˆ 생성과 둜컬 μ»΄ν“¨ν„°μ—μ„œ μˆ˜ν–‰λ˜λŠ” μœ„ μž‘μ—… μ‚¬μ΄μ˜ μœ μ‚¬μ μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

▍SA-Frontend μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ Dockerfile μ€€λΉ„

에 포함될 지침 Dockerfile 신청을 μœ„ν•΄ SA-Frontend, 단 두 νŒ€μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 사싀 Nginx κ°œλ°œνŒ€μ€ 기본적으둜 이미지 이미지λ₯Ό λΉŒλ“œν•˜λŠ” 데 μ‚¬μš©ν•  Nginx의 경우. μ„€λͺ…ν•΄μ•Ό ν•  두 λ‹¨κ³„λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. Nginx 이미지λ₯Ό μ΄λ―Έμ§€μ˜ 기반으둜 λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  2. 폴더 λ‚΄μš© sa-frontend/build 이미지 폴더에 볡사해야 ν•©λ‹ˆλ‹€. nginx/html.

이 μ„€λͺ…μ—μ„œ 파일둜 μ΄λ™ν•˜λ©΄ Dockerfile, 그러면 λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€.

FROM nginx
COPY build /usr/share/nginx/html

λ³΄μ‹œλ‹€μ‹œν”Ό μ—¬κΈ°μ˜ λͺ¨λ“  것은 맀우 κ°„λ‹¨ν•˜μ§€λ§Œ 파일의 λ‚΄μš©μ€ 읽기 쉽고 μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. 이 νŒŒμΌμ€ μ‹œμŠ€ν…œμ— 이미지λ₯Ό κ°€μ Έμ˜€λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€. nginx 이미 가지고 μžˆλŠ” λͺ¨λ“  것을 ν¬ν•¨ν•˜κ³  λ””λ ‰ν† λ¦¬μ˜ λ‚΄μš©μ„ λ³΅μ‚¬ν•©λ‹ˆλ‹€. build λ””λ ‰ν† λ¦¬λ‘œ nginx/html.

ν΄λ”μ—μ„œ νŒŒμΌμ„ μ •ν™•νžˆ 볡사할 μœ„μΉ˜λ₯Ό μ•„λŠ” 방법에 λŒ€ν•œ 질문이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. build, 즉 κ²½λ‘œλŠ” μ–΄λ””μ—μ„œ μ™”μŠ΅λ‹ˆκΉŒ? /usr/share/nginx/html. 사싀 여기에도 λ³΅μž‘ν•œ 것은 μ—†μŠ΅λ‹ˆλ‹€. 사싀 κ΄€λ ¨ μ •λ³΄λŠ” λ‹€μŒμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. μ„€λͺ… μ˜μƒ.

▍이미지λ₯Ό μ‘°ν•©ν•˜μ—¬ μ €μž₯μ†Œμ— μ—…λ‘œλ“œ

μ™„μ„±λœ μ΄λ―Έμ§€λ‘œ μž‘μ—…ν•˜λ €λ©΄ 이미지 μ €μž₯μ†Œμ— 이미지λ₯Ό μ œμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 무료 ν΄λΌμš°λ“œ 기반 이미지 ν˜ΈμŠ€νŒ… ν”Œλž«νΌμΈ Docker Hubλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 μž‘μ—… λ‹¨κ³„μ—μ„œ λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. μ„€μΉ˜ 도컀.
  2. Docker Hub μ‚¬μ΄νŠΈμ— λ“±λ‘ν•˜μ‹­μ‹œμ˜€.
  3. ν„°λ―Έλ„μ—μ„œ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ—¬ 계정에 λ‘œκ·ΈμΈν•©λ‹ˆλ‹€.
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

이제 터미널을 μ‚¬μš©ν•˜μ—¬ λ””λ ‰ν† λ¦¬λ‘œ 이동해야 ν•©λ‹ˆλ‹€. sa-frontend κ±°κΈ°μ—μ„œ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€.

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

μœ μ‚¬ν•œ λͺ…λ Ήμ—μ„œ 여기와 μ•„λž˜ $DOCKER_USER_ID Docker Hubμ—μ„œ μ‚¬μš©μž μ΄λ¦„μœΌλ‘œ λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λͺ…λ Ήμ˜ 이 뢀뢄은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. rinormaloku/sentiment-analysis-frontend.

이 경우 이 λͺ…령을 μ œκ±°ν•˜μ—¬ 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€. -f Dockerfile, 이 λͺ…령을 μ‹€ν–‰ν•˜λŠ” 폴더에 이미 이 파일이 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ™„μ„±λœ 이미지λ₯Ό λ¦¬ν¬μ§€ν† λ¦¬λ‘œ 보내렀면 λ‹€μŒ λͺ…령이 ν•„μš”ν•©λ‹ˆλ‹€.

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

μ™„λ£Œν•œ ν›„ Docker Hub의 리포지토리 λͺ©λ‘μ„ ν™•μΈν•˜μ—¬ 이미지가 ν΄λΌμš°λ“œ μ €μž₯μ†Œμ— μ„±κ³΅μ μœΌλ‘œ ν‘Έμ‹œλ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

β–μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ν•˜κΈ°

이제 λˆ„κ΅¬λ‚˜ λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. $DOCKER_USER_ID/sentiment-analysis-frontend. μ΄λ ‡κ²Œ ν•˜λ €λ©΄ λ‹€μŒ λͺ…λ Ή μ‹œν€€μŠ€λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

이제 μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이며 ν•„μš”ν•œ λ‹€λ₯Έ 이미지λ₯Ό μƒμ„±ν•˜μ—¬ 계속 μž‘μ—…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ³„μ†ν•˜κΈ° 전에 λ””μžμΈμ„ μ΄ν•΄ν•©μ‹œλ‹€. 80:80, 이미지λ₯Ό μ‹€ν–‰ν•˜λŠ” λͺ…령에 있으며 ν˜Όλž€μŠ€λŸ¬μ›Œ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 첫 번째 숫자 80 호슀트(즉, 둜컬 컴퓨터)의 포트 λ²ˆν˜Έμž…λ‹ˆλ‹€.
  • 두 번째 숫자 80 μš”μ²­μ„ λ¦¬λ””λ ‰μ…˜ν•΄μ•Ό ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ ν¬νŠΈμž…λ‹ˆλ‹€.

λ‹€μŒ 그림을 κ³ λ €ν•˜μ‹­μ‹œμ˜€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
포트 ν¬μ›Œλ”©

μ‹œμŠ€ν…œμ€ ν¬νŠΈμ—μ„œ μš”μ²­μ„ μ „λ‹¬ν•©λ‹ˆλ‹€. <hostPort> ν¬νŠΈλ‹Ή <containerPort>. 즉, ν¬νŠΈμ— μ•‘μ„ΈμŠ€ 80 컴퓨터가 포트둜 λ¦¬λ””λ ‰μ…˜λ¨ 80 μ»¨ν…Œμ΄λ„ˆ.

항ꡬ 이후 80 둜컬 μ»΄ν“¨ν„°μ—μ„œ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ—΄λ©΄ λ‹€μŒ μœ„μΉ˜μ—μ„œ 이 μ»΄ν“¨ν„°μ—μ„œ μ‘μš© ν”„λ‘œκ·Έλž¨μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. localhost:80. μ‹œμŠ€ν…œμ΄ Dockerλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” 경우 Docker 가상 λ¨Έμ‹ μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ†ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. <docker-machine ip>:80. Docker 가상 λ¨Έμ‹ μ˜ IP μ£Όμ†Œλ₯Ό 찾으렀면 λ‹€μŒ λͺ…령을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. docker-machine ip.

이 μ‹œμ μ—μ„œ ν”„λŸ°νŠΈ μ—”λ“œ μ•± μ»¨ν…Œμ΄λ„ˆκ°€ μ„±κ³΅μ μœΌλ‘œ μ‹œμž‘λ˜λ©΄ λΈŒλΌμš°μ €μ—μ„œ ν•΄λ‹Ή νŽ˜μ΄μ§€λ₯Ό μ—΄ 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

▍.dockerignore 파일

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이미지 λΉŒλ“œ SA-Frontend, 이 ν”„λ‘œμ„ΈμŠ€κ°€ 맀우 λŠλ¦¬λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 이미지 λΉŒλ“œ μ»¨ν…μŠ€νŠΈλ₯Ό Docker 데λͺ¬μœΌλ‘œ 보내야 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λΉŒλ“œ μ»¨ν…μŠ€νŠΈλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ””λ ‰ν† λ¦¬λŠ” λͺ…λ Ήμ˜ λ§ˆμ§€λ§‰ 인수둜 μ œκ³΅λ©λ‹ˆλ‹€. docker build. 우리의 경우 이 λͺ…λ Ή 끝에 점이 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 λ‹€μŒ ꡬ쑰가 μ–΄μ…ˆλΈ”λ¦¬ μ»¨ν…μŠ€νŠΈμ— ν¬ν•¨λ©λ‹ˆλ‹€.

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

κ·ΈλŸ¬λ‚˜ 여기에 μžˆλŠ” λͺ¨λ“  폴더 μ€‘μ—μ„œ ν΄λ”λ§Œ ν•„μš”ν•©λ‹ˆλ‹€. build. λ‹€λ₯Έ 것을 λ‹€μš΄λ‘œλ“œν•˜λŠ” 것은 μ‹œκ°„ λ‚­λΉ„μž…λ‹ˆλ‹€. λ¬΄μ‹œν•  디렉터리λ₯Ό Docker에 μ§€μ •ν•˜μ—¬ λΉŒλ“œ 속도λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” 파일이 ν•„μš”ν•©λ‹ˆλ‹€. .dockerignore. 당신은 νŒŒμΌμ— μ΅μˆ™ν•˜λ‹€λ©΄ .gitignore, 이 파일의 κ΅¬μ‘°λŠ” μ•„λ§ˆλ„ μΉœμˆ™ν•΄ 보일 κ²ƒμž…λ‹ˆλ‹€. 이미지 λΉŒλ“œ μ‹œμŠ€ν…œμ΄ λ¬΄μ‹œν•  수 μžˆλŠ” 디렉터리λ₯Ό λ‚˜μ—΄ν•©λ‹ˆλ‹€. 우리의 경우 이 파일의 λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

node_modules
src
public

파일 .dockerignore 파일과 같은 폴더에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. Dockerfile. 이제 이미지λ₯Ό μ‘°λ¦½ν•˜λŠ” 데 λͺ‡ μ΄ˆκ°€ κ±Έλ¦½λ‹ˆλ‹€.

이제 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 이미지λ₯Ό λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.

β–μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μš© μ»¨ν…Œμ΄λ„ˆ 이미지 λΉŒλ“œ

무엇을 μ•Œκ³  있으며 μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό λ§Œλ“œλŠ” 데 ν•„μš”ν•œ λͺ¨λ“  것을 이미 λ°°μ› μŠ΅λ‹ˆλ‹€. 이것이 이 μ„Ήμ…˜μ΄ 맀우 짧은 μ΄μœ μž…λ‹ˆλ‹€.

파일 μ—΄κΈ° Dockerfile, ν”„λ‘œμ νŠΈ 폴더에 μžˆμŠ΅λ‹ˆλ‹€. sa-webapp. 이 파일의 ν…μŠ€νŠΈλ₯Ό 읽으면 ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•˜λŠ” 두 개의 μƒˆλ‘œμš΄ ꡬ쑰만 λ§Œλ‚  수 μžˆμŠ΅λ‹ˆλ‹€. ENV ΠΈ EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

ν‚€μ›Œλ“œ ENV Docker μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 우리의 경우 ν…μŠ€νŠΈ 뢄석을 μˆ˜ν–‰ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ API에 μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•œ URL을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν‚€μ›Œλ“œ EXPOSE Dockerμ—κ²Œ 포트λ₯Ό 열도둝 μ§€μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜λŠ” λ™μ•ˆ 이 포트λ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 당신은 그것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ Dockerfile 신청을 μœ„ν•΄ SA-Frontend 그런 λͺ…령이 μ—†μŠ΅λ‹ˆλ‹€. 이것은 λ¬Έμ„œν™” λͺ©μ λ§Œμ„ μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. 즉, 이 κ΅¬μ‘°λŠ” λ…μžλ₯Ό μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. Dockerfile.

이미지λ₯Ό λΉŒλ“œν•˜κ³  λ¦¬ν¬μ§€ν† λ¦¬λ‘œ ν‘Έμ‹œν•˜λŠ” 것은 이전 μ˜ˆμ œμ™€ λ˜‘κ°™μŠ΅λ‹ˆλ‹€. 아직 μžμ‹ μ˜ λŠ₯λ ₯에 μžμ‹ μ΄ μ—†λ‹€λ©΄ νŒŒμΌμ—μ„œ ν•΄λ‹Ή λͺ…령을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. README.md 폴더에 sa-webapp.

▍Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μš© μ»¨ν…Œμ΄λ„ˆ 이미지 λΉŒλ“œ

파일 λ‚΄μš©μ„ 보면 Dockerfile 폴더에 sa-logic당신은 κ±°κΈ°μ—μ„œ μƒˆλ‘œμš΄ 것을 찾지 λͺ»ν•  κ²ƒμž…λ‹ˆλ‹€. 이미지λ₯Ό λΉŒλ“œν•˜κ³  λ¦¬ν¬μ§€ν† λ¦¬λ‘œ ν‘Έμ‹œν•˜λŠ” λͺ…령은 이미 μ΅μˆ™ν•  κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ κ²½μš°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ νŒŒμΌμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. README.md 폴더에 sa-logic.

β–μ»¨ν…Œμ΄λ„ˆν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν…ŒμŠ€νŠΈ

ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ€ 것을 μ‹ λ’°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λ„ λͺ»ν•΄. μ»¨ν…Œμ΄λ„ˆλ₯Ό ν…ŒμŠ€νŠΈν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. sa-logic ν¬νŠΈμ—μ„œ μˆ˜μ‹  λŒ€κΈ°ν•˜λ„λ‘ ꡬ성 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. sa-webapp ν¬νŠΈμ—μ„œ μˆ˜μ‹  λŒ€κΈ°ν•˜λ„λ‘ ꡬ성 8080. λ˜ν•œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μž¬ν• λ‹Ήν•˜μ—¬ Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš”μ²­μ„ μˆ˜μ‹ ν•  포트λ₯Ό μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

μ»¨ν…Œμ΄λ„ˆ λ˜λŠ” Docker VM의 IP μ£Όμ†Œλ₯Ό μ°ΎλŠ” 방법은 νŒŒμΌμ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. README.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

이제 λͺ¨λ“  것이 λΈŒλΌμš°μ €μ—μ„œ μ£Όμ†Œλ‘œ 이동할 μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. localhost:80 앱을 ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.

포트λ₯Ό λ³€κ²½ν•˜λŠ” 경우 sa-webappλ˜λŠ” Docker VM을 μ‹€ν–‰ 쀑인 경우 νŒŒμΌμ„ νŽΈμ§‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. App.js ν΄λ”μ—μ„œ sa-frontendλ©”μ„œλ“œμ—μ„œ IP μ£Όμ†Œ λ˜λŠ” 포트 번호λ₯Ό λ³€κ²½ν•˜μ—¬ analyzeSentence()였래된 데이터 λŒ€μ‹  ν˜„μž¬ 정보λ₯Ό λŒ€μ²΄ν•˜μ—¬. 그런 λ‹€μŒ 이미지λ₯Ό λ‹€μ‹œ μ‘°λ¦½ν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이것이 ν˜„μž¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹€μ΄μ–΄κ·Έλž¨μ˜ λͺ¨μŠ΅μž…λ‹ˆλ‹€.

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ
μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ˜λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€

μš”μ•½: Kubernetes ν΄λŸ¬μŠ€ν„°κ°€ ν•„μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

방금 νŒŒμΌμ„ κ²€ν† ν–ˆμŠ΅λ‹ˆλ‹€. Dockerfile, 이미지λ₯Ό λΉŒλ“œν•˜κ³  Docker 리포지토리에 ν‘Έμ‹œν•˜λŠ” 방법에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ 이미지 쑰립 속도λ₯Ό λ†’μ΄λŠ” 방법을 λ°°μ› μŠ΅λ‹ˆλ‹€. .dockerignore. 결과적으둜 우리의 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λŠ” ν˜„μž¬ Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μΏ λ²„λ„€ν‹°μŠ€κ°€ ν•„μš”ν•œ μ΄μœ μ— λŒ€ν•œ μ™„μ „νžˆ μ •λ‹Ήν•œ 질문이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ§ˆλ¬Έμ— λŒ€ν•œ 닡은 이 자료의 두 번째 λΆ€λΆ„μ—μ„œ λ‹€λ£° κ²ƒμž…λ‹ˆλ‹€. κ·Έ λ™μ•ˆ λ‹€μŒ μ§ˆλ¬Έμ„ κ³ λ €ν•˜μ‹­μ‹œμ˜€.
ν…μŠ€νŠΈ 뢄석 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ „ μ„Έκ³„μ μœΌλ‘œ 인기λ₯Ό μ–»μ—ˆλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 맀뢄 수백만 건의 μš”μ²­μ΄ κ·Έμ—κ²Œ μ˜΅λ‹ˆλ‹€. μ΄λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€κ°€ sa-webapp ΠΈ sa-logic μ—„μ²­λ‚œ 슀트레슀λ₯Ό λ°›κ²Œ λ©λ‹ˆλ‹€. λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό ν™•μž₯ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

Kubernetes μžμŠ΅μ„œ 1λΆ€: μ• ν”Œλ¦¬μΌ€μ΄μ…˜, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 및 μ»¨ν…Œμ΄λ„ˆ

좜처 : habr.com

μ½”λ©˜νŠΈλ₯Ό μΆ”κ°€