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

업데이트:

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

참고링크

운영체제 프론트엔드 백엔드 데이터베이스 인프라
리눅스구조 js필터 아파치에러로그 행삭제 아파치스쿱
프로세스 헬로월드 웹서버개념 ES기초 로그분석
네임스페이스 프로젝트생성 아파치설치 MySQL기초 beeline
디렉토리 헤더생성 flask연동 큐브리드 하둡기초
리다이렉션 async-get 장고MsSQL연결 null공백 나이파이
쓰레드 async-post 장고MySQL연결 MySQL설치(win) 백본
라즈베리파이설치 로그인페이지 장고inpectdb MySQL테이블생성 제플린
OSI7계층소개   장고read   SSL인증
OSI1계층   장고insert   커버로스
OSI2계층   장고put   도커개념
OSI3계층   장고del   도커설치
OSI4계층   flask한글요청   도커기초
OSI5,6,7계층       도커이미지
DNS서버       컨테이너네트워크
DHCP       도커API
bashrc       도커컴포즈
bash       도커볼륨
ifconfig       장고이미지
소켓프로그래밍       도커postgre
리눅스유저생성       도커이미지삭제
netstat포트열기       도커Redis
컴파일러       k8s구조
운영체제vs커널       k8s설치
작업스케쥴링       k8s서비스배포
디스크추가       POD네트워크
aws유저추가       퍼시스턴트볼륨
기초명령어       k8s에러
포트번호        

참고 링크

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