개발/Docker

[Docker] Python Dash로 개발한 웹 페이지 Docker로 띄우기

moonzoo 2024. 1. 29. 11:48

 

 

 

Docker 설치

앞서 Window에서 Docker를 설치하는 과정을 업로드 했습니다.

https://mz-moonzoo.tistory.com/40

 

[Docker]Windows 11 Pro에서 Docker 설치(Docker Desktop)

Docker? Docker는 애플리케이션을 개발, 배포 및 실행하기 위한 플랫폼 및 도구 모음입니다. 주요 목적은 소프트웨어를 컨테이너라고 불리는 표준화된 유닛 내에서 패키징하여, 코드가 일관된 환경

mz-moonzoo.tistory.com

 

 

Docker에 Python dash로 개발한 웹 페이지 올리기

이번에 설치한 docker로 제가 개발한 dash 웹 페이지를 배포해보도록 하겠습니다.

 

우분투에 Docker 환경 설정

1.우분투 패키지 목록 업데이트

sudo apt-get update

 

2. 필요한 패키지 설치

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

 

3. Docker의 공식 GPG 키 추가 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

4. Docker 저장소 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

5. 패키지 목록 다시 업데이트 후 Docker CE(Community Edition) 설치 

sudo apt-get update
sudo apt-get install docker-ce

 

6. Docker 실행 및 사용자 권한 설정

sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ${USER}

usermod 명령은 현재 사용자를 Docker 그룹에 추가합니다. 이를 통해 sudo 없이 Docker 명령을 실행할 수 있습니다. 대신 계정을 추가하고나면 재부팅을 해주셔야 합니다.

 

Dockerfile 작성

C:\Users\moonjoo\dash 경로에 있는 Python Dash 애플리케이션을 Docker화 하기 위한 단계입니다.

 

1. 작업 경로 이동

$ cd/mnt/c/Users/moonjoo/dash

 

기존 우분투의 경로는 home으로 지정 돼있기 때문에 cd/mnt/c로 로컬 환경에 접근.

 

2. Dockerfile 생성

$ touch Dockerfile

위에서 이동한 경로에서 Dockerfile을 생성해줍니다.

 

3. Dockerfile 편집

$ vi Dockerfile

 

vi 편집기를 켜서 Dockerfile을 아래와 같이 수정해줍니다.


FROM python:3.8

WORKDIR /app

COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

 

FROM

FROM python:3.8 은 기본 이미지인 python:3.8 인터프리터 (python3)를 기본 명령으로 사용합니다.

 

 

WORKDIR

WORKDIR /app 명령을 COPY 명령들 이전에 배치해주셔야 requirements.txt와 나머지 파일들이 /app 디렉토리에 복사됩니다.

 

 

COPY

COPY requirements.txt ./이 명령은 호스트 시스템(여기서는 C:\Users\moonjoo\emart_dash 디렉토리)의 requirements.txt 파일을 Docker 컨테이너의 현재 작업 디렉토리(여기서는 WORKDIR 명령에 의해 설정된 디렉토리, 또는 설정되지 않았다면 컨테이너의 루트 디렉토리 /)로 복사합니다.

 

RUN

RUN pip install --no-cache-dir -r requirements.txt 명령은 컨테이너 이미지 빌드 중에 명령을 실행합니다. 이 경우에는 pip install --no-cache-dir -r requirements.txt 명령을 실행합니다. --no-cache-dir 옵션은 pip가 패키지를 설치할 때 캐시를 사용하지 않도록 합니다. 이는 이미지의 크기를 줄이는 데 도움이 됩니다.

 

COPY

COPY. . 명령은 현재 Dockerfile이 있는 디렉토리의 모든 파일을 이미지에 복사합니다. 필요하지 않은 파일은 이 과정에서 제외해야 합니다.

 

CMD

CMD ["python", "app.py"]를 추가하면, 컨테이너가 시작될 때 app.py 스크립트가 실행되고, 이 스크립트가 종료될 때까지 컨테이너가 계속 실행됩니다.

Dockerfile에서 CMD 명령어는 JSON 배열 형식을 사용할 때 대괄호([]) 안에 각 요소를 따옴표로 감싸야 합니다. 하지만 이 경우에는 각 요소를 단일 따옴표가 아닌 쌍따옴표로 감싸야 합니다. 

 

4. requirements.txt 생성

Python 파일에서 사용한 패키지를 requirements.txt 파일에 저장하기 위해 주로 사용하는 방법은 두 가지가 있습니다.

하나는 수동으로 필요한 패키지를 나열하는 것이고, 다른 하나는 자동으로 생성하는 방법입니다.

 

저는 자동으로 파일을 생성하고, 프로젝트에서 불필요한 패키지를 제거해줬습니다.

 

작업하고 있는 Python 가상환경에서 다음과 같이 코드를 입력하면 현재 환경에 설치된 모든 패키지와 버전이 requirements.txt 파일에 저장됩니다. 

pip freeze > requirements.txt

 

이 후 자동으로 생성된 파일을 검토하여 프로젝트와 무관한 패키지는 제거해주도록 합니다.

 

