Blog JSystems - uwalniamy wiedzę!

Szukaj
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:

Obrazy python:3.14 na Docker Hub

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

FROM python:3.14-slim-trixie

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" wykonanej 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
Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego w aplikacji Flask trzeba podać host 0.0.0.0?
Bez wskazania host w wywołaniu app.run aplikacja nie będzie widoczna spoza kontenera. Ustawienie 0.0.0.0 sprawia, że nasłuchuje na wszystkich interfejsach, dzięki czemu można się do niej dostać z zewnątrz kontenera Docker.
Do czego służy plik requirements.txt przy budowaniu obrazu?
Zawiera listę zależności potrzebnych aplikacji. Generujemy go komendą pip freeze do pliku, a w Dockerfile instrukcja RUN pip install z tego pliku instaluje wszystkie biblioteki wewnątrz kontenera podczas budowania obrazu.
Co robią kolejne instrukcje w pliku Dockerfile?
FROM wskazuje obraz bazowy z Pythonem, COPY kopiuje pliki do obrazu, RUN instaluje zależności przez pip, a CMD uruchamia aplikację komendą python app.py. Wszystkie te kroki wykonują się w chwili budowania obrazu.
Co oznacza zapis -p 80:80 przy uruchamianiu kontenera?
Pierwsza liczba to port, na którym aplikacja jest widoczna na zewnątrz kontenera, a druga to port, na którym działa aplikacja wewnątrz kontenera. W tym przykładzie oba są równe 80, więc ruch z zewnątrz trafia wprost do aplikacji.
Jak zbudować obraz i uruchomić kontener?
Obraz budujemy komendą docker build -t myrest z kropką wskazującą położenie Dockerfile, gdzie myrest to nazwa obrazu. Następnie uruchamiamy kontener przez docker run z mapowaniem portów. Obraz można uruchomić z dowolnego miejsca, bo Docker odnajduje go po nazwie.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...