[docker] docker desktop 설치, 챗봇 서버 이미지 배포 테스트

윈도우에 WSL2 docker 설치 후 테스트 서버로 시운전까지 마쳐주고 설치해준 도커 서버는 삭제를 해주었습니다.

좀 더 편리한 환경을 위해 Docker Desktop을 설치해서 운용해보기로 합니다.

 

 

먼저 Docker Desktop 를 다운받아서 설치해줍니다. 아래 링크를 통해 진행 가능하며 디폴트로 설치 진행해주었습니다.

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

 

설치가 완료되어 실행된 모습입니다. 컨테이너도 이미지도 비어 있습니다. 리소스 파일 경로가 C드라이브로 잡혀있어서 D드라이브로 변경해보려 했는데 수십분이 지나도 변경이 안되고 먹통 상태여서 일단은 C드라이브로 해서 진행하기로 합니다.

 

파이썬 배포 패키지 작성

 

파이썬으로 작성된 카카오봇 UDP 서버를 docker 이미지로 배포하기 위한 작업을 진행합니다.

 

필요한 패키지를 명시해주기 위해 requirements 파일에 패키지 정보를 만들어줍니다.

pip freeze 명령어를 통해 

pip freeze > requirements.txt

필요한 패키지 목록이 작성됩니다. venv 환경에 임포프된 모든 패키지가 들어온듯 한데 이로 인해 생성된 이미지 사이즈가 2기가가 넘어가네요. 줄이는 방법을 찾아봐야 겠습니다.

 

 

Dockerfile 작성

 

Dockerfile을 작성해서 프로젝트 root 에 넣어줍니다. 

파이썬 버전이 3.6이어서 명시해주었습니다.

포트포워딩을 위한 포트 정보도 EXPOSE 명령어로 명시해주었습니다. http와 udp 포트 2개를 쓰고 있어서 둘다 명시해줍니다.

requirements.txt 파일에 명시된 패키지 설치를 위해 pip install 명령어도 실행시켜주도록 합니다.

FROM python:3.6
WORKDIR /app
COPY . /app
EXPOSE 19051 9050/udp
RUN pip install --no-cache-dir -r ./requirements.txt
CMD ["python", "./app/main.py"]

 

 

도커 이미지 생성

 

개발환경이 PyCharm이라서 Pycharm 뷰에서 제공해주는 Terminal 로 들어갑니다. 프로젝트 폴더에서 콘솔이 바로 뜨기 때문에 여기서 바로 배포를 위한 명령을 입력해줍니다.

 

docker build -t api_server:v1 ./

 

-t 옵션을 통해 name:tag 를 지정할 수 있습니다. 저는 이미지명을 api_server 로 잡았고 tag에는 v1 으로 버전정보를 나타내게 해주었습니다.

 

(venv) D:\PyCharm\Projects\apiServerForQuant>docker build -t api_server:v1 ./
[+] Building 72.7s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                    0.0s
 => => transferring dockerfile: 32B                                                                                     0.0s
 => [internal] load .dockerignore                                                                                       0.0s
 => => transferring context: 2B                                                                                         0.0s
 => [internal] load metadata for docker.io/library/python:3.6                                                           0.8s
 => [1/4] FROM docker.io/library/python:3.6@sha256:f8652afaf88c25f0d22354d547d892591067aa4026a7fa9a6819df9f300af6fc     0.0s
 => [internal] load build context                                                                                       1.4s
 => => transferring context: 1.94MB                                                                                     1.4s
 => CACHED [2/4] WORKDIR /app                                                                                           0.0s
 => [3/4] COPY . /app                                                                                                   1.6s
 => [4/4] RUN pip install --no-cache-dir -r ./requirements.txt                                                         66.0s
 => exporting to image                                                                                                  2.8s
 => => exporting layers                                                                                                 2.7s
 => => writing image sha256:7a9dae0331c55f81909f519771e86ff808e05f7fb7b465cfa8a3a8272a7e8367                            0.0s
 => => naming to docker.io/library/api_server:v1                                                                        0.0s

 

Docker Desktop에 api_server 이미지가 생성되었습니다.

 

 

도커 이미지 파일 내보내기

 

이렇게 생성된 도커 이미지를 운영서버 Docker Desktop으로 보내주기 위해 docker save 명령어를 통해 tar 파일로 내보내주기를 합니다.

 

docker save api_server > ../api_server.tar

 

운영서버로 보내주기 위해 운영서버의 공용폴더에 파일을 복사합니다. 운영서버 배포는 이 방식이 아니라 CICD 환경을 구축해서 진행해주어야 하는데 아직 그 단계가 아니어서 이렇게 수동적인 방식으로 진행했습니다. 주목적은 도커 이미지의 배포에 주안점을 두고 있기 때문입니다.

 

도커 이미지 파일 로드하기

 

운영서버 명령 프롬프트를 통해 docker 이미지를 불러와서 등록하는 작업을 진행합니다.

 

docker load -i api_server.tar

D:\share>docker load -i api_server.tar
11936051f93b: Loading layer [==================================================>]  129.1MB/129.1MB
31892cc314cb: Loading layer [==================================================>]   11.3MB/11.3MB
8bf42db0de72: Loading layer [==================================================>]  19.31MB/19.31MB
26a504e63be4: Loading layer [==================================================>]  156.5MB/156.5MB
c3a0d593ed24: Loading layer [==================================================>]  537.7MB/537.7MB
1e18e7e1fcc2: Loading layer [==================================================>]  19.04MB/19.04MB
3e607d59ef9f: Loading layer [==================================================>]  42.15MB/42.15MB
8ba9f690e8ba: Loading layer [==================================================>]  4.608kB/4.608kB
aa4c808c19f6: Loading layer [==================================================>]  8.611MB/8.611MB
64b417a40e55: Loading layer [==================================================>]  2.048kB/2.048kB
a5ca992254bc: Loading layer [==================================================>]  596.6MB/596.6MB
c7005f3ad055: Loading layer [==================================================>]  698.7MB/698.7MB
Loaded image: api_server:v1

 

 

운영서버 Docker Desktop Images 에 api_server 가 정상적으로 로드되었습니다. 이제 컨테이너에 담아서 서버를 실행시켜 보도록 하겠습니다.

 

Run 버튼을 누르면 Run a new container 모달창이 뜨면서 정보를 입력 받습니다.

컨테이너 명을 입력해줍니다. 필수는 아니므로 비어두면 임의의 값이 채워진 채 서버가 실행됩니다.

 

그리고 포트포워딩을 위한 포트정보를 넣어주어야 합니다. 제 카카오봇 서버의 경우 rest api 통신 포트로 19051을 사용중이며 UDP 소켓 포트로 9050을 사용중이어서 각각 맵핑 시켜줍니다.

 

 

이렇게 서버를 실행시켜주면 컨테이너가 만들어짐과 동시에 서버가 실행이 되며 Logs 탭을 보여주면서 로그 정보를 출력해줍니다.

 

로그를 통해 정상적으로 서버가 띄워진 것을 확인 할 수 있습니다.

 

웹브라우저에서 api 통신 테스트를 진행해보니 정상적으로 Hello, World 를 출력하는 것 또한 확이니 됩니다.

 

 

이렇게 윈도우 OS 환경에서 Docker Desktop 환경을 구축완료하였습니다. 추가적으로 docker-compose, mysql(maria) db  그리고 node.js 서버 및 CI/CD 등 다양한 환경 구축을 위한 실습 또한 스터디하며 자료를 남겨보도록 하겠습니다.