Od kilku miesięcy używam dockera do strukturyzacji procesu tworzenia i dostarczania projektów webowych. Proponuję czytelnikom 'Habr Habr' tłumaczenie wprowadzającego artykułu o dockerze — .
Co to jest docker?
Docker to otwarta platforma do tworzenia, dostarczania i uruchamiania aplikacji. Docker został stworzony, aby przyspieszyć wdrażanie twoich aplikacji. Dzięki dockerowi możesz oddzielić swoją aplikację od infrastruktury i traktować infrastrukturę jako zarządzaną aplikację. Docker pomaga w szybszym wdrażaniu kodu, szybszym testowaniu, szybszym uruchamianiu aplikacji i skróceniu czasu pomiędzy pisaniem kodu a jego uruchomieniem. Docker osiąga to dzięki lekkiej platformie wirtualizacji kontenerowej, wykorzystując procesy i narzędzia, które pomagają zarządzać i wdrażać twoje aplikacje.
U podstaw docker pozwala uruchamiać prawie każdą aplikację, bezpiecznie izolowaną w kontenerze. Bezpieczna izolacja pozwala uruchamiać wiele kontenerów równocześnie na jednym hoście. Lekką natura kontenera, który działa bez dodatkowego obciążenia hypervisor, pozwala osiągnąć więcej z twojego sprzętu.
Platforma i narzędzia wirtualizacji kontenerowej mogą być przydatne w następujących przypadkach:
- opakowanie twojej aplikacji (i również używanych komponentów) w kontenery docker;
- dystrybucja i dostarczanie tych kontenerów twoim zespołom do pracy i testowania;
- wdrażanie tych kontenerów w twoich środowiskach produkcyjnych, zarówno w centrach danych, jak i w chmurze.
Do czego mogę używać dockera?
Szybkie wdrażanie twoich aplikacji
Docker świetnie nadaje się do organizacji cyklu rozwoju. Docker pozwala programistom używać lokalnych kontenerów z aplikacjami i usługami. Co umożliwia późniejszą integrację z procesem ciągłej integracji i wdrażania.
Na przykład twoi programiści piszą kod lokalnie i dzielą się swoim stosem deweloperskim (zestawem obrazów dockera) z kolegami. Kiedy są gotowi, wysyłają kod i kontenery na strefę testową i uruchamiają wszelkie niezbędne testy. Z strefy testowej mogą wysłać kod i obrazy na produkcję.
Prostsze wdrażanie i uruchamianie
Platforma oparta na kontenerach Docker umożliwia łatwe przenoszenie Twojego obciążenia. Kontenery Docker mogą działać na Twojej lokalnej maszynie, zarówno na rzeczywistym sprzęcie, jak i na maszynie wirtualnej w data center, a także w chmurze.
Przenośność i lekka natura Dockera umożliwiają łatwe dynamiczne zarządzanie Twoim obciążeniem. Możesz używać Dockera do uruchamiania lub zatrzymywania swojej aplikacji lub usług. Szybkość Dockera pozwala na to niemal w czasie rzeczywistym.
Wysokie obciążenia i większe ładunki.
Docker jest lekki i szybki. Oferuje stabilną, ekonomiczną alternatywę dla maszyn wirtualnych opartych na hipernadzorze. Jest szczególnie przydatny w warunkach wysokich obciążeń, na przykład przy budowie własnej chmury lub platforma-jako-usługa (platform-as-service). Jednak jest także użyteczny dla małych i średnich aplikacji, gdy chcesz maksymalnie wykorzystać dostępne zasoby.
Główne składniki Dockera.
Docker składa się z dwóch głównych składników:
- Docker: platforma wirtualizacji z otwartym kodem;
- Docker Hub: nasza platforma-jako-usługa do dystrybucji i zarządzania kontenerami Docker.
Uwaga! Docker jest rozpowszechniany na licencji Apache 2.0.
Architektura Dockera.
Docker wykorzystuje architekturę klient-serwer. Klient Docker komunikuje się z demonem Docker, który zajmuje się ciężarem tworzenia, uruchamiania i zarządzania Twoimi kontenerami. Zarówno klient, jak i serwer mogą działać na tym samym systemie; możesz podłączyć klienta do zdalnego demona Docker. Klient i serwer komunikują się za pośrednictwem gniazda lub przez RESTful API.

