Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00235 006818 13439281 na godz. na dobę w sumie
Docker. Projektowanie i wdrażanie aplikacji - ebook/pdf
Docker. Projektowanie i wdrażanie aplikacji - ebook/pdf
Autor: Liczba stron: 224
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-3535-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> inne - programowanie
Porównaj ceny (książka, ebook (-40%), audiobook).

Piętnastego marca 2013 roku na jednej z konferencji dla projektantów aplikacji zaprezentowano światu Dockera. Choć wystąpienie to trwało zaledwie kilka minut, wzbudziło ogromne zainteresowanie. Nic dziwnego — nowe narzędzie znacząco uprościło tworzenie oprogramowania i wdrażanie go na dużą skalę w dowolnym środowisku oraz usprawniło przepływ pracy. Docker ułatwia decyzje dotyczące architektury, co przekłada się na tworzenie narzędzi pomocniczych i ich wykorzystanie w różnych aplikacjach. Jednak aby w pełni skorzystać z tych licznych zalet, trzeba zrozumieć specyficzne podejście Dockera do budowy aplikacji.

Dzięki tej książce zrozumiesz, skąd się wziął lawinowy wzrost popularności Dockera. Przyjrzysz się temu znakomitemu narzędziu z punktu widzenia projektanta i dowiesz się, dlaczego dzięki niemu projektowanie, testowanie i wdrażanie aplikacji stają się szybsze i prostsze. Najpierw zapoznasz się z zagadnieniami podstawowymi, takimi jak kontenery, środowisko wykonawcze i narzędzia systemowe, aby potem skupić się na tworzeniu, uruchamianiu i publikowaniu obrazów Dockera. Znajdziesz tu również informacje o przydatnych zasobach internetowych dotyczących Dockera, a także o wartościowych narzędziach zewnętrznych, znakomicie poprawiających komfort pracy z tym narzędziem.

Najważniejsze zagadnienia:

Docker: już dziś korzystaj z narzędzi jutra!


