Docker jest narzędziem, które pozwala umieścić program oraz jego zależności w lekkim, przenośnym wirtualnym kontenerze, który można uruchomić na prawie każdym hoście z systemem Linux.
Docker zastępuje tradycyjną wirtualizację przez stosowanie czegoś co nazywa się konteneryzacją. Każdy kontener posiada wydzielony obszar pamięci, odrębny interfejs sieciowy z własnym adresem IP oraz wydzielony obszar na dysku, na którym znajduje się zainstalowany obraz systemu operacyjnego i wszystkich zależności (bibliotek) potrzebnych do działania aplikacji (uruchamiane są tylko procesy niezbędne do działania aplikacji).
Porównanie kontenerów i standardowej wirtualizacji:
Porównanie kontenerów i standardowej wirtualizacji:
Najważniejsze pojęcia:
Demon - główny silnik Dockera (proces dockerd) - odpala nasze kontenery z aplikacjami.
Klient - aplikacja CLI o nazwie docker, komunikuje się z demonem.
Obraz - jest szablonem dla kontenera. Obrazy znajdują się w rejestrze np. https://hub.docker.com/ albo w lokalnym cache. Są tylko do odczytu.
Rejestr - miejsce do przechowywania obrazów. Oficjalny rejestr dockera to: https://hub.docker.com/
Kontener - to uruchomiona instancja danego obrazu, jest warstwą zapisywalną.
Docker jest wielowarstwowy: Kernel > Obraz > Kontener
Instalacja Dockera
Docker do pracy wymaga linuksowego kernela, więc można go uruchomić na większości dystrybucji systemu Linux. Działa też pod Windows 10 Pro i Enterprise 64-bit, wykorzystując wirtualizację Hyper-V. Można też odpalić maszynę wirtualną z Dockerem pod macOS.
Przykład instalacji dla Ubuntu 18.04 64-bit:
sudo apt install docker.io
Aby można było uruchamiać kontenery, trzeba dodać użytkownika do grupy docker:
sudo usermod -aG docker $USER
Sprawdzenie, czy Docker działa
Trzeba ściągnąć obraz hello-world z oficjalnego repozytorium:
docker run hello-world
Jak wyskoczy tekst Hello from Docker!, tzn. że kontener z obrazem hello-world uruchomił się prawidłowo.
Przykłady działania
Uruchomienie kontenera z najnowszym interpreterem języka Python:
docker run -it python
-i : uruchamia instancję kontenera w trybie interaktywnym
-t : przypisuje instancję kontenera do bieżącej konsoli (tty)
Uruchomienie kontenera z Pythonem 2.7:
docker run -it python:2.7
Kontener z Alpine Linux (lekki system Linux):
docker run -it alpine
docker run -it alpine /bin/sh
docker run alpine ls -l
Kontener z grami bsd-games (np. adventure, backgammon, battlestar, boggle, cribbage, go-fish, hunt, mille, quiz, trek, worm):
docker run -it --rm cricket/hangman hangman
--rm : usuwa kontener po zakończeniu
Aplikacja webowa:
docker run --name stsi -d -p 85:80/tcp dockersamples/static-site
--name : zdefiniowana przez użytkownika przyjazna nazwa kontenera
-d : detached mode, proces działa w tle, konsola dostępna
-p 85:80/tcp : przekierowanie portu 80/tcp kontenera na 85/tcp hosta (można odpalić w przeglądarce stronę testową http://ip_hosta:85 )
-P : przekierowanie portów kontenera na losowe wysokie porty hosta
docker port stsi
- można sprawdzić, które porty są mapowane z kontenera stsi na host
Przydatne komendy polecenia docker
docker images - lista obrazów w lokalnym cache komputera
docker info - szczegółowe informacje o Dockerze (ilość obrazów, kontenerów itp.)
docker kill - ubija działający kontener
docker port - lista mapowanych portów TCP i UDP z kontenera na host
docker ps - lista działających kontenerów
docker pull - ściąga obraz do lokalnego cache
docker push - wysyła obraz do repozytorium
docker rm - usuwa kontenery z dysku
docker rmi - usuwa obrazy z dysku
docker run - uruchamia kontener (komendę w kontenerze); jeżeli nie ma obrazu, to go ściąga (docker pull)
docker search - szuka obrazów w repozytorium
docker top - pokazuje uruchomione procesy w kontenerze
docker version - informacja o wersji Dockera
docker build - budowanie własnego obrazu kontenera
Budowanie własnego obrazu kontenera z pliku Dockerfile
W tym przykładzie zbudujemy własny kontener z obrazem Pythona 3.4 i uruchomionym programem primes_print.py, który wypisuje na ekranie liczby pierwsze.
Kod źródłowy programu w Pythonie:
https://github.com/adamblaszczyk/code-snippets/blob/master/python/primes_print.py
Tworzymy plik Dockerfile służący do budowania obrazu:
FROM python:3.4
ADD primes_print.py /
CMD python primes_print.py
Jest to przepis na budowanie obrazu:
FROM - oznacza bazowy obraz,
ADD - dodaje pliki do obrazu,
CMD - polecenie odpalane przy starcie kontenera (instancji zbudowanego obrazu).
Budujemy obraz (wykorzystując Dockerfile) na bazie obrazu python:3.4 z oficjalnego repozytorium Docker Hub:
docker build --tag=primes .
--tag : nazwa_obrazu(:wersja)
Uruchamiamy naszą instancję (kontener) nowo zbudowanego obrazu:
docker run -it --rm primes
Na tym zakończę wstęp do Dockera. Postaram się jeszcze coś o nim napisać.