도커에서 챗봇 호스팅하기

정기용·2023년 8월 4일
0

Docker

목록 보기
4/4

도커(Docker)에서 웹서버 호스팅하기

도커(Docker)는 컨테이너 단위로 애플리케이션을 실행해주는 플랫폼이다. 로컬 환경에서 개발한 애플리케이션을 다른 환경에서 실행하면 패키지의 버전이 충돌하여 오류가 뜨는 경우가 많다. 라이브러리가 업데이트되며 이전 버전에서 사용하던 함수가 사장되거나, 각기 다른 라이브러리가 함께 의존중인 라이브러리에게 요구하는 버전이 다를 수 있다. 이런 충돌을 방지하고자 도커는 컨테이너에 애플리케이션을 위한 최적 환경을 구성한다. 그리고 컨테이너의 환경 정보와 애플리케이션이 모두 저장된 이미지 파일을 주고받는다. 도커는 로컬에서 작업한 애플리케이션을 클라우드 서버로 옮겨 실행하거나, 수십 년 전 작성된 코드를 당시 환경의 컨테이너에서 쾌적하게 실행할 수 있도록 돕는다. 어떤 작업이든 초기 환경설정에 소요되는 시간을 크게 절약할 수 있다.

도커의 컨테이너는 호스트 컴퓨터(컨테이너를 실행시킨 컴퓨터) 안에 독자적인 환경을 구축하여 애플리케이션을 실행한다. 때문에 컨테이너에서 웹서버를 호스팅할 때 호스트에서 하는 것과 몇 가지 차이점이 있다. 이 글에서 챗봇을 호스팅해보고 과정에서 필요한 설정들을 알아볼 것이다.

1. 도커 파일 작성

FROM python:3.10.11-bullsey
# FROM은 도커의 베이스 이미지를 나타낸다. 
# 챗봇은 python(.py)으로 작성됐으므로 python:3.10.11-bullseye을 사용했다.

COPY docker_chatbot_package docker_chatbot_package
# COPY는 로컬파일에서 작업한 파일들을 이미지에 저장하겠다는 의미다.
# 첫 번째 ‘docker_chatbot_package’는 로컬에서 복사할 폴더를 의미하고 두 번째는 컨테이너 안에 저장할 위치다.

WORKDIR /docker_chatbot_package
# WORKDIR은 컨테이너 안에서 커맨드의 시작 위치를 바꾼다. 
# ‘docker_chatbot_package’ 폴더 안에서 시작하도록 설정했다.

RUN pip install -r /docker_chatbot_package/requirements.txt
# RUN 은 커멘드 라인을 실행할 수 있도록 해준다. 
# requirements.txt 안에 적힌 패키지를 모두 다운받도록 했다. requirements.txt 의 내용은 다음과 같다.

EXPOSE 7860
# EXPOSE는 웹서버를 호스팅할 포트를 명시한다. 
# 7860번 포트로 호스팅을 하였다. 여기서 명시하더라도 컨테이너를 실행할 때 –p 옵션으로 컨테이너와 호스트 컴퓨터의 포트를 연결해야한다. 밑에서 컨테이너를 실행할 때 추가로 설명하겠다.

CMD ["python3", "web_test_gradio_ui_memo.py"]
# CMD는 컨테이너가 실행될 때 한 번만 실행할 명령어를 기술한다.
# ‘python3’로 ‘web_test_gradio_ui_memo.py’ 파일을 실행하도록 했다.
# ‘requirements.txt ’의 내용이다.
# 다운로드 받을 패키지 목록이다.
gradio
tiktoken
openai
pandas
scipy

2. Gradio를 활용한 챗봇 호스팅

이 글에서 챗봇의 구조를 자세히 다루지는 않는다. 하지만 호스팅 부분을 설명하기 위해 챗봇 제작에 사용한 Gradio를 간단히 소개하겠다. Gradio는 인공지능을 개발하고 테스트하기에 유용한 파이썬 프레임워크다. 파이썬으로 블록을 쌓듯이 UI를 구현하고, 호스팅할 수 있도록 해준다. 아래는 Fig 4.를 구현한 Gradio 코드의 일부다.

import gradio as gr
with gr.Blocks() as iface:
  … 화면 구현 …