- 프로젝트에 대해 가상 환경을 사용하는 경우, 해당 가상 환경이 활성화된 상태에서 pip freeze를 실행해야 합니다.

 

- 일부 프로젝트에서는 모든 종속성을 명시적으로 지정하는 것보다 핵심적인 패키지만 requirements.txt에 나열하는 것이 더 바람직할 수 있습니다. 이렇게 하면 버전 충돌을 방지하고 필요한 경우 자동으로 최신 호환 패키지가 설치됩니다.

 

 

Dockerfile 이미지 빌드 및 실행

1. Docker 이미지 빌드

 

dash 폴더에서 다음 명령어를 실행하여 Docker 이미지를 빌드합니다.

docker build -t mj_dash .

 

mj_dash는 이미지의 이름입니다. 원하는 대로 변경할 수 있습니다. 저는 mj_dash로 지정해줬습니다.

여기서 -t 옵션은 태그를 지정하는데 사용되며, 마지막의 .는 현재 디렉토리(즉, Dockerfile이 있는 디렉토리)를 가리킵니다.

 

2. Docker 컨테이너 실행

 

빌드된 이미지를 사용하여 컨테이너를 실행합니다.

 

docker run -d --name mj_dash -p 8051:8051 mj_dash

 

앞서 빌드한 이미지의 이름을 --name에 mj_dash로 입력하고, -p 8051:8051는 호스트 컴퓨터의 8051 포트와 컨테이너의 8051 포트를 연결합니다. 이렇게 함으로써, 호스트 컴퓨터에서 컨테이너로 네트워크 트래픽을 전달할 수 있습니다.

 

* docker run 실행 시 에러가 발생한다면 docker logs mj_dash를 통해 어디에서 에러가 났는지 확인하실 수 있습니다.

 

3. run.sh / dash_run.sh 생성

Docker에서 run.shdash_run.sh와 같은 쉘 스크립트 파일을 만드는 주된 이유는 자동화와 일관성을 제공하기 위함입니다. 이러한 스크립트는 복잡한 명령이나 시퀀스를 단순화하고, 반복적인 작업을 쉽게 처리할 수 있게 도와줍니다. 

 

run.sh

#!/bin/bash

python app.py

 

 

애플리케이션 실행 자동화: run.sh는 보통 Docker 컨테이너 내에서 실행될 특정 명령이나 스크립트를 포함합니다. 예를 들어, Python 애플리케이션을 실행하는 명령(python app.py)을 포함할 수 있습니다. 이 스크립트를 사용하면 애플리케이션을 시작하는 데 필요한 여러 명령을 하나의 스크립트로 통합할 수 있어 편리합니다.

 

dash_run.sh

#!/bin/bash

docker restart mj_dash \
    && docker exec -w /app mj_dash ./run.sh

 

mj_dash 컨테이너를 재시작한 후, 해당 컨테이너 내에서 /app 디렉토리에서 run.sh 스크립트를 실행하도록 설정되어 있습니다. 이 스크립트의 작동 여부는 mj_dash 컨테이너가 정상적으로 동작하고, run.sh 파일에 실행 권한이 있으며, 스크립트 내의 명령들이 정상적으로 실행될 수 있을 때 확인할 수 있습니다.

 

4. 우분투에서 dash_run.sh 실행

 

이제 우분투에서 sh dash_run.sh 명령어를 입력하시면 

 

성공적으로 파이썬 Dash로 개발한 웹 어플리케이션을 로컬환경에서 컨테이너를 실행했습니다.

애플리케이션 접근하기

sudo apt install net-tools

 

sudo apt를 통해 위의 net-tools를 설치하시고 

 

ifconfig를 찍어보시면 나오는 

 

veth, eth0

eth0는 리눅스에서 사용중인 이더넷카드를 나타내는데 도커 엔진이 호스트에 생성한 가상 네트워크 인터페이스는 실제로 외부와 통신할 수 있으며, veth로 시작하는 이름을 가지고 있습니다. 컨테이너별로 생성된 veth 인터페이스는 컨테이너 내부 eth0 인터페이스와 연결됩니다. 

 

lo

시스템 자기 자신을 가리키기 위한 목적으로 쓰이는 주소로 localhost라고도 불리며, 이 주소로 발송된 패킷은 외부로 나가지 않고 시스템 내부에 머뭅니다.

 

eth0, lo에 주소를 확인해보시고 해당 주소에 설정해둔 포트번호인 :8051을 입력해주시면 dash 애플리케이션에 접근하실 수 있습니다. 

 

마치며

docker 설치부터 개발한 웹페이지를 로컬 환경에서 컨테이너에 띄우는것 까지 완료했습니다. 앞으로도 개발한 모델, 페이지 등을 docker 환경에 올리는 것까지 이것저것 해볼 생각입니다.

'개발 > Docker' 카테고리의 다른 글

[Docker]Docker 기본 명령어 정리  (0) 2024.01.26
[Docker]Windows 11 Pro에서 Docker 설치(Docker Desktop)  (0) 2024.01.26