Jarosław Krochmalski — od kilkunastu lat tworzy oprogramowanie. Specjalizuje się w aplikacjach dla branży finansowej. Jest projektantem z pasją, entuzjastą przejrzystego kodu i kunsztu w pisaniu oprogramowania. Otrzymał certyfikat Certified Scrum Master. Szczególnie interesuje się nowymi technologiami związanymi z projektowaniem aplikacji internetowych, wzorcami projektowymi, architekturą dla przedsiębiorstw oraz wzorcami integracji. Brał udział w wielu projektach o dużej skali, takich jak międzynarodowe przekazy pieniężne, płatności ekspresowe i systemy gromadzenia danych. Obecnie pracuje jako konsultant w duńskiej firmie 7N.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Developing with Docker Tłumaczenie: Piotr Pilch ISBN: 978-83-283-3534-9 Copyright © 2016 Packt Publishing First published in the English language under the title ‘Developing with Docker - (9781786469908)’ Polish edition copyright © 2017 by Helion SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/docpro Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści 9 10 11 15 16 16 16 17 17 18 18 19 19 20 20 21 22 23 23 24 25 27 28 29 36 O autorze O recenzentach Przedmowa Rozdział 1. Wprowadzenie do Dockera Podstawowa idea Porównanie konteneryzacji i wirtualizacji Tradycyjna wirtualizacja Konteneryzacja Korzyści wynikające z zastosowania Dockera Szybkość i wielkość Odtwarzalne i przenośne kompilacje Trwała i „zwinna” infrastruktura Narzędzia i interfejsy API Przegląd narzędzi Środowisko Docker Engine i jego klient Docker Machine Kitematic Narzędzie Compose Dockera Oracle VirtualBox Git Podsumowanie Rozdział 2. Instalowanie Dockera Wymagania sprzętowe Instalacja w systemie Windows Instalacja w systemie Mac OS Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Instalacja w systemie Linux Instalacja w chmurze — AWS Podsumowanie Rozdział 3. Obrazy i kontenery Dockera Obrazy Warstwy Kontenery Zapisywanie zmian w kontenerze Rejestr, repozytorium i indeks Dockera Podsumowanie Rozdział 4. Rozwiązania sieciowe i pamięć trwała kontenerów Rozwiązania sieciowe Dockera Sieci domyślne Brak połączenia sieciowego Sieć hosta Sieć z mostem Tworzenie sieci Uruchamianie kontenera w sieci Tworzenie sieci z wieloma hostami Udostępnianie i mapowanie portów Łączenie kontenerów Dodatki sieciowe Wolumeny Dockera Tworzenie wolumenu Usuwanie wolumenu Sterowniki wolumenów Podsumowanie Rozdział 5. Znajdowanie obrazów Serwis Docker Hub Konto w serwisie Docker Hub Konto organizacji i zespoły Współpracownicy Repozytoria prywatne Logowanie w serwisie Docker Hub Wyszukiwanie obrazów Nazewnictwo obrazów i znaczniki Wyszukiwanie za pośrednictwem interfejsu strony internetowej Wyszukiwanie za pomocą wiersza poleceń Interfejs API REST rejestru Dockera i serwisu Docker Hub Podsumowanie 4 40 43 47 49 50 52 56 59 62 64 67 68 69 70 70 71 72 73 75 82 86 88 89 89 94 96 97 99 100 102 103 104 105 106 108 109 110 112 114 116 Poleć książkęKup książkę Spis treści Rozdział 6. Tworzenie obrazów Instrukcje pliku Dockerfile FROM MAINTAINER ADD COPY CMD ENTRYPOINT LABEL EXPOSE RUN USER VOLUME WORKDIR ARG ONBUILD STOPSIGNAL HEALTHCHECK SHELL Użycie plików Dockerfile Podsumowanie Rozdział 7. Uruchamianie kontenerów Tryby środowiska wykonawczego — odłączony i pierwszoplanowy Tryb odłączony Tryb pierwszoplanowy Identyfikowanie obrazów i kontenerów Ustawienia identyfikatorów procesów PID Ustawienia przestrzeni nazw UTS Nadpisywanie domyślnych poleceń w pliku Dockerfile Nadpisywanie instrukcji CMD Nadpisywanie instrukcji ENTRYPOINT Wykonywanie dowolnych poleceń za pomocą polecenia exec Monitorowanie kontenerów Wyświetlanie dzienników Zdarzenia kontenera Inspekcja kontenera Statystyki Kody wyjścia kontenera i zasady restartowania Zasada no Zasada always Zasada on-failure Zasada unless-stopped Aktualizowanie zasady restartowania dla działającego kontenera 117 119 119 120 121 123 124 126 129 131 132 135 135 137 137 138 139 139 140 141 144 145 147 147 148 149 150 151 151 152 152 153 154 155 157 158 160 161 162 162 162 163 163 5 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Ograniczenia uruchomionego kontenera dotyczące zasobów Pamięć Procesory Aktualizowanie ograniczeń dla działającego kontenera Tryb Swarm Dockera Cel Terminologia Polecenia trybu Swarm Podsumowanie Rozdział 8. Publikowanie obrazów Publikowanie obrazów Tworzenie znaczników Usuwanie znacznika z obrazu Umieszczanie obrazu w repozytorium Elementy Webhook i zautomatyzowany proces budowania Konfigurowanie zautomatyzowanego procesu budowania Wyzwalacze budowania Elementy Webhook i wdrożenia ciągłe Podsumowanie Rozdział 9. Użycie Dockera w programowaniu Użycie Dockera z narzędziem Maven Wtyczka Spotify docker-maven-plugin Wtyczka fabric8.io Maven Docker Aplikacja Spring Boot w kontenerze Dockera Umieszczanie w kontenerze aplikacji Angular.js Podsumowanie Dodatek A. Dodatkowe zasoby Oficjalna dokumentacja Strona Awesome Docker Szkolenie Skorowidz 165 165 167 169 170 171 171 172 174 175 175 176 176 176 177 178 183 184 190 191 192 193 194 198 206 212 215 215 216 217 219 6 Poleć książkęKup książkę 1 Wprowadzenie do Dockera Pierwotnie Docker został utworzony jako wewnętrzne narzędzie przez firmę o nazwie dotCloud, która oferowała usługę PaaS (ang. Platform as a Service). Później, w marcu 2013 r., Docker udo- stępniono w postaci oprogramowania open source. Oprócz zespołu firmy Docker Inc., która jest głównym twórcą, wkład w rozwój tego narzędzia ma kilka innych dużych firm, między innymi Red Hat, IBM, Microsoft, Google i Cisco Systems. Narzędzia do tworzenia oprogra- mowania muszą obecnie cechować się „zwinnością” i zapewniać możliwość szybkiego reago- wania na zmiany. Stosowane są metodologie, takie jak Scrum, nakład pracy szacowany jest za pomocą jednostek względnych (ang. story points), a ponadto mają miejsce codzienne spotka- nia. Jak jednak wygląda kwestia przygotowania oprogramowania do dostarczenia i wdrożenia? Dowiedzmy się, jak Docker sprawdza się w takim scenariuszu, a także w jaki sposób może ułatwić uzyskanie „zwinności”. W rozdziale zostaną omówione następujące zagadnienia:  podstawowa idea przyświecająca powstaniu Dockera,  różnica między wirtualizacją i konteneryzacją,  korzyści wynikające z zastosowania Dockera,  komponenty dostępne do zainstalowania. Zaczniemy od podstawowej idei przyświecającej powstaniu tego wspaniałego narzędzia. Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Podstawowa idea Podstawową ideą przyświecającą powstaniu narzędzia Docker jest umieszczenie aplikacji z jej wszystkimi zależnościami (mogą to być dane binarne, biblioteki, pliki konfiguracyjne, skrypty, pliki JAR itd.) w jednostce standaryzowanej pod kątem procesu tworzenia i wdrażania opro- gramowania. Kontenery Dockera zawierają nie tylko kod programu, ale posiadają dodatkowo narzędzia i biblioteki systemowe, środowisko uruchomieniowe wraz z gotową konfiguracją, czyli wszystko to, co musiałoby być zainstalowane na serwerze. Gwarantuje to, że oprogramowa- nie zawsze będzie działać w taki sam sposób, niezależnie od tego, w jakim środowisku zosta- nie wdrożone. Dzięki Dockerowi możesz utworzyć projekt dla środowiska Node.js lub Java (nie jesteś oczywiście ograniczony wyłącznie do nich) bez konieczności instalowania którego- kolwiek z tych środowisk na komputerze hosta. Gdy projekt już nie będzie potrzebny, możesz po prostu usunąć obraz Dockera, tak jakby nic wcześniej nie miało miejsca. Docker nie jest językiem programowania ani platformą programistyczną. Traktuj go raczej jak narzędzie, które ułatwia rozwiązywanie typowych problemów, takich jak instalacja i dystrybucja oprogramowa- nia oraz zarządzanie nim. Docker pozwala programistom i osobom korzystającym z metodyki DevOps tworzyć, dostarczać i uruchamiać kod w dowolnym miejscu. Możesz uznać, że Docker to mechanizm wirtualizacji, ale jak się wkrótce okaże, narzędzie to dalekie jest od tego. Porównanie konteneryzacji i wirtualizacji Aby w pełni zrozumieć, czym naprawdę jest Docker, konieczne jest najpierw uzmysłowienie sobie różnicy między tradycyjną wirtualizacją i konteneryzacją. Porównajmy teraz te dwie technologie. Tradycyjna wirtualizacja Tradycyjna maszyna wirtualna, która reprezentuje wirtualizację na poziomie sprzętowym, to za- sadniczo kompletny system operacyjny, działający na bazie systemu operacyjnego hosta. Istnieją dwa typy hipernadzorcy wirtualizacji: typ 1. i typ 2. Hipernadzorcy typu 1. zapewniają wirtu- alizację serwera na sprzęcie pozbawionym tradycyjnego systemu operacyjnego obsługiwanego przez zwykłych użytkowników. Z kolei hipernadzorcy typu 2. są powszechnie wykorzystywani do wirtualizacji desktopów. W tym wypadku mechanizm wirtualizacji działa na bazie systemu operacyjnego stosowanego przez użytkownika. Istnieje mnóstwo zastosowań, które korzystają z wirtualizacji. Największą zaletą jest możliwość uruchomienia na jednym hoście wielu ma- szyn wirtualnych z całkowicie odmiennymi systemami operacyjnymi. Ponieważ maszyny wirtualne są w pełni izolowane, są bardzo bezpieczne. Nic jednak nie odby- wa się bez ponoszenia kosztów. Wyróżnić można wiele mankamentów, które obejmują wszystkie elementy, jakie musi mieć system operacyjny: sterowniki urządzeń, podstawowe biblioteki 16 Poleć książkęKup książkę Rozdział 1. • Wprowadzenie do Dockera systemowe itp. Maszyny wirtualne są ciężkie, zużywają zwykle wiele zasobów, a ponadto nie są łatwe do skonfigurowania i wymagają przeprowadzenia pełnej instalacji systemu. Dodatkowo podczas działania zużywają więcej zasobów na własne potrzeby. Aby pomyślnie uruchomić aplikację na maszynie wirtualnej, hipernadzorca musi ją najpierw zaimportować, a następnie załadować, co wymaga czasu. Co więcej, wydajność maszyn może znacznie spaść. W rezultacie na jednym komputerze efektywnie może zostać uruchomionych tylko kilka maszyn wirtualnych. Konteneryzacja Narzędzie Docker działa w izolowanym środowisku nazywanym kontenerem Dockera. Nie jest to maszyna wirtualna w ogólnie przyjętym znaczeniu. Kontener Dockera reprezentuje wirtu- alizację systemu operacyjnego. Każdy obraz maszyny wirtualnej działa w niezależnym systemie operacyjnym gościa, natomiast obrazy Dockera funkcjonują w obrębie jądra tego samego systemu operacyjnego. Kontener ma własny system plików i zmienne środowiskowe. Jest samowystar- czalny. Ponieważ kontenery działają wewnątrz jednego jądra, zużywają mniej zasobów syste- mowych. Podstawowy kontener może być, i zwykle jest, bardzo lekki. Warto wiedzieć, że konte- nery Dockera są izolowane nie tylko od bazowego systemu operacyjnego, ale też wzajemnie od siebie samych. Nie jest generowane żadne dodatkowe obciążenie związane z klasycznym hipernadzorcą wirtualizacji i systemem operacyjnym gościa. Pozwala to na uzyskanie wydajności równej niemal wydajności sprzętowej bez narzutu innego systemu operacyjnego. Czas rozruchu aplikacji korzystającej z Dockera jest zwykle bardzo krótki, co wynika z niewielkiego obcią- żenia powodowanego przez kontenery. Możliwe jest również przyspieszenie procesu wprowadza- nia w ciągu kilku sekund setek kontenerów aplikacji i skrócenie czasu, jaki zajmuje dostarczenie oprogramowania. Jak widać, Docker w dość znacznym stopniu różni się od tradycyjnych mechanizmów wirtuali- zacji. Miej świadomość tego, że kontenery nie mogą zastąpić maszyn wirtualnych we wszystkich zastosowaniach. Wnikliwa ocena wymagań w dalszym ciągu niezbędna jest do stwierdzenia, co jest najlepsze z punktu widzenia aplikacji. Oba rozwiązania mają swoje zalety. Z jednej strony dysponujemy w pełni izolowaną i bezpieczną maszyną wirtualną o średniej wydajno- ści, a z drugiej kontenerami pozbawionymi części kluczowych cech (np. całkowita izolacja), ale zapewniającymi dużą wydajność oraz możliwość szybszego wdrożenia w środowisku. Dowiedzmy się, jakie inne korzyści osiągane są podczas stosowania konteneryzacji Dockera. Korzyści wynikające z zastosowania Dockera Porównując kontenery Dockera z tradycyjnymi maszynami wirtualnymi, wspomniano o nie- których ich zaletach. Pora je teraz dokładniej przeanalizować i zaprezentować kilka dodatko- wych korzyści. 17 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Szybkość i wielkość Jak już wcześniej wspomniano, pierwszą widoczną korzyścią wynikającą z użycia Dockera będzie bardzo zadowalająca wydajność i krótki czas dostarczania. Możliwe jest szybkie i łatwe two- rzenie lub usuwanie kontenerów. Docker współużytkuje wyłącznie jądro i nic ponadto. Korzysta jednak ponownie z warstw obrazów, na bazie których tworzony jest konkretny obraz. W rezultacie wiele wersji aplikacji uruchomionych w kontenerach będzie bardzo lekkich. Dzięki temu za- pewniane są szybsze wdrożenie, łatwiejsza migracja i krótkie czasy rozruchu. Odtwarzalne i przenośne kompilacje Użycie Dockera pozwala na wdrożenie oprogramowania gotowego do uruchomienia, które jest przenośne i szczególnie łatwo może być rozprowadzane (proces tworzenia obrazu zostanie omówiony w rozdziale 6., „Tworzenie obrazów”). Aplikacja objęta konteneryzacją po prostu działa w obrębie własnego kontenera: nie trzeba przeprowadzać tradycyjnej instalacji. Kluczową korzyścią związaną z obrazem Dockera jest to, że zawiera on wszystkie zależności, jakie apli- kacja musi posiadać, aby poprawnie się uruchomić. Brak instalacji zależności na serwerze sta- nowi ogromną zaletę. Eliminuje to takie problemy, jak konflikty oprogramowania i bibliotek, a nawet problemy ze zgodnością sterowników. Dzięki środowisku odtwarzalnych kompilacji na- rzędzia Docker jest ono szczególnie dobrze przystosowane do testowania, zwłaszcza w przypadku przepływu integracji ciągłej (ang. Continuous Integration). W celu przeprowadzenia testów mo- żesz szybko dokonać rozruchu identycznych środowisk. Ponieważ obrazy kontenera są każdora- zowo takie same, możliwa jest dystrybucja obciążenia i bezproblemowe uruchamianie równole- głych testów. Programiści mogą na swoich komputerach uruchamiać ten sam obraz, który później zostanie użyty na komputerze produkcyjnym. I tym razem zapewnia to ogromną korzyść związaną z testowaniem. Użycie kontenerów Dockera przyspiesza integrację ciągłą. Nie występuje już nie- skończona liczba cykli kompilowanie-testowanie-wdrażanie. Kontenery Dockera zapewniają, że aplikacje działają identycznie w środowiskach projektowych, testowych i produkcyjnych. Jedna z najwspanialszych cech Dockera to przenośność. Kontenery Dockera są przenośne, więc mogą być uruchomione gdziekolwiek: na komputerze lokalnym, na pobliskim lub odle- głym serwerze albo w prywatnej lub publicznej chmurze. Skoro mowa o chmurze — wszyscy najważniejsi dostawcy usług obliczeniowych opartych na chmurze, takich jak Amazon Web Services i Google Compute Platform, zdali sobie sprawę z dostępności narzędzia Docker, które jest obecnie przez nich obsługiwane. Kontenery Dockera mogą być uruchamiane wewnątrz instancji usługi Amazon EC2 lub instancji usługi Google Compute Engine, pod warunkiem że Docker obsługiwany jest przez system operacyjny hosta. Kontener działający w instancji usługi Amazon EC2 z łatwością może zostać przeniesiony do jakiegoś innego środowiska, osiągając identyczny poziom spójności i funkcjonalności. Docker bardzo dobrze współpracuje z różnymi innymi dostawcami modelu IaaS (ang. Infrastructure-as-a-Service), takimi jak Micro- soft Azure, IBM SoftLayer lub OpenStack. Taki dodatkowy poziom abstrakcji względem war- stwy infrastruktury jest czymś niezastąpionym. Oprogramowanie może być po prostu tworzone bez martwienia się tym, na jakiej później platformie zostanie uruchomione. Jest to rzeczywi- ście rozwiązanie typu utwórz raz i uruchamiaj gdziekolwiek. 18 Poleć książkęKup książkę Rozdział 1. • Wprowadzenie do Dockera Trwała i „zwinna” infrastruktura Utrzymywanie prawdziwie niezmiennej bazy kodu zarządzania konfiguracją może być złożonym i czasochłonnym procesem. Z upływem czasu kod zwiększa swoją wielkość i staje się coraz bar- dziej kłopotliwy. Z tego właśnie powodu idea trwałej infrastruktury zyskuje obecnie coraz większą popularność. Na ratunek przychodzi konteneryzacja. Użycie kontenerów podczas procesu pro- gramowania i wdrażania aplikacji pozwala uprościć proces. Zastosowanie lekkiego serwera Doc- kera, który nie wymaga prawie żadnego zarządzania konfiguracją, powoduje, że zarządzanie aplikacjami sprowadza się do wielokrotnego wdrażania kontenerów na serwerze. I tym razem lekkie kontenery sprawiają, że ich użycie wymaga poświęcenia jedynie kilku sekund. Na początek możesz pobrać wstępnie utworzony obraz Dockera z serwisu Docker Hub, który przypomina repozytorium gotowych do użycia obrazów. W serwisie dostępnych jest wiele opcji wyboru serwerów WWW, platform środowiska uruchomieniowego, baz danych, serwerów prze- syłania komunikatów itp. Serwis jest jak prawdziwa kopalnia złota w postaci darmowego oprogra- mowania, które może być fundamentem Twojego własnego projektu. Serwis Docker Hub oraz proces wyszukiwania w nim obrazów zostanie omówiony w rozdziale 5., „Znajdowanie obrazów”. Efekt niezmienności obrazów Dockera wynika ze sposobu, w jaki są one tworzone. Docker korzysta ze specjalnego pliku o nazwie Dockerfile. Plik zawiera wszystkie instrukcje instalacyjne dotyczące tego, jak ma zostać utworzony obraz. Instrukcje odwołują się do niezbędnych kompo- nentów, bibliotek, udostępnionych katalogów współużytkowanych, konfiguracji sieciowej itp. Obraz może być bardzo prosty i nie zawierać niczego oprócz podstawowych składników sys- temu operacyjnego. Obraz może też, co jest częściej spotykane, zawierać cały wstępnie przy- gotowany stos technologii gotowych do uruchomienia. Obrazy mogą być tworzone ręcznie, ale też może to być zautomatyzowany proces. Docker tworzy obrazy w sposób warstwowy: każdy dołączany składnik będzie dodawany jako kolejna warstwa podstawowego obrazu. W ten sposób uzyskuje się poważny przyrost szybko- ści w porównaniu z tradycyjnymi technikami wirtualizacji. Szczegółami związanymi z tworzeniem obrazów zajmiemy się w rozdziale 6., „Tworzenie obrazów”. Narzędzia i interfejsy API Docker to oczywiście nie tylko procesor pliku Dockerfile i mechanizm środowiska urucho- mieniowego. Jest to kompletny pakiet oferujący bogatą gamę narzędzi i interfejsów API, które są pomocne w czasie codziennej pracy programistów i osób korzystających z metodyki DevOps. Przede wszystkim dostępne jest narzędzie Docker Toolbox, które pełni funkcję instalatora po- zwalającego szybko i łatwo zainstalować i skonfigurować środowisko Dockera na własnym komputerze. Kitematic to klienckie środowisko graficzne przeznaczone do zarządzania kon- tenerami oraz obrazami Dockera w systemach Windows i Mac OS X. Dystrybucja Dockera zawiera również całą grupę narzędzi wiersza poleceń, które będą omawiane w książce. Przyj- rzyjmy się im teraz. 19 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Przegląd narzędzi Zależnie od używanej wersji systemu Windows dostępne są dwie opcje. W przypadku systemu Windows 10 lub nowszego możesz skorzystać z narzędzia Docker for Windows. Jeśli używasz jednego z wcześniejszych wersji systemu Windows, dostępne jest narzędzie Docker Toolbox. Najnowsza oferta to narzędzie Docker for Mac, które działa jako natywna aplikacja systemu Mac OS, a ponadto używa narzędzia xhyve do wirtualizacji środowiska Docker Engine i jądra systemu Linux. W przypadku wcześniejszej wersji systemu Mac OS, która nie spełnia wymagań narzędzia Docker for Mac (zostaną one wyszczególnione w rozdziale 2., „Instalowanie Dockera”), należy wybrać narzędzie Docker Toolbox for Mac. Idea przyświecająca narzędziu Docker Toolbox i natywnym aplikacjom Dockera jest taka sama, czyli wirtualizacja jądra systemu Linux i śro- dowiska Docker Engine na bazie używanego systemu operacyjnego. Na potrzeby książki bę- dziemy korzystać z narzędzia Docker Toolbox, ponieważ jest uniwersalne. Będzie ono działać we wszystkich wersjach systemów Windows i Mac OS. Pakiet instalacyjny dla tych systemów za- warty jest w pliku wykonywalnym o nazwie Docker Toolbox. W pakiecie znajdują się wszyst- kie narzędzia niezbędne do rozpoczęcia pracy z Dockerem. Istnieje oczywiście całe mnóstwo zgodnych z Dockerem dodatkowych narzędzi zewnętrznych dostawców, spośród których część jest bardzo przydatna. Niektóre z nich w skrócie zostaną zaprezentowane w rozdziale 9., „Użycie Dockera do projektowania”. Skoncentrujmy się jednak na razie na domyślnym zesta- wie narzędzi. Przed rozpoczęciem instalacji przyjrzyjmy się narzędziom oferowanym przez pakiet instalatora, aby lepiej zrozumieć, jakie zmiany zostaną wprowadzone w systemie. Środowisko Docker Engine i jego klient Docker to aplikacja klient-serwer. Uwzględnia ona demona realizującego ważne zadania, a mia- nowicie tworzenie i pobieranie obrazów, uruchamianie i zatrzymywanie kontenerów itp. Docker udostępnia interfejs API REST, który określa interfejsy prowadzące interakcję z demonem i używane na potrzeby zdalnego zarządzania. Środowisko Docker Engine akceptuje polecenia Dockera wprowadzane w wierszu poleceń, na przykład polecenie docker run nazwa-obrazu uru- chamiające obraz, polecenie docker ps wyświetlające listę działających kontenerów oraz po- lecenie docker images, które wyszczególnia obrazy. Klient Dockera to program wiersza poleceń służący do zarządzania hostami Dockera z uru- chomionymi kontenerami systemu Linux. Komendy klienta są zamieniane na odpowiednie zapytania interfejsu REST API, a następnie wysyłane do serwera Dockera. Środowisko Docker Engine działa tylko w systemie Linux. Aby uruchomić Dockera w syste- mie Windows lub Mac OS albo by zapewnić wiele hostów Dockera w sieci lub chmurze, nie- zbędne będzie narzędzie Docker Machine. 20 Poleć książkęKup książkę Rozdział 1. • Wprowadzenie do Dockera Docker Machine Docker Machine to dość nowe narzędzie wiersza poleceń, stworzone przez zespół rozwijający Dockera z myślą o zarządzaniu serwerami Dockera, na których mogą być wdrażane kontenery. Narzędzie to zastąpiło dotychczasową metodę instalowania Dockera za pomocą Boot2Docker. Docker Machine eliminuje konieczność ręcznego tworzenia maszyn wirtualnych i instalowa- nia Dockera przed uruchomieniem na nich kontenerów. Docker Machine automatycznie ob- sługuje proces dostarczania i instalowania Dockera. Inaczej mówiąc, jest to szybki sposób dostar- czania nowej maszyny wirtualnej i przygotowania jej do uruchomienia kontenerów Dockera. Narzędzie Docker Machine okazuje się niezastąpione podczas rozwoju architektury modelu PaaS (ang. Platform as a Service). Nie tylko tworzy nową maszynę wirtualną z zainstalowanym na niej środowiskiem Docker Engine, ale też konfiguruje pliki certyfikatów na potrzeby uwie- rzytelniania, a następnie konfiguruje klienta Dockera, tak aby mógł komunikować się ze śro- dowiskiem. Z myślą o elastyczności w Docker Machine wprowadzono pojęcie sterowników. Dzięki nim Docker ma możliwość komunikowania się z różnym oprogramowaniem wirtuali- zacji i dostawcami usługi chmury. Tak naprawdę podczas instalacji Dockera dla systemu Win- dows lub Mac OS używany będzie domyślny sterownik VirtualBox. W tle zostanie wykonane następujące polecenie: docker-machine create --driver=virtualbox default Kolejny dostępny sterownik to amazonec2, przeznaczony dla usługi Amazon Web Services. Sterownik może posłużyć do instalacji Dockera w chmurze firmy Amazon, co zostanie omówio- ne w dalszej części rozdziału. Istnieje mnóstwo sterowników gotowych do użycia, a ponadto nieustannie pojawiają się kolejne. Lista istniejących oficjalnych sterowników wraz z dokumen- tacją jest dostępna w witrynie internetowej Docker Drivers pod adresem https://docs.docker.com/ machine/drivers. Lista obejmuje aktualnie sterowniki dla następujących usług:  Amazon Web Services,  Microsoft Azure,  Digital Ocean,  Exoscale,  Google Compute Engine,  Generic,  Microsoft Hyper-V,  OpenStack,  Rackspace,  IBM Softlayer,  Oracle VirtualBox, 21 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji  VMware vCloud Air,  VMware Fusion,  VMware vSphere. Oprócz tego istnieje wiele zewnętrznych dodatkowych sterowników dostępnych bezpłatnie w witrynach internetowych, takich jak GitHub. Dodatkowe sterowniki możesz znaleźć dla różnych dostawców chmury i platform wirtualizacji, takich na przykład jak OVH Cloud lub Parallels for Mac OS. Nie ma ograniczenia tylko do usług Amazon AWS lub Oracle Virtual- Box. Jak widać, do wyboru jest wiele różnych sterowników. Jeśli nie możesz znaleźć konkretnego sterownika dla używanego dostawcy chmury, spróbuj poszukać go w witrynie GitHub. W przypadku instalowania narzędzia Docker Toolbox w systemie Windows lub Mac OS na- rzędzie Docker Machine zostanie wybrane domyślnie. Jest ono niezbędne i obecnie stanowi jedyną metodę uruchomienia Dockera w tych systemach operacyjnych. Instalowanie Docker Machine nie jest obligatoryjne w przypadku systemu Linux. Nie ma tutaj potrzeby wirtualizacji jądra systemu Linux. Aby jednak skorzystać z dostawców chmury lub po prostu dysponować wspólnym środowiskiem uruchomieniowym, które może być przenoszone między systemami Mac OS, Windows i Linux, możesz też zainstalować Docker Machine for Linux. Proces ten zosta- nie opisany w dalszej części rozdziału. Narzędzie Docker Machine będzie również stosowane w tle podczas korzystania z narzędzia graficznego Kitematic, które zostanie zaprezentowane wkrótce. Po przeprowadzeniu procesu instalacji narzędzie Docker Machine będzie dostępne z pozio- mu wiersza poleceń po wpisaniu polecenia docker-machine. Kitematic Kitematic to narzędzie umożliwiające uruchamianie kontenerów za pośrednictwem prostego, a przy tym dającego duże możliwości graficznego interfejsu użytkownika (GUI). W 2015 r. firma Docker przejęła firmę tworzącą Kitematica, oczekując, że rozwiązanie dotyczące kontenery- zacji zyska uznanie większej liczby programistów, a co za tym idzie, większą popularność. Kitematic jest obecnie domyślnie dołączany w trakcie instalowania narzędzia Docker Toolbox w systemach Mac OS i Windows. Kitematic pozwala w wygodny sposób wyszukiwać i pobierać niezbędne obrazy z serwisu Docker Hub. Narzędzie to może również być używane do urucha- miania własnych kontenerów. Pozwala edytować zmienne środowiskowe, mapować porty, konfigu- rować wolumeny, analizować dzienniki i uzyskiwać dostęp do kontenerów z poziomu wiersza po- leceń. Warto wspomnieć, że możliwe jest płynne przełączenie się między tym interfejsem i interfejsem wiersza poleceń, aby uruchamiać kontenery aplikacji oraz zarządzać nimi. Kitematic jest bardzo wygodny w użyciu. Jeśli jednak wymagasz większego poziomu kontroli podczas 22 Poleć książkęKup książkę Rozdział 1. • Wprowadzenie do Dockera pracy z kontenerami albo po prostu chcesz uruchomić skrypt, wiersz poleceń będzie lepszym rozwiązaniem. Okazuje się, że Kitematic umożliwia przełączanie się między Docker CLI i interfejsem graficznym. Wszelkie zmiany dokonane w interfejsie wiersza poleceń zostaną bezpo- średnio uwzględnione w Kitematicu. Jak się okaże na końcu rozdziału, gdzie zostanie przete- stowana instalacja na komputerze z systemem Mac OS lub Windows, narzędzie to jest proste w użyciu. W pozostałej części książki do pracy z Dockerem będzie stosowany interfejs wier- sza poleceń. Narzędzie Compose Dockera Compose to narzędzie wykonywane z poziomu wiersza poleceń jako polecenie docker-compose. Zastępuje ono stare narzędzie fig. Compose służy do definiowania i uruchamiania aplikacji Dockera z wieloma kontenerami. Choć bardzo łatwo można sobie wyobrazić taką aplikację (np. serwer WWW w jednym kontenerze, a bazę danych w drugim kontenerze), taki podział nie jest wymagany. A zatem, jeśli zdecydujesz, że aplikacja będzie zawarta w jednym konte- nerze Dockera, nie będzie konieczne użycie polecenia docker-compose. Jednak w rzeczywi- stości z bardzo dużym prawdopodobieństwem aplikacja będzie rozmieszczona w wielu kon- tenerach. Polecenie docker-compose pozwala użyć pliku kompozycji do skonfigurowania usług aplikacji tak, aby mogły być uruchamiane razem w wyizolowanym środowisku. Korzystając następnie z jednego polecenia, tworzysz i uruchamiasz wszystkie usługi na bazie utworzonej konfiguracji. W przypadku aplikacji z wieloma kontenerami polecenie docker-compose spraw- dza się znakomicie podczas programowania i testowania, a także w odniesieniu do przepły- wów integracji ciągłej. Polecenie docker-compose zostanie zastosowane do utworzenia aplikacji z wieloma kontene- rami w dalszej części książki, w rozdziale 6., „Tworzenie obrazów”. Oracle VirtualBox Sterownik Oracle VM VirtualBox to bezpłatny hipernadzorca open source firmy Oracle prze- znaczony dla komputerów o architekturze x86. Zostanie domyślnie zainstalowany w trakcie instalacji narzędzia Docker Toolbox. Hipernadzorca obsługuje tworzenie maszyn wirtualnych działających w systemach Windows, Linux, BSD, OS/2, Solaris itp., a także zarządzanie nimi. W omawianym przypadku narzędzie Docker Machine korzystające ze sterownika hipernad- zorcy VirtualBox użyje go do utworzenia i rozruchu niewielkiej dystrybucji systemu Linux, która umożliwia uruchomienie polecenia docker-engine. Warto wspomnieć, że możliwe jest też uruchomienie niewielkiej instalacji systemu Linux poddanej wirtualizacji bezpośrednio z poziomu samego hipernadzorcy VirtualBox. Każda maszyna Dockera utworzona za pomocą polecenia docker-machine lub Kitematic będzie widoczna i dostępna do rozruchu w oknie hipernadzorcy VirtualBox uruchomionego bezpo- średnio. Prezentuje to poniższy zrzut ekranu. 23 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji Możliwe jest uruchamianie, zatrzymywanie, resetowanie, zmienianie ustawień i wczytywanie dzienników w taki sam sposób, jak w przypadku innych systemów operacyjnych poddanych wirtualizacji. Hipernadzorca VirtualBox może być używany w systemie Windows lub MacOS do innych celów niż na- rzędzie Docker. Git Git to rozproszony system kontroli wersji, który jest powszechnie wykorzystywany na potrze- by tworzenia oprogramowania oraz innych zadań związanych z kontrolą wersji. System kła- dzie nacisk na szybkość, integralność danych oraz wsparcie rozproszonych, nieliniowych przepływów informacji. Narzędzie Docker Machine i klient Dockera bazują na modelu po- bierania/wypychania systemu Git, aby uzyskiwać z sieci niezbędne zależności. Jeśli na przykład zdecydujesz się na uruchomienie obrazu Dockera, którego nie ma na komputerze lokalnym, Docker uzyska ten obraz z serwisu Docker Hub. Docker nie używa wewnętrznie systemu Git w odniesieniu do jakiegokolwiek rodzaju numeracji wersji zasobów. Bazuje jednak na haszo- waniu, aby w unikalny sposób identyfikować warstwy systemu plików, co pod względem działania bardzo przypomina system Git. Początkowo Docker czerpał też inspirację z takich dzia- łań, jak zatwierdzanie, wypychanie i pobieranie. Git również wchodzi w skład pakietu insta- lacyjnego narzędzia Docker Toolbox. 24 Poleć książkęKup książkę Rozdział 1. • Wprowadzenie do Dockera Z perspektywy programisty dostępne są narzędzia, które okazują się szczególnie przydatne w jego codziennej pracy. Może to być wtyczka IntelliJ IDEA Docker Integration przeznaczona dla miłośników języka Java lub oprogramowanie Visual Studio 2015 Tools for Docker dla tych osób, które preferują język C#. Narzędzia te umożliwiają pobieranie i budowanie obrazów Dockera, tworzenie i uruchamianie kontenerów oraz realizowanie innych powiązanych zadań bezpośrednio z poziomu zintegrowanego środowiska programistycznego. Narzędzia te zosta- ną omówione bardziej szczegółowo w następnych rozdziałach. Oprócz narzędzi dołączonych do pakietu dystrybucji Dockera (w przypadku starszych wersji systemu Windows będzie to Docker Toolbox albo Docker for Windows i Docker for Mac) ist- nieją setki niezależnych narzędzi, takich jak Kubernetes i Helios (służą do organizacji Dockera), Prometheus (monitorowanie statystyk) albo Swarm i Shipyard, które umożliwiają zarządzanie klastrami. Wraz z zyskiwaniem coraz większej popularności przez Dockera niemal każdego tygodnia pojawiają się nowe powiązane z nim narzędzia. W rozdziale 9., „Użycie Dockera w pro- gramowaniu”, spróbujemy w skrócie omówić najbardziej interesujące spośród tych narzędzi, jak również dodatkowe zasoby. Nie są to jednak jedyne dostępne narzędzia. Dodatkowo Docker zapewnia zestaw interfejsów API, które mogą być bardzo pomocne. Jednym z nich jest interfejs Remote API służący do zarzą- dzania obrazami i kontenerami. Korzystając z niego, będziesz w stanie kierować obrazy do środo- wiska uruchomieniowego Dockera. Kontener może zostać przeniesiony na inny komputer z działającym Dockerem i uruchomiony na nim bez obaw o problemy ze zgodnością. Może to być szczególnie przydatne podczas tworzenia architektur modelu PaaS (ang. Platform-as-a-Service). Dostępny jest też interfejs Stats API, który zapewni bieżące informacje o wykorzystaniu za- sobów (np. procesor, pamięć, sieciowe oraz blokowe wejście-wyjście) na potrzeby kontene- rów. Ten punkt końcowy API może zostać użyty do tworzenia narzędzi informujących o dzia- łaniu kontenerów (na przykład w systemie produkcyjnym). Podsumowanie Na tym etapie odróżniasz wirtualizację od konteneryzacji. Mam nadzieję, że zauważyłeś korzyści wynikające z użycia drugiego rozwiązania. Wiesz również, jakie komponenty są dostępne do zainstalowania i wykorzystania. Rozpocznijmy podróż po świecie kontenerów i przejdźmy od razu do dzieła, przeprowadzając instalację oprogramowania. 25 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji 26 Poleć książkęKup książkę Skorowidz Git, 24 G I identyfikatory procesów PID, 150 identyfikowanie obrazów i kontenerów, 149 indeks, 62 infrastruktura, 19 inspekcja kontenera, 158 instalacja, 27 nadpisywanie, 152 COPY, 123 ENTRYPOINT, 126 nadpisywanie, 152 EXPOSE, 131 FROM, 119 HEALTHCHECK, 139 LABEL, 129 MAINTAINER, 120 ONBUILD, 138 RUN, 132 SHELL, 140 STOPSIGNAL, 139 USER, 135 w chmurze, 43 w systemie Linux, 40 w systemie Mac OS, 36 w systemie Windows, 29 instrukcja, 50 ADD, 121 ARG, 137 CMD, 124 A aktualizowanie zasady restartowania, 163 Angular.js, 206 aplikacja Spring Boot, 198–206 atak fork-bomba, 150 typu DoS, 150 AWS, 43 B biblioteka Angular.js, 206, 207 brak połączenia sieciowego, 70 C chmura instalacja Dockera, 43 CIFS, 96 CNM, Container Network Model, 68 Compose, 23 D Docker, 15 Docker Machine, 21 Docker Volume Driver, 96 dodatki sieciowe, 88, Patrz także wtyczka dokumentacja, 215 dzienniki, 155 E elementy Webhook, 177, 184 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji instrukcja VOLUME, 135 WORKDIR, 137 instrukcje pliku Dockerfile, 119 interfejs API REST, 19, 114 IPFS, 96 K Keywhiz, 96 Kitematic, 22 klaster, 76 klient Dockera, 20 kody wyjścia kontenera, 161 konfigurowanie zautomatyzowanego procesu budowania, 178 kontenery, 56 aktualizowanie ograniczeń, 169 aplikacje Java, 198 identyfikowanie, 149 inspekcja, 158 kody wyjścia, 161 łączenie, 86 monitorowanie, 154 ograniczenia wykorzystania zasobów, 165 uruchamianie, 145 uruchamianie w sieci, 73 zapisywanie zmian, 59 zdarzenia, 157 konteneryzacja, 17 L Linux instalacja Dockera, 40 Ł łączenie kontenerów, 86 M Mac OS instalacja Dockera, 36 magazyn par klucz-wartość, 77 mapowanie portów, 82 menedżer Swarm, 171 220 model CNM, 68 piaskownica, 68 punkt końcowy, 68 sieć, 68 monitorowanie kontenerów, 154 N nadpisywanie domyślnych poleceń, 151 instrukcji CMD, 152 instrukcji ENTRYPOINT, 152 narzędzie, 20 Bower, 207 Compose, 23 Docker, 15 Docker Engine, 20 Docker Machine, 21 Git, 24 Kitematic, 22 Maven, 192 Oracle VirtualBox, 23 nazewnictwo obrazów, 109 Node.js, 206 O obrazy, 50 identyfikowanie, 149 nazwa, 109 publikowanie, 175 tworzenie, 117 umieszczanie w repozytorium, 176 usuwanie znacznika, 176 wyszukiwanie, 99, 108 Oracle VirtualBox, 23 P pamięć, 165 planowanie, 171 pliki AUFS, 50 Dockerfile, 119, 141 polecenia trybu Swarm, 172 polecenie attach, 62, 147 bowee install, 207 build, 50, 56, 118, 193, 211 Poleć książkęKup książkę commit, 57, 59, 61 cp, 56, 62 create, 62, 72 curl, 115, 184, 202 diff, 62 docker-machine create, 78 events, 158 exec, 62, 153 export, 55 grep, 70 help, 49 history, 53, 56 ifconfig, 71 images, 51, 56, 60, 149, 176 import, 55 info, 76 inspect, 56, 62, 83, 91, 150, install, 198 java -jar, 204 join, 173 kill, 62, 83 load, 56 login, 64, 176 logout, 64 logs, 62, 147 ls, 80 mkdir, 211 mve package, 200 mvn deploy, 194 network create, 77 network disconnect, 75 network help, 68 network inspect, 72, 74 network ls, 69, 80 node, 210 npm install, 209 pause, 62 ping, 73 port, 62, 85 ps, 59, 83 pull, 64, 188 push, 64, 177, 182 rename, 62 restart, 62 rm, 59, 94 rmi, 56, 176 run, 57, 62, 73, 146 save, 56 scale, 173 search, 64 Skorowidz sed, 160 service create, 173 setdomainname, 151 sethostname, 151 start, 62 stats, 62, 160 stop, 58, 62, 84 swarm init, 76, 173 tag, 176 tail, 147 top, 62 uname, 151 untag, 176 unpause, 62 update, 62, 164 wait, 62 volume create, 90, 93 volume inspect, 91, 95 volume ls, 90, 95 volume rm, 95 wget, 81, 82 procesory, 167 procesy PID, 150 programowanie, 191 przestrzeń nazw UTS, 151 publikowanie obrazów, 175 R reguła restartu, 161 rejestr, 62 repozytorium, 62 zautomatyzowanego procesu budowania, 178 rozwiązania sieciowe, 68 S serwis Docker Hub, 100 konto organizacji, 103 logowanie, 106 repozytoria prywatne, 105 tworzenie konta, 102 współpracownicy, 104 zautomatyzowany proces budowania, 177 zespoły, 103 sieć domyślna, 69 hosta, 70 nakładkowa, 77 z mostem, 71 221 Poleć książkęKup książkę Docker. Projektowanie i wdrażanie aplikacji ustawienia identyfikatorów procesów PID, 150 przestrzeni nazw UTS, 151 usuwanie wolumenu, 94 znacznika, 176 użycie plików Dockerfile, 141 W warstwy, 52 wdrożenia ciągłe, 184 węzeł, 76, 171 Windows instalacja Dockera, 29 wirtualizacja, 16 wolumeny, 89 sterowniki, 96 tworzenie, 89 usuwanie, 94 wtyczka fabric8.io Maven Docker, 194 Spotify docker-maven-plugin, 193 wyszukiwanie obrazów, 99, 108 interfejs strony internetowej, 110 wiersz poleceń, 112 wyświetlanie dzienników, 155 wyzwalacze budowania, 183 Z zapisywanie zmian w kontenerze, 59 zasada always, 162 no, 162 on-failure, 162 unless-stopped, 163 zasady restartowania, 161 zautomatyzowany proces budowania, 177 zdarzenia kontenera, 157 znaczniki, 109, 176 znajdowanie obrazów, 99, 108 SMB, Server Message Block), 96 statystyki środowiska wykonawczego, 160 sterownik Oracle VM VirtualBox, 23 sterowniki wolumenów, 96 Swarm, 170 menedżer Swarm, 171 planowanie, 171 polecenia, 172 tryb Swarm, 171 usługa, 172 Węzeł, 171 system kontroli wersji, Patrz GIT magazynowania danych, 96 plików, 52, 89 środowisko Docker Engine, 20 Node.js, 206 Ś T tryb odłączony, 147 pierwszoplanowy, 148 Swarm Dockera, 170 tryby środowiska wykonawczego, 147 tworzenie obrazów, 117 sieci, 72 sieci nakładkowej, 77 sieci z wieloma hostami, 75 wolumenu, 89 znaczników, 176 U udostępnianie portów, 82 uruchamianie kontenerów, 145 usługa, 172 222 Poleć książkęKup książkę
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Docker. Projektowanie i wdrażanie aplikacji
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: