[Infra] 도커(docker)(5) API 서버 이미지 빌드 및 컨테이너 실행

업데이트:

도커(docker)(5) API 서버 이미지 빌드 및 컨테이너 실행

참고 링크

1. Flask API 서버 파일 준비

1.1. 호스트에 파일 생성

다음 파일은 main.py 파일 입니다.

from urllib.parse import unquote
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/test', methods=['POST'])
def test():
    args = request.json
    print(args)
    sentence = args['review']
    sentence = urllib.parse.unquote(a)
    return sentence

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

2. 이미지 빌드

2.1. 이미지 빌드하기

(터미널1)$ cd {main.py 파일이 있는 경로}
(터미널1)$ docker build -t kpt_supply_api01 .
Sending build context to Docker daemon  725.6MB
Step 1/7 : FROM python:3.8.5
 ---> 28a4c88cdbbf
Step 2/7 : ADD . /www
 ---> eae63f5c9f3d
Step 3/7 : WORKDIR /www
 ---> Running in dc368ff48556
Removing intermediate container dc368ff48556
 ---> 2123e5188635
Step 4/7 : RUN python -m pip install --upgrade pip
 ---> Running in d51abbcf9055
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)

위 코드는 현재 경로에 있는 모든 파일(.)을 kpt_supply_api01이라는 이름의 이미지로 빌드하겠다는 뜻입니다.

2.2. 이미지 확인

(터미널1)$ docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
kpt_supply_api01   latest    d1de702c12e8   5 seconds ago   3.79GB
ubuntu             latest    ba6acccedd29   6 weeks ago     72.8MB
hello-world        latest    feb5d9fea6a5   2 months ago    13.3kB
python             3.8.5     28a4c88cdbbf   14 months ago   882MB

docker image ls 명령어를 사용하면 도커 이미지를 확인할 수 있습니다. 방금전 빌드한 이미지가 잘 만들어진 것을 볼 수 있습니다.

3. 컨테이너 실행

3.1 컨테이너 실행

(터미널1)$  docker run --name kpt_supply_server01 -p 8001:5001 kpt_supply_api01

 * Serving Flask app 'main' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.2:5001/ (Press CTRL+C to quit)

위 명령어를 사용하면 컨테이너를 실행할 수 있습니다.

3.2 컨테이너 멈추기

이번에는 실행중이 컨테이너를 멈춰보겠습니다. 먼저 실행중인 컨테이너를 확인해보겠습니다. 터미널을 하나 더 띄우고 다음과 같이 입력합니다.

(터미널2)$  docker container ls
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                       NAMES
0c9da384f99f   kpt_supply_api01   "/bin/sh -c 'python …"   53 seconds ago   Up 52 seconds   0.0.0.0:8001->5001/tcp, :::8001->5001/tcp   kpt_supply_server01

위 결과를 보면 현재 실행중이 컨테이너ID는 0c9da384f99f 라는 것을 알 수 있습니다. 그렇다면 해당 컨테이너를 멈춰보겠습니다.

(터미널2)$  docker container stop kpt_supply_server01
kpt_supply_server01

위와 같이 stop 명령어를 사용하면 컨테이너를 멈출 수 있습니다.

(터미널2)$ docker container ls
CONTAINER ID   IMAGE   COMMAND   CREATED    STATUS    PORTS    NAMES

다시 ls 명령어로 실행중인 컨테이너를 확인해보면 실행중인 컨테이너가 없다는 것을 알 수 있습니다.

3.3. 컨테이너 재시작

이번에는 멈춘 컨테이너를 재시작시켜보겠습니다. 먼저 컨테이너 전체를 확인합니다.

(터미널2)$ docker container ls -a
CONTAINER ID   IMAGE              COMMAND                  CREATED              STATUS                           PORTS     NAMES  
0c9da384f99f   kpt_supply_api01   "/bin/sh -c 'python …"   About a minute ago   Exited (137) 16 seconds ago                kpt_supply_server01

방금전에 실행했던 컨테이너를 확인할 수 있습니다.

(터미널2)$ docker container start 0c9da384f99f
0c9da384f99f

docker container start 명령어로 컨테이너를 재가동 시켜보겠습니다. 위와 같이 실습할 수 있습니다.

(터미널2)$ docker container ls
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                                       NAMES
0c9da384f99f   kpt_supply_api01   "/bin/sh -c 'python …"   3 minutes ago   Up 4 seconds   0.0.0.0:8001->5001/tcp, :::8001->5001/tcp   kpt_supply_server01

ls 명령어를 입력하면 컨테이너가 제대로 실행된 것을 볼 수 있습니다.

4. 컨테이너는 가상머신이 아니다.

컨테이너는 가상머신이 아닙니다. 컨테이너 또한 호스트 OS 위에서 실행되는 프로세스일 뿐입니다. 이를 확인해보면 컨테이너 밖인 호스트 OS에서 ps 명령어를 입력하면 확인할 수 있습니다.

(터미널1)$ ps -ef | grep container

root     10837 24491  0 09:52 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8001 -container-ip 172.17.0.2 -container-port 5001
root     10845 24491  0 09:52 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8001 -container-ip 172.17.0.2 -container-port 5001
root     10859     1  0 09:52 ?        00:00:01 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 0c9da384f99ffd10b3f8ac3d5dd8cdd29b32a3f68455510515a1c2c115c8e6ac -address /run/containerd/containerd.sock