[Infra] 도커(docker)(5) API 서버 이미지 빌드 및 컨테이너 실행
업데이트:
도커(docker)(5) API 서버 이미지 빌드 및 컨테이너 실행
참고링크
참고 링크
- (0)도커의 개념
- (1)도커 설치하기, hello world!
- (2)도커 컨테이너 조작 기초(pull, run, ps)
- (3)도커 이미지 변경 후 저장(commit)
- (4)도커 컨테이너 네트워크
- (5)도커 API 이미지 빌드 및 컨테이너 실행
- (6)도커 컴포즈를 활용한 여러 개의 Flask, Nginx 배포
- (7)도커 볼륨을 이용한 데이터 관리
- (1)쿠버네티스 구조
- (2)쿠버네티스 설치
- (3)쿠버네티스 서비스 배포하기
- (4)컨테이너 IP와 파드 IP의 관계
- (5)퍼시스턴트 볼륨 스토리지
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