iface.launch(share=True, server_name="0.0.0.0")

iface.launch()의 매개변수가 호스팅과 관련있다. ‘Share=True’로 설정시 월드와이드웹(World Wide Web, WWW)에 Gradio가 호스팅해준다. ‘Server_name’ 옵션은 파일을 호스팅할 로컬 주소를 뜻한다. ‘127.0.0.1‘로 설정하면 로컬에서 호스팅이 된다. ’0.0.0.0‘으로 설정하면 모든 IP주소에서 접속이 가능하다.

컨테이너라는 독자적 생태계

컨테이너는 고유의 환경 변수와 IP주소를 갖고 있다. 컨테이너 안의 IP주소는 도커가 부여한 가상의 값이기 때문에 호스트 컴퓨터의 IP주소 체계와 별개다. 컨테이너에서 ‘127.0.0.1’로 IP주소를 설정하면 컨테이너 자신을 의미한다.


> docker run –p 127.0.0.1:8000:8000 [IMAGE_NAME]
# 이미지를 빌드할 때, –p 옵션으로 컨테이너의 8000번 포트와 호스트 컴퓨터의 8000번 포트를 연결한다.
# 호스트 컴퓨터에서만 서버에 접속할 수 있다.

> docker run –p 8000:8000 [IMAGE_NAME]
# 마찬가지로 컨테이너와 호스트 컴퓨터의 8000번 포트를 연결한다.
# 외부 컴퓨터(IP가 127.0.0.1이 아닌 컴퓨터)도 포트를 통해 호스팅 서비스에 접근 가능하다.

Gradio에서 연결 IP주소를 ‘0.0.0.0’으로 설정해 두면 어떤 IP주소를 가진 컴퓨터도 접근할 수 있다. 하지만 컨테이너에 접속하려면 호스트 컴퓨터를 통해야 하므로 결국 호스트 컴퓨터만 접근이 가능하다. ‘docker run –p’ 옵션에서 호스트의 IP주소를 127.0.0.1:8000으로 명시하면 호스트만 포트를 연결한다. 이를 생략하면 호스트 이외의 컴퓨터도 ‘외부 컴퓨터-호스트-컨테이너’ 순서로 컨테이너의 서비스에 접근이 가능하다.

3. 도커파일 빌드 및 챗봇 컨테이너 호스팅

앞의 도커 파일을 빌드 하여 챗봇 이미지를 만든다. 이미지를 RUN하여 컨테이너를 만들고 호스팅해보자. 아래는 이와 관련된 코드다.

> docker build -t dokdo_chatbot .  
# 현재 폴더(마지막 . 이 현재 폴더 의미)의 ‘dockerfile’을 찾아 이미지로 build한다. 
# 이미지의 이름은 ‘dokdo_chatbot’이다 (-t 옵션).

> docker images
# 이미지 목록을 출력한다.
# 이미지 목록에 ‘dokdo_chatbot’이 있다면 이미지가 정상적으로 빌드된 것이다.

> docker volume create chatbot_chatlog
# 볼륨을 생성한다. 이름은 ‘chatbot_chatlog’이다.

> docker run -d –p 7860:7860 –v chatbot_chatlog:/dokdo_chatbot_package/data  --name my_chatbot dokdo_chatbot
# 챗봇 이미지를 실행한다. -p 옵션으로 7860포트를 연결한다.
# -d 옵션으로 컨테이너를 백그라운드에서 실행했다. 이 옵션을 없애면 컨테이너의 로그를 볼 수 있다.
# -v 옵션으로 컨테이너에 볼륨을 마운트했다. ‘chatbot_chatlog’ 볼륨을 컨테이너의 /dokdo_chatbot_package/data에 배치했다.
# --name 옵션으로 컨테이너의 이름을 ‘my_chatbot’으로 만들었다.

실행된 어플리케이션은 Fig 4.와 같다. ‘localhost:7860’에서 실행된 것을 확인할 수 있다.

정리하며

챗봇을 예제로 웹서버를 호스팅해보았다. 응용한다면 다양한 서비스를 도커에서 운영할 수 있을 것이다.

참고문헌
엘튼 스톤맨. 『도커 교과서』. 심효섭(역). 길벗, 2022.

profile
SKKU CS 23

0개의 댓글