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.