Demon Docker.
Jak pokazano na diagramie, demon uruchamia się na hoście. Użytkownik nie wchodzi w bezpośrednią interakcję z serwerem, ale korzysta z klienta.
Klient Docker.
Klient Docker, program docker — to główny interfejs do Dockera. Odbiera polecenia od użytkownika i komunikuje się z demonem Docker.
Wewnątrz Dockera.
Aby zrozumieć, z czego składa się Docker, musisz znać trzy składniki:
- obrazy (images)
- rejestry (registries)
- kontenery
Obrazy
Obraz Docker to szablon tylko do odczytu. Na przykład obraz może zawierać system operacyjny Ubuntu z Apache i aplikacją na nim. Obrazy są używane do tworzenia kontenerów. Docker umożliwia łatwe tworzenie nowych obrazów, aktualizowanie istniejących lub możesz pobrać obrazy utworzone przez innych. Obrazy to składnik budowy Dockera.
Rejestr
Rejestr Docker przechowuje obrazy. Są publiczne i prywatne rejestry, z których można pobrać lub załadować obrazy. Publiczny rejestr Docker to . Gromadzi ogromną kolekcję obrazów. Jak wiesz, obrazy mogą być utworzone przez Ciebie lub możesz korzystać z obrazów stworzonych przez innych. Rejestry to składnik dystrybucji.
Kontenery
Kontenery są podobne do katalogów. W kontenerach znajduje się wszystko, co potrzebne do działania aplikacji. Każdy kontener jest tworzony z obrazu. Kontenery mogą być tworzone, uruchamiane, zatrzymywane, przenoszone lub usuwane. Każdy kontener jest izolowany i stanowi bezpieczną platformę dla aplikacji. Kontenery to składnik działania.
Jak działa Docker?
Na razie wiemy, że:
- możemy tworzyć obrazy, w których znajdują się nasze aplikacje;
- możemy tworzyć kontenery z obrazów, aby uruchamiać aplikacje;
- możemy rozpowszechniać obrazy przez Docker Hub lub inny rejestr obrazów.
Przyjrzyjmy się, jak te składniki współpracują.
Jak działa obraz?
Już wiemy, że obraz to szablon tylko do odczytu, z którego tworzony jest kontener. Każdy obraz składa się z zestawu warstw. Docker wykorzystuje do łączenia tych warstw w jeden obraz. System plików union pozwala na przezroczyste nakładanie się plików i katalogów z różnych systemów plików (różnych gałęzi), tworząc spójną strukturę plików.
Jednym z powodów, dla których Docker jest lekki, jest wykorzystanie takich warstw. Kiedy modyfikujesz obraz, na przykład aktualizujesz aplikację, tworzona jest nowa warstwa. Dzięki temu, bez wymiany całego obrazu lub jego ponownego skompilowania, jak może być konieczne w przypadku maszyny wirtualnej, tylko warstwa jest dodawana lub aktualizowana. Nie musisz rozprowadzać całego nowego obrazu, rozprowadzasz tylko aktualizację, co ułatwia i przyspiesza dystrybucję obrazów.
Podstawą każdego obrazu jest obraz bazowy. Na przykład, ubuntu, obraz bazowy Ubuntu, lub fedora, obraz bazowy dystrybucji Fedora. Możesz również używać obrazów jako podstawy do tworzenia nowych obrazów. Na przykład, jeśli masz obraz apache, możesz użyć go jako obrazu bazowego dla swoich aplikacji webowych.
Uwaga! Docker zazwyczaj pobiera obrazy z rejestru Docker Hub.
Obrazy Dockera mogą być tworzone z tych bazowych obrazów, kroki opisujące tworzenie tych obrazów nazywamy instrukcjami. Każda instrukcja tworzy nowy obraz lub warstwę. Instrukcjami będą następujące działania:
- uruchomienie polecenia
- dodanie pliku lub katalogu
- utworzenie zmiennej środowiskowej
- określenie, co uruchomić, gdy kontener tego obrazu jest uruchamiany
Te instrukcje są przechowywane w pliku Dockerfile. Docker odczytuje to Dockerfile, gdy budujesz obraz, wykonuje te instrukcje i zwraca końcowy obraz.
Jak działa rejestr dockera?
Rejestr to przechowalnia obrazów dockera. Po utworzeniu obrazu możesz opublikować go w publicznym rejestrze Docker Hub lub w swoim prywatnym rejestrze.
Za pomocą klienta dockera możesz wyszukiwać już opublikowane obrazy i pobierać je na swoją maszynę z dockerem w celu tworzenia kontenerów.
Docker Hub oferuje publiczne i prywatne repozytoria obrazów. Wyszukiwanie i pobieranie obrazów z publicznych repozytoriów jest dostępne dla wszystkich. Zawartość prywatnych repozytoriów nie pojawia się w wynikach wyszukiwania. Tylko Ty i Twoi użytkownicy mogą uzyskiwać dostęp do tych obrazów i tworzyć z nich kontenery.
Jak działa kontener?
Kontener składa się z systemu operacyjnego, plików użytkownika i metadanych. Jak wiemy, każdy kontener jest tworzony z obrazu. Ten obraz informuje docker, co znajduje się w kontenerze, jaki proces uruchomić, gdy kontener jest uruchamiany oraz inne dane konfiguracyjne. Obraz dockera jest dostępny tylko do odczytu. Gdy docker uruchamia kontener, tworzy warstwę do odczytu/zapisu na szczycie obrazu (używając systemu plików union, jak wspomniano wcześniej), w której można uruchomić aplikację.
Co się dzieje, gdy kontener jest uruchamiany?
Albo za pomocą programu docker, albo za pomocą RESTful API, klient dockera mówi demonowi dockera, aby uruchomił kontener.
$ sudo docker run -i -t ubuntu /bin/bash
Przyjrzyjmy się tej komendzie. Klient jest uruchamiany poleceniem docker, z opcją run, który mówi, że nowy kontener zostanie uruchomiony. Minimalne wymagania do uruchomienia kontenera to następujące atrybuty:
- jaki obraz użyć do stworzenia kontenera. W naszym przypadku
ubuntu - komenda, którą chcesz uruchomić, gdy kontener będzie uruchomiony. W naszym przypadku
/bin/bash
Co tak naprawdę dzieje się w tle, gdy uruchamiamy tę komendę?
Docker, krok po kroku, wykonuje następujące czynności:
- pobiera obraz ubuntu: docker sprawdza, czy obraz
ubuntujest na lokalnej maszynie, a jeśli go nie ma - pobiera go z . Jeśli obraz jest dostępny, wykorzystuje go do stworzenia kontenera; - tworzy kontener: gdy obraz jest już pobrany, docker wykorzystuje go do stworzenia kontenera;
- inicjalizuje system plików i montuje poziom tylko do odczytu: kontener jest tworzony w systemie plików, a poziom tylko do odczytu jest dodawany do obrazu;
- inicjalizuje sieć/moszt: tworzy interfejs sieciowy, który pozwala dockerowi komunikować się z maszyną hosta;
- Ustala adres IP: znajduje i ustawia adres;
- Uruchamia wskazany proces: uruchamia Twoją aplikację;
- Przetwarza i generuje wyjście Twojej aplikacji: łączy się i rejestruje standardowy input, output i strumień błędów Twojej aplikacji, abyś mógł śledzić, jak działa Twoja aplikacja.
Teraz masz działający kontener. Możesz zarządzać swoim kontenerem i wchodzić w interakcje ze swoją aplikacją. Gdy zdecydujesz się zatrzymać aplikację, usuń kontener.
Wykorzystywane technologie
Docker jest napisany w języku Go i wykorzystuje niektóre możliwości jądra Linux, aby zrealizować powyższą funkcjonalność.
Przestrzenie nazw (namespaces)
Docker wykorzystuje technologię namespaces do organizacji izolowanych przestrzeni roboczych, które nazywamy kontenerami. Gdy uruchamiamy kontener, docker tworzy zestaw przestrzeni nazw dla danego kontenera.
Tworzy to poziom izolacji, w którym każdy aspekt kontenera działa w swoim własnym przestrzeni nazw i nie ma dostępu do systemu zewnętrznego.
Listę niektórych przestrzeni nazw, które wykorzystuje docker:
- pid: do izolacji procesu;
- net: do zarządzania interfejsami sieciowymi;
- ipc: do zarządzania zasobami IPC. (ICP: InterProccess Communication);
- mnt: do zarządzania punktami montowania;
- utc: do izolacji jądra i kontroli wersji (UTC: Unix timesharing system).
Grupy kontrolne (control groups)
Docker również wykorzystuje tę technologię cgroups lub grupy kontrolne. Klucz do pracy aplikacji w izolacji, zapewniając aplikacji tylko te zasoby, które chcesz udostępnić. Gwarantuje to, że kontenery będą dobrymi sąsiadami. Grupy kontrolne pozwalają dzielić dostępne zasoby sprzętowe, a w razie potrzeby ustalać limity i ograniczenia. Na przykład, ograniczyć możliwą ilość pamięci dla kontenera.
Union File System
Union File System lub UnionFS – to system plików, który działa przez tworzenie warstw, co czyni go bardzo lekkim i szybkim. Docker wykorzystuje UnionFS do tworzenia bloków, z których budowany jest kontener. Docker może korzystać z kilku wariantów UnionFS, w tym: AUFS, btrfs, vfs i DeviceMapper.
Formaty kontenerów
Docker łączy te komponenty w opakowanie, które nazywamy formatem kontenera. Domyślnie używany format nazywa się libcontainer. Docker wspiera również tradycyjny format kontenerów w systemie Linux za pomocą . W przyszłości Docker może wspierać inne formaty kontenerów, na przykład integrując się z BSD Jails lub Solaris Zones.
Źródło: habr.com
