본문 바로가기
프로젝트

도커 컨테이너 구성 및 활용(1)

by 엑츄얼리 2021. 8. 2.

Python Flask 서비스를 컨테이너화하고 MariaDB를 구성

Flask 웹 서비스를 도커로 구성해보고 DB에 연동해본 후 Docker compose를 통해 관리

 

1) 도커, 컨테이너에 대한 이해

2) MariaDB를 컨테이너로 구성 및 Python Flask 연동

3) docker compose를 통해 여러개의 컨테이너를 효과적으로 관리

 

사전 지식

1) 컨테이너란?

 

실습

1) 이미지 빌드

pip3 freeze > requirements.txt 
//현재 환경에 설치된 패키치들의 이름과 버전 정보를 requirements.txt파일에 저장
touch app.py
//app.py라는 flask app파일 생성
touch Dockerfile
//Docker image를 만들기 위한 Dockerfile 생성
//Dockerfile이란 이미지를 생성할 때와 이미지를 통해 컨테이너를 구동할 때 
//어떤 작업을 실행할지를 작성해놓는 파일

app.py
app.py 정상 구동 확인

* python3 -m flask run  

  => -m mod : run library module as a script (terminates option list)

  => directory에 여러 개의 *.py파일 중 가장 알파벳 순으로 가장 앞에 있는 1개의 파일만을 실행하며

       if __name__ =="__main__" : 을 통해서 option을 설정할 수 없는데

      이해한 바에 따르면 flask module이 *.py파일을 import형태로 읽어와서 인 것 같다.

=> 위 스크린샷 처럼 python3의 --host, --port 옵션을 통해 이를 대체할 수 있다.

 

Dockerfile

1) #syntax=docker/dockerfile:1

=> buildkit이 빌드 전 syntax를 자동으로 최신 버전으로 업데이트 (docker/dockerfile:1은 latest Release syntax를 의미)

3) FROM python:3.8-slim-buster

=> FROM은 새로운 이미지를 생성할 때 기반으로 할 이미지를 지정

4) WORKDIR

=> 이미지에서의 작업 directory를 지정, 이후 명렁어는 해당 directory를 기준으로 동작

5) COPY requirements.txt requirements.txt

=> locale directory의 requirements.txt 파일을 이미지에 requirements.txt라는 이름으로 복사한다.

6) RUN pip3 install -r requirements.txt

=> requirements.txt내부의 패키지들을 이미지 내부에 설치한다.

7) COPY . .

=> locale directory에 있는 모든 파일을 이미지에 복사

8) CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

=> 컨테이너 내에서 이미지가 실행될 때 실행할 명령어

 

이미지 내부의 디텍토리 구조

app
|___ app.py
|___ requirements.txt
|___ Dockerfile

도커 이미지 생성 완료

 

* Dockerfile을 아래와 같이 수정해보았다.

수정된 Dockerfile

1) 4번째 <COPY . .>이 중점으로

=> 전체 디렉토리를 복사하는 과정에서 requirements.txt도 복사가 될텐데 굳이 2번 반복해야되나 싶어서 빼고 해봤는데 정상적으로 작동했다.

docker container 작동 화면

2) 6번째 <CMD ["...."]>

=> "--host=0.0.0.0"이 없어도 localhost에서는 연결이 되야되지 않나 생각하고 시도해봤는데 되지않았다.

    여러번 다양한 방법으로 시도해봤는데 안된걸 보고

    <컨테이너 내부에서 실행되는 이미지에 외부 호스트가 지정되어있지 않다면

      컨테이너 내부와 외부가 연결이 되지 않는다 라는 가설을 세웠다.> (나중에 다시볼때 고치자)

2) 관련 문서 (나중에 꼭 다시 읽어보자)

명령어 정리 docker run -d -p 3000:5000 --name rest-server python-docker

-d : --detach 컨테이너가 분리된 상대로 터미널 프롬프트에 들어감

-p 3000:5000 외부의 3000포트와 내부의 5000포트를 연결

--name rest-server : rest-server라는 이름으로 컨테이너 실행

 

docker ps : 실행 중인 컨테이너 목록 확인

docker ps -a : 모든 컨테이너 목록 확인

docker stop <컨테이너 이름> : 컨테이너 정지

docker restart <컨테이너 이름> : 컨테이너 재시작

docker rm <컨테이너 이름> : 컨테이너 제거

 

<참고>

https://docs.docker.com/language/python/build-images/

https://docs.docker.com/language/python/run-containers/

댓글