Docker

Docker jest aplikacją, która umożliwia umieszczanie programów wewnątrz izolowanych piaskownic (ang. sandbox) nazywanych kontenerami (ang. container). Kontenery tworzone przez Docker są dożo wydajniejsze niż wykorzystywane zwykle do izolacji maszyny wirtualne (ang. virtual machine). Aplikacja Docker powstała we Francji, w roku 2013. Oficjalną stroną projektu jest www.docker.com.

Docker umożliwia użytkownikowi tworzenie izolowanych kontenerów, zawierających wskazaną aplikację razem ze wszystkimi powiązanymi z nią bibliotekami i ustawieniami systemowymi. Kontenery te mogą być następnie wykorzystywane do wielokrotnego uruchamiania wcześniej przygotowanych programów lub do prac programistycznych w dokładnie przygotowanym środowisku.

Ze względu na możliwość relatywnie szybkiego i łatwego modyfikowania aplikacji bazujących na kontenerach (poprzez dodawanie lub podmienianie poszczególnych kontenerów), Docker jest często wykorzystywany do tworzenia i zarządzania dużymi systemami rozproszonymi. Kontenery mogą działać na wielu maszynach, zarówno fizycznych, jak i wirtualnych. Wewnętrzna konfiguracja tak używanych kontenerów nie jest afektowana przez ustawienia serwerów, na których działają.

Docker oraz aplikacje służące do zarządzania wirtualnymi kontenerami nie są narzędziami ściśle kryptograficznymi. Nadają się bardzo dobrze do wdrażania i testowania systemów bezpieczeństwa, z racji swojej efektywności, elastyczności i łatwości instalacji.

Mimo, że obecnie istnieje szereg aplikacji umożliwiających tworzenie wirtualnych kontenerów, Docker jest niezaprzeczalnie jednym z najpopularniejszych z nich. Jest warte wspomnienia, że wiele popularnych dostawców usług w chmurze (ang. cloud service providers), jak Amazon lub Microsoft, obsługuje obrazy tworzone przez Docker.

Wirtualne Kontenery

Koszt uruchamiania aplikacji w wirtualnych kontenerach utworzonych przez Docker jest dużo mniejszy niż koszt działania całej maszyny wirtualnej. Zamiast tworzenia nowego systemu operacyjnego, kontenery wykorzystują niskopoziomowe funkcjonalności systemu, w którym działają, modyfikując jedynie jego wyższe warstwy.

Początkowo Docker był dostępny jedynie dla systemów Linux, ale z biegiem czasu dodano możliwość używania go również pod Windowsami. Docker wykorzystuje nowoczesne funkcje systemów operacyjnych, które umożliwiają izolowanie zasobów na różne sposoby. Przykładowo, działając na Linuxie, Doker wykorzystuje takie funkcjonalności jądra jak namespaces, cgoups, system plików aufs oraz interfejsy wirtualizujące (libcontainer, libvirt i LXC).

Aplikacja działająca wewnątrz kontenera jest izolowana od zewnętrznych systemów operacyjnych pod względem systemu plików, innych procesów i użytkowników, procesowa i pamięci oraz interfejsów sieciowych i urządzeń wejścia/wyjścia.

API Aplikacji Docker

Jednym z powodów popularności programu Docker jest prostota jego używania. Po utworzeniu obrazu kontenera, użytkownik może kontrolować aplikację za pomocą kilku prostych komand.

Obraz tworzony w aplikacji Docker jest paczką zawierającą docelowy program wybrany przez użytkownika, wraz z jego zależnościami i parametrami konfiguracyjnymi. Za każdym razem, kiedy obraz jest uruchamiany, Docker tworzy nowy wirtualny kontener i inicjuje go za pomocą tych samych parametrów. Oczywiście, szereg oddzielnych kontenerów bazujących na tym samym obrazie może działać równocześnie. Każdy utworzony kontener otrzymuje unikalny numer identyfikacyjny.

  • docker pull nazwa_obrazu: pobiera wskazany obraz z repozytorium online aplikacji Docker.
  • docker images: wyświetla wszystkie dostępne obrazy.
  • docker run nazwa_obrazu: startuje wybrany obraz i przeprowadza wcześniej zdefiniowane operacje. Nowy kontener jest tworzony za każdym wywołaniem komendy run.
  • docker ps: wyświetla wszystkie aktualnie uruchomione kontenery.
  • docker stop id_kontenera: zatrzymuje wskazany kontener.
  • docker rm id_kontenera: usuwa wskazany kontener.

Tworzenie Nowych Obrazów Aplikacji Docker

Obecnie istnieje bardzo wiele gotowych obrazów Docker, dostępnych w publicznych repozytoriach. Można je pobrać przy użyciu komendy docker pull, a następnie pracować z kontenerami utworzonymi na ich podstawie.

Jest możliwe również zbudowanie własnych obrazów, poprzez modyfikowanie innych istniejących już obrazów aplikacji Docker. W tym celu wykorzystuje się specjalnie przygotowany plik Dockerfile.

Plik Dockerfile składa się zwykle z kilku lub kilkunastu linijek tekstu, z których każda zawiera słowo kluczowe i odpowiadającą mu wartość. Pierwsza linijka powinna określać obraz, który ma być zmodyfikowany (słowo kluczowe: FROM). W kolejnych liniach znajdują się dodatkowe zależności, które powinny być załadowane do obrazu (słowo kluczowe: ADD), skrypty i aplikacje, które powinny być zainstalowane lub uruchomione (słowa kluczowe: RUN, CMD), numery portów, które powinny zostać otwarte (słowo kluczowe: EXPOSE), itd.

Mając przygotowany plik Dockerfile, nowy obraz może zostać utworzony za pomocą komendy docker build, który pobiera jako parametry docelową nazwę obrazu (połączoną z opcjonalnymi użytkownikiem i tagiem) i wspomniany wcześniej plik.

Utworzony w ten sposób oraz może zostać załadowany do repozytorium online za pomocą komendy:
  docker push nazwa_obrazu

Sieci Aplikacji Docker

Możliwe jest utworzenie wielu obrazów aplikacji Docker, które będą komunikować się ze sobą wykorzystując zwykłe protokoły sieciowe. Ogólnie rzecz biorąc, zaleca się budowanie systemów składających się z wielu kontenerów, z których każdy zajmowałby się jednym określonym procesem i komunikował się z innymi kontenerami w celu wykonania przewidzianego zadania.

Wirtualna sieć w aplikacji Docker może zostać utworzona za pomocą komendy:
  docker network create nazwa_sieci

Następnie użytkownik może wskazać kontenerom odpowiednią sieć, definiując parametr --net podczas wydawania komendy run. Kontenery mogą się komunikować, jeśli działają w tej samej sieci aplikacji Docker.

Na koniec warto wspomnieć o jeszcze jednej samodzielnej aplikacji, o nazwie Docker Compose. W większym nawet stopniu upraszcza ona konfigurację wielu kontenerów pracujących w jednej sieci wirtualnej. Pozwala ona umieścić wiele obrazów w jednym pliku konfiguracyjnym, docker-compose.yml, i zarządzać nimi za pomocą dwóch komend docker-compose up i docker-compose stop.