Docker

도커(Docker)는 서버상에 컨테이너를 실행하기 하기위한 Engine 입니다. 여기서 컨테이너란 소프트웨어 코드를 라이브러리, 프레임워크 및 기타 종속성과 같은 필수 요소와 함께 패키지에 포함하여 각자의 “컨테이너”로 분리하는 것을 뜻합니다.

도커를 사용함으로써 자주 변경되는 서버환경을 일정한 구조로 수정, 배포할 수 있습니다. 더불어 VM 을 사용하는 것보다 가벼운 환경으로 성능을 올려주기도 합니다.

도커의 사용 흐름은 아래와 같습니다.

  • 필요한 이미지를 로컬에 내려받습니다 합니다. (pull)

  • 개발환경에서 이미지를 빌드합니다. 여기서 이미지는 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리 등 어플리케이션을 실행하기위한 파일과 설정값들이 포함되어 있는 파일입니다.

  • 빌드 된 이미지를 외부 저장소에 저장합니다(push). 우리는 기본 저장소인 Docker Hub에 저장합니다. Docker Hub 는 Github과 같이 Public 혹은 Private 하게 저장할 수 있는 이미지 저장소입니다.

  • 서버에서 Image를 Docker Hub에서 내려받습니다. (pull)

  • 서버에서 Image를 실행하여 Container를 생성합니다. (run)

  • 서버에서 서비스가 운영됩니다.

위와 같은 흐름으로 서버에서는 실행에 필요한 여러가지 설정, 실행파일들에대해서 추가로 설치할 필요없이 도커 이미지만을 이용해서 개발환경과 동일한 환경으로 서비스를 실행 할 수 있게됩니다. 또한 이러한 Image에 대한 정의(DockerFile)는 Git을 통해 관리 될 수 있기에 이력관리도 가능합니다.

이러한 편리함 때문에 최근의 서버 미들웨어들(Hadoop, Airflow 등)들은 대부분 Image를 제공하고 있습니다.

우리는 미리 제공되어 있는 이미지 위에 추가로 필요한 설정과 파일을 추가해서 서비스를 실행 할 수 있습니다.

Install

우리는 Docker를 사용하기 위해서 로컬에 Docker를 설치할 필요가 있습니다. 별도의 Docker Image 빌드용 서버가 있다면 DockerFile만 수정하면 되지만, 현재는 없기때문에 도커를 직접 설치해봅니다.

도커를 설치하는 방법은 아래와 같습니다.

Mac용

Window용

Mac의 경우 간단하게 공식 홈페이지의 가이드대로 설치할 수 있지만, 윈도우의 경우 Home Edition과 Pro에서 설치방법이 다릅니다. 첨부한 링크를 확인해서 따라 설치합니다.

Join

그 다음 DockerHub에 가입합니다. 우리는 Docker Hub를 Image 저장소로 사용할 예정입니다. 사용을 위해 회원가입을 합니다. 이후 로컬에 설치된 Docker에 로그인을 합니다.

Caution

  • 도커 Desktop은 CPU & Network 사용량이 높습니다. 필요없을 때는 종료합니다.
  • 도커 명령어를 실행하려면 Docker Desktop을 활성화 해야합니다. 명령어를 사용하기전에 실행합니다.
  • 도커 이미지를 로컬에 설치하는 것은 용량을 차지하기 때문에 사용하지 않는 것은 정리를 해둡니다.

Docker Usage

이제 도커 설치를 하였으니 도커 명령어에 대해서 배워봅니다.

대부분 Docker Desktop을 통해 UI로 확인이 가능합니다만 Build의 경우 명령어를 사용합니다.

Pull Image

docker image pull {image name}

Check Image

docker image ls

Build Image

docker build {dockerfile path} -t {image name}

Remove Image

docker image rm {name}

Push Image

docker image push {docker account/name}

Run Container

docker run -d -p {server port}:{docker port} {image name}

Check Container

docker container ls

Stop Container

docker stop {container name}

Remove Container

docker rm {container name}

Docker X Flask

이제 Docker Image를 직접 빌드하여 Flask 환경의 Container를 띄우도록 하겠습니다.

Create Docker File

도커 이미지를 만들기 위해서는 먼저 Docker File을 생성해야합니다. 원하는 Directory에 Dockerfile 을 생성합니다.

Dockerfile의 내용은 아래와 같습니다.

FROM python:3.9.10-slim-buster

EXPOSE 8000

RUN apt-get update

COPY ./app /app

WORKDIR /app

# install requirement packages
RUN pip3 install -r requirements.txt

ENTRYPOINT ["python", "main.py"]

FROM python:3.9.10-slim-buster 의 의미는 기본이 될 이미지 이름입니다. Python 3.9 이미지 위에 우리의 환경을 구축하게 됩니다.

EXPOSE 8000 의 의미는 이 이미지로 실행 될 컨테이너의 8000 번 포트를 오픈하겠다는 의미입니다.

RUN apt-get update 이 명령어는 apt-get update 라는 linux 명령어를 실행하겠다는 의미입니다. 컨테이너의 apt-get 환경을 업데이트합니다.

COPY ./app /app Dockerfile과 같은경로의 app 폴더를 컨테이너 상의 /app 로 카피하겠다는 의미입니다. 이제 우리는 로컬의 ./app 폴더에 작업내용을 작성하면 됩니다.

WORKDIR /app 의 의미는 앞으로 실행 될 경로의 기준을 /app으로 정한다는 의미입니다.

RUN pip3 install -r requirements.txt 의 의미는 requirements.txt 안의 패키지 파일을 pip3 를 통해 설치하겠다는 의미입니다. 우리는 python:3.9.10-slim-buster 이미지를 통해 python 환경을 구축했기때문에 별도의 파이썬 설정없이 바로 pip3 를 실행할 수 있습니다.

ENTRYPOINT ["python", "main.py"] 드디어 마지막 구문입니다. 해당 도커 이미지파일이 실행 할 파일의 이름입니다. 로컬의 기준으로 ./app 폴더의 main.py 를 실행하겠다는 의미입니다.

Directory Setting

위 기준에 맞춰서 Dockerfile과 같은 경로에 app 폴더를 생성합니다. app 폴더 안에는 main.py 파일과 requirements.txt 파일을 생성합니다.

main.py의 내용은 아래와 같습니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

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

이전 블로그에서 배웠던 간단한 플라스크 앱입니다. Port를 8000번으로 해서 실행합니다.

requirements.txt 의 내용은 아래와 같습니다.

Flask

플라스크만 설치하면 되기때문에 Flask만 입력합니다. 추가로 라이브러리가 필요한경우 다음줄에 입력하면 됩니다.

Build Image

이제 Dockerfile이 있는 경로에서 아래 명령어를 실행합니다.

docker build . -t flask_image

도커 이미지를 . 경로의 Docker file을 통해 빌드하라는 의미입니다. 이름은 flask_image를 사용합니다.

Run Container

이제 생성한 이미지가 정상적으로 동작하는지 확인해봅시다.

docker run -d -p 8000:8000 flask_image

flask_image 이미지를 컨테이너로 실행하는데, 서버의 실제 8000 포트와 컨테이너상의 8000 포트를 연결한다 라는 의미입니다.

브라우저로 localhost:8000 으로 접근하면 hello world가 실행 된 것을 볼 수 있습니다.

Push Image

완성된 이미지를 Docker Hub에 Push합니다.

docker push lhj5772/flask_image

이제 docker가 설치되어있는 어느 서버에서든 pull을 통해 이미지를 내려받고 플라스크 서버를 실행 할 수 있게 되었습니다.

Comments