Nie ten jest biedny, kto posiada mało, lecz ten, kto pragnie więcej.

Seneka

Rzućmy okiem na prosty przykład użycia Dockera w którym uruchomimy kontener a aplikacją Python wyświetlającą wyświetlającą tekst. Aplikację uruchomimy na różnych wersjach języka Python. Celem ćwiczenia jest pokazanie jak konteneryzacja wspiera izolację aplikacji i jej zależności od systemu operacyjnego. Zakładam, że masz na komputerze zainstalowanego Docker'a - możesz to sprawdzić, uruchamiając polecenie docker --version w terminalu.

Zacznijmy od przygotowania aplikacji "Hello World". Tworzymy nowy katalog, a w nim plik o nazwie main.py o następującej zawartości:

# File: main.py
message = "Hello World from Docker Container!"

# The walrus operator, ':=', was introduced in Python 3.8
if (n := len(message)) != 0:
    print(message)

W tym samym katalogu utwórz plik plik Dockerfile. Bardzo ważna jest nazwa, musi być dokładnie Dockerfile.

# File: Dockerfile
# Używamy obrazu bazowego z Pythonem.
FROM python:3.11

# Kopiujemy naszą aplikację do kontenera
COPY main.py /main.py

# Uruchamiamy naszą aplikację w momencie uruchomienia kontenera
CMD ["python3", "/main.py"]

W powyższym pliku wykorzystaliśmy wersję python:3.11. W publicznym repozytorium Docker'a - https://hub.docker.com/_/python/ - możesz znaleźć wiele wersji języka Python. Obraz Python:3.11 będzie stanowił bazę dla naszego kontenera. Następnie za pomocą polecenia COPY nakładany kolejną warstwę z naszą aplikacją, przenosząc do kontenera utworzony plik main.py. Ostatnim krokiem jest określenie punktu wejściowego, czyli określenie co ma zostać uruchomione w kontenerze. Dokonujemy tego za pomocą polecenia CMD. Voila!

Czas zbudować obraz kontenera. Znajdując się w katalogu z plikami Wykonaj w terminalu polecenie:

docker build -t my-app:3.11 .

W twojej konsoli pojawi się coś analogicznego do:

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM python:3.11
3.11: Pulling from library/python
012c0b3e998c: Pull complete 
00046d1e755e: Pull complete 
9f13f5a53d11: Pull complete 
e13e76ad6279: Pull complete 
ad4c837a72f8: Pull complete 
0f546edb7ae0: Pull complete 
e2f116097408: Pull complete 
a0d3c67a6b6b: Pull complete 
Digest: sha256:8488a4b1a393b0b2cb479a2da0a0d11cf816a77c0f9278205015148adadf9edf
Status: Downloaded newer image for python:3.11
 ---> 22c957c35e37
Step 2/3 : COPY main.py /main.py
 ---> a7db2af5d1cf
Step 3/3 : CMD ["python3", "/main.py"]
 ---> Running in 0cae09ad2996
Removing intermediate container 0cae09ad2996
 ---> f9706afbf37b
Successfully built f9706afbf37b
Successfully tagged my-app:3.11

Uruchom kontener na podstawie zbudowanego obrazu:

docker run my-app:3.11

Powinieneś zobaczyć w konsoli komunikat Hello World from Docker Container! wyświetlany przez aplikację uruchomioną w kontenerze Docker.

Teraz sprawdźmy, czy podobny efekt otrzymamy przy uruchomieniu aplikacji w Python 3.7. W tym celu zmieniamy w pliku Dockerfile linię FROM python:3.11 na FROM python:3.7, a następnie wydać w terminalu polecenia:

docker build -t my-app:3.7 .
docker run my-app:3.7

Tym razem naszym oczom powinien ukazać się komunikat:

  File "/main.py", line 4
    if (n := len(message)) != 0:
          ^
SyntaxError: invalid syntax

I wszystko się zgadza, gdyż operator := został wprowadzony w Python 3.8. Nasz system operacyjny pozostał nietknięty, nie musieliśmy instalować w nim różnych wersji języka Python. Pomimo, że w naszym systemie operacyjnym nic nie uległo zmianie, dzięki konteneryzacji byliśmy w stanie błyskawicznie sprawdzić, czy stworzona przez nas aplikacja jest kompatybilna z wersją Python 3.7, oraz Python 3.11.

Ten przykład pokazuje, jak stworzyć prostą aplikację w języku Python, opakować ją w kontenerze Docker za pomocą pliku Dockerfile, a następnie zbudować i uruchomić ten kontener. Docker jest przydatnym narzędziem do izolacji aplikacji i ich zależności od systemu operacyjnego, co pozwala na łatwe przenoszenie aplikacji między różnymi środowiskami.

Artykuł dodano 2023-09-13