Blog JSystems - z miłości do programowania

Osadzanie aplikacji Flask na Dockerze



W pierwszej kolejności przygotujmy sobie kod aplikacji Flask:


from flask import Flask
app = Flask(__name__)


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

if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True,port=80)


Kod ten umieściłem w pliku app.py znajdującym się w głównym katalogu projektu. Jedynym zadaniem aplikacji jest słuchanie na porcie 80 i wyświetlenie "Hello World!" po wejściu na stronę główną aplikacji. Ważne jest by w wywołaniu app.run posłużyć się przełącznikiem host i podać adres, ponieważ bez tego aplikacja nie będzie widoczna spoza kontenera.


W kolejnym kroku musimy wygenerować plik requirements.txt który będzie nam potrzebny do instalacji zależności w kontenerze. Generujemy go wywołując z poziomu głównego katalogu aplikacji komendę:


pip freeze > requirements.txt


W dalszym kroku musimy utworzyć plik Dockerfile w głównym katalogu projektu. Do pliku tego trzeba będzie wprowadzić kilka informacji na temat sposobu budowania obrazu. Wchodzimy na https://hub.docker.com/ i wyszukujemy obraz posiadający obsługę Pythona:


200.png (758×197)


Wybieramy przykładowo taki obraz klikając na jego nazwę:


201.png (971×316)


Pod spodem powinna znajdować się taka lista:


202.png (494×232)


 


Wybieramy pierwszy wpis i wprowadzamy poniższą linię z wybranym obrazem go do pustego dotychczas pliku Dockerfile:


FROM python:3.10.0a1-buster


Linia ta informuje Dockera o obrazie który ma zostać wykorzystany do budowy naszego obrazu. Nie musisz przejmować się pobieraniem żadnego pliku związanego z tym obrazem. Docker pobierze go sam.  Musimy wskazać jeszcze czynności jakie mają zostać wykonane w celu uruchomienia aplikacji. Wprowadzamy do Dockerfile poniższe linie:


COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["python","app.py"]


Zostaną one wykonane w chwili budowania obrazu. Instrukcja COPY powoduje skopiowanie wskazanego pliku (w tym przypadku pliku z listą wymaganych zależności) do obrazu. Kolejna instrukcja RUN powoduje instalację wymaganych zależności przez pip z pliku requirements.txt który stworzyliśmy przy pomocy instrukcji "pip freeze > requirements.txt" wykonany wcześniej. Kolejne wykonanie komendy COPY to skopiowanie pliku w którym znajduje się nasz program. Ostatnia instrukcja CMD uruchamia pythona nakazując mu wykonanie pliku "app.py". Musimy teraz utworzyć nasz obraz na podstawie pliku Dockerfile. Robimy to wywołując w linii poleceń:


docker build -t myrest .


"myrest" w powyższej komendzie to nazwa pod jaką później widoczny będzie nasz obraz. Kropka na końcu informuje go o położeniu pliku Dockerfile. Po uruchomieniu powinny pojawiać się linie informujące o zakończeniu tworzenia kolejnych etapów budowy obrazu.  Przyszedł czas na uruchomienie kontenera:


docker run -p 80:80 myrest


Po uruchomieniu możemy wejść przez przeglądarkę na naszą aplikację:


203.png (294×107)


Komendę tą możesz wykonać z dowolnego miejsca, ponieważ docker uruchamia obraz po nazwie - w tym przypadku "myrest". Jest to nazwa obrazu którą mu nadaliśmy podczas jego budowania. Pewnego wyjaśnienia może wymagać "-p 80:80". Pierwsza wartośćliczbowa to port na którym apka ma być widoczna na zewnątrz, a druga to port na jakim chodzi apka wewnątrz kontenera. Listę zbudowanych obrazów możesz zobaczyć wywołując komendę:


docker image ls


204.png (1092×193)


Listę uruchomionych kontenerów możesz zobaczyć wywołując komendę :


docker container ls


205.png (1356×87)


Chcąc zatrzymać uruchomiony kontener potrzebujemy jego container_id z powyższej listy, a przynajmniej jego unikalnego początku:


docker stop c38


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!