w Praktyce
4 godz. 33 min · Docker · Full-stack i Programowanie
Wojciech PołowniakSr. Fullstack EngineerW początkowych sekcjach kursu, zrozumiesz czym jest Docker i jakie ma zalety wobec rozwiązań oferujących pracę z serwerami lokalnymi, np. XAMPP - poznasz jego architekturę, założenia oraz najważniejsze pojęcia, których nieznajomość często spędza sen z powiek nawet doświadczonym programistom.
Jako że Docker jest to narzędzie dla programistów i administratorów systemów operacyjnych, lwia część pracy z tym narzędziem odbywa się w konsoli. Przedstawię Ci najważniejsze polecenia powiązane z tą technologią oraz zestaw dobrych praktyk i protipów które zawstydzą niejednego inżyniera oprogramowania.
W tej sekcji tego kursu przejdziemy przez najważniejsze punkty tworzenia skonteneryzowanych aplikacji z perspektywy programisty aplikacji internetowych - jeśli chcesz szybko rozpocząć swoją przygodę z Dockerem, ponieważ znasz już podstawy teorii i czujesz się wystarczająco pewnie - możesz zacząć z tego miejsca! A jeśli tempo będzie zbyt szybkie - zawsze możesz wrócić do części teoretycznej pracy z Dockerem
Przebudowywanie zasobów na żywo, dynamiczne odczytywanie zawartości plików... To podstawowe koncepty które współcześni programiści sieci web biorą za pewnik. Przy nieznajomości Dockera, łatwo jest strzelić sobie w stopę i utrudnić swoją pracę, zabierając sobie możliwość korzystania z powyższych funkcjonalności. W tym kursie, pokażę Ci jak wygodnie pracować z Dockerem w środowisku developerskim.
Jedną z wielu zalet Dockera jest niewątpliwie proste przenoszenie zmian konfiguracji i infrastruktury ze środowiska developerskiego na produkcyjne. W tym kursie, poza przyswojeniem podstawowej wiedzy na temat Dockera poznasz szereg dobrych praktyk w kontekście bezpieczeństwa oraz przygotowywania Twoich aplikacji pod środowisko, na którym będzie uruchomiona Twoja aplikacja gdy uznasz że jest gotowa by ujrzeć światło dzienne.
Ten kurs to zestaw kompleksowej wiedzy dzięki której dowiesz się jak od zera, na żywo, stworzyć aplikację na Twoim lokalnym środowisku - i jakie kroki należy podjąć, aby móc zobaczyć ją w internecie - wszystko w kontekście Dockera, wysokiej skalowalności i bezpieczeństwa. W jednej z ostatnich lekcji kursu zobaczysz jak robię deploy na serwery DigitalOcean by uzyskać link do swojej nowo zbudowanej aplikacji internetowej.
Ten kurs jest kierowany do webdeveloperów, bądź zaawansowanych programistów którzy nie pracowali jeszcze z Dockerem. Przydatne może być zrozumienie interfejsu linii poleceń czyli tzw. konsoli, oraz podstawowa wiedza na temat web developmentu czy systemów operacyjnych. Jeśli potrafisz korzystać z systemu kontroli wersji git, na pewno ułatwi to Tobie zrozumienie konceptu pracy z poleceniami dockera. Niemniej, każde zagadnienie staram się tłumaczyć na bieżąco.
Cześć! W tej sekcji tego kursu omówimy środowisko
deweloperskie i spróbujemy wziąć pod uwagę wszystkie te
rzeczy, o których mówiliśmy do tej pory i wykorzystamy je w praktyce, tworząc
różne rozwiązania na naszych lokalnych maszynach, tak aby były one wygodne w
pracy, a nie koniecznie musicie pamiętać wszystkie polecenia Dockera.
Więc jednym z takich najpopularniejszych
rozwiązań, jeżeli chodzi o pracę w środowisku lokalnym jest Docker Composer.
I tak samo jak jest to zwykłe plik tekstowy,
który jak widzicie tutaj w sekcji 10 już utworzyłem docker composer.
Jest to plik mowy.
Jest to raczej taki format typowo do konfiguracji i jest on dosyć popularny i
oczywiście nie ma tutaj znaczenia nazwa tego pliku.
To może być dowolna nazwa jaką preferujemy,
tylko musimy po prostu pamiętać, żeby wtedy podawać ją jako flagę.
Do polecenia docker composer, który będzie
właśnie interpretował ten plik, który tutaj stworzymy.
Więc Docker pozwala nam robić te wszystkie rzeczy, które robiliśmy już do tej pory
w tym kursie, ale na podstawie konfiguracji.
Czyli to co trzeba najpierw zrobić to podać wersję poza.
A no i ja z reguły używam 3.6.
Jest to taka
wersja, która posiada powiedzmy podstawowe funkcjonalności, które faktycznie
pozwalają nam pracować ze środowiskiem developerskim w
dosyć wygodny sposób, więc po podaniu wersji możemy zdefiniować nasze serwisy.
No i oczywiście ponownie jeżeli mamy
zainstalowane tutaj rozszerzenie Dockera dla West Clouda, no to mamy ładne
podpowiadanie składni co gdzie trzeba wstawić, więc wam składnia wygląda tak, że
klucze podajemy przed dwukropkiem i po dwukropka jest wartość tego klucza.
No i tutaj wcięcia.
Instalacja też ma znaczenie. Czyli jeżeli np.
zrobimy tutaj dwie spacje wewnątrz
services, no to znaczy, że wewnątrz tego bloku services będziemy
tworzyć kolejne jakby właściwości tego obiektu.
Jeżeli byłby taki sam to był zagnieżdżone obiekt.
No i jeśli na przykład zdefiniujemy sobie,
że nasza aplikacja to jest nazwa naszej aplikacji i powiedzmy app
będzie musiała budować się na podstawie obrazu Engines, to wystarczy, aby zrobić
tak naprawdę analogiczną sytuację z polecenia docker run.
D. Chociaż ta flaga jest tutaj podawana w
momencie kiedy wywołujemy ten plik RG i po prostu engine.
Te dwa pliki to dwa podejścia są ze sobą tożsame.
Możemy to tak naprawdę wywołać,
więc jakbym teraz to uruchomił to oczywiście uruchomi nam się ending w
trybie odłączonym w trybie disabled, ale możemy też zrobić Docker composer.
To jest taka paczka, która przychodzi do nas wraz z instalacją dockera.
Nie musimy jej dodatkowo instalować i składnia jest taka, że mamy Docker
complete app, aby uruchomić aplikację na podstawie pliku docker composer.
Domyślnie oczywiście docker composer
w obecnym katalogu, w którym się znajdujemy oraz down aby wyłączyć
wszystkie serwisy, które są zdefiniowane w tym pliku.
Czyli jeśli zrobimy app de.
Tak jak mówiłem tutaj flaga jest jakby.
Nie da się jej zdefiniować wewnątrz pliku.
No to po uruchomieniu tego ta aplikacja nam się powinna uruchomić,
ale chyba najpierw musimy oczywiście zapisać.
Zobaczymy czy to była kwestia zapisania.
Oczywiście trzeba zapisać plik aby on się zaaplikował.
Tak jak widzimy w docker PS a mamy tutaj kilka plików więcej uruchomionych, więc
zróbmy sobie najpierw docker ps a i tutaj nasz skrypcik, który zabije
nam wszystkie te kontenery, więc wykorzystujemy już
wiedzę z poprzednich lekcji w poradach i trikach bodajże albo w zaawansowanych
komendach o tym mówiliśmy i zróbmy jeszcze raz AB i zróbmy to.
PS. Widzimy, że nasz
kontener wstał i nie musieliśmy w ogóle pamiętać składni do kernela.
Czyli to jest w ogóle też bardzo przydatne.
Jeżeli pracujecie z innymi deweloperami nad danym projektem.
Oni dokładanie znają, nie wiedzą jak z nim operować, to wtedy
możecie całą konfigurację zawrzeć tutaj, w XAML i tylko na przykład takiego
update możecie nawet zawrzeć wewnątrz pakiet Johnsona przy npm w to się może
wykonywać, jeżeli mielibyście taką potrzebę.
Tylko wtedy oczywiście trzeba pamiętać, żeby tego npm nie wywoływać z kontekstu
Dockera, bo tego polecenia oczywiście wewnątrz kontenerów nie ma.
Tak jak mówiłem o tym w różnicach między kontenerem a hostem.
No więc przejdźmy dalej.
Oczywiście aby nasze aplikacje aby Linux był używane
no to musimy wystawić mu porty, musimy podpiąć mu odpowiednie wolumeny.
No i zanim to tutaj zrobię to pokażę
tylko, że możemy wyłączyć serwisy przy pomocy docker composite.
No i teraz przy docker ps już tego kontenera tutaj nie ma,
więc gdy robiliśmy docker run polecenie, które startowało nam serwer.
Ja tutaj sobie strzałką w górę ponownie.
Dobra praktyka, aby sobie po prostu z tego korzystać.
Wystawiliśmy porty. Powiedzmy, że zaczniemy od portów.
To w Docker kompletnie nic prostszego, po prostu piszemy port.
Tutaj musimy pamiętać tylko wcięcia, wcięcia i białe znaki są bardzo istotne
i to jest chyba największy problem, który możecie napotkać.
Jeżeli nie pracowaliście.
Po prostu musicie się nauczyć formatu jak pisać pliki handlowe,
Ale nie jest to problem samego Dockera, tylko po prostu formatu.
Więc jeśli chcielibyśmy wystawić tą aplikację na porcie 86 to analogicznie 80
86, Dwukropek 80 ponieważ to jest port na kontenerze, a to jest port na hoście
i zapiszemy jeżeli byśmy to wywołali przez docker composer.
Oczywiście jest też składnia, spacja, combosy.
Obie opcje są poprawne.
Ja korzystam z dockera i kombosów.
To widzimy, że nasza aplikacja wystartuje.
Ona się uruchomi na porcie 80 86.
I teraz jeżeli wejdziemy w nią na 80 86 to aplikacja chodzi poprawnie.
Co istotne,
jest to o tyle wygodne, że możemy tak naprawdę zmienić ten port tutaj i przy
ponownym wywołaniu do App the one się automatycznie zlikwidują.
Stworzą się na nowo na takiej zasadzie, że po prostu te porty zostaną zaktualizowane.
Więc Docker na podstawie zmian, które generuje z tego pliku konfiguracyjnego
zaktualizuje naszą infrastrukturę o te zmiany, które wprowadziliśmy bez
konieczności ponownie startowania danej aplikacji.
Oczywiście zmieniliśmy port na 80 80 więc na 80 86 już nie chodzi.
Chodzi na 80 tce.
Bardzo wygodne.
Jak widzisz jest to o wiele mniej logiki niż trzeba było robić przy
wszystkich tych poleceniach z linii poleceń, ale tak naprawdę
logika działania Dockera jest identyczna, dlatego warto jest po prostu znać te
polecenia, podmienić sobie ten nasz plik, który będziemy ładowali.
Ja tutaj dodam do naszej lekcji 10 plik index.
HTML z naszą templatki.
Na podstawie tej linda jeżeli tutaj wpiszemy sobie tak samo.
Oczywiście tutaj też jest taka zaleta Docker poza nad lasem,
że mamy pełne nazwy property, które ustawiamy pełne nazwy właściwości,
a nie flagi, myślnik V, które musimy wiedzieć co oznaczają.
Więc jest to też o wiele bardziej czytelne po prostu.
No i moglibyśmy po prostu tutaj podać ścieżkę do tego pliku index.
HTML.
Ale docker composer ma kolejny kolejną zaletę wobec po prostu seria,
że nie musimy podawać ścieżki absolutnej, możemy zrobić po prostu kropkę, czyli
pozycję relatywną względem obecnego katalogu index.
HTML.
No i na hoście oczywiście przekazać tą samą ścieżkę, która jest potrzebna dla
engine CSA i jest to bodajże jeżeli dobrze pamiętam usr share.
Engineers.
I tutaj będzie html index.
HTML.
Zapiszemy oprócz AP.
Aby zrestartować możemy też restart, wtedy aplikacja też zostanie zrestartować.
I po odświeżeniu strony.
A ona się nam powinna już tutaj załadować.
USR share engines.
HTML index. HTML.
Zobaczmy.
To skopiowane jeszcze z poprzednich przykładów.
Zobaczmy, czy nie zrobiłem literówki.
Chyba nie.
A restart.
Oczywiście restart zrestartuje nam kontener ale z tą samą konfiguracją.
Więc tutaj mój błąd.
AB zrobi nam lata poprawnego.
Restart pozwala zrobić tak naprawdę na kontenerze stop i
start ponownie, więc konfiguracja tego kontenera będzie identyczna.
I jak widzicie nasza aplikacja korzysta już z tego nowo zmienionego pliku, więc
tak naprawdę praca z Docker kompozycja jest naprawdę wygodna
i przenosi całą tę logikę, którą do tej pory musieliśmy umieszczać wewnątrz samych
poleceń docelowych celu w interfejsie linii poleceń do pliku docker composer.
I tak naprawdę jesteśmy w stanie przenieść całą tą naszą informację o infrastrukturze
gdzieś indziej, tak aby deweloperzy, którzy nie są doświadczeni
nie musieli się martwić takimi rzeczami jak właśnie konfiguracja.
No i oczywiście tych serwisów możemy mieć tutaj kilka.
Jeżeli chcielibyśmy mieć drugiego engine CSA albo Apache na to
możemy go sobie nazwać w dowolny sposób i też to nam zadziała.
W kolejnej lekcji wykorzystamy poza, który już został stworzony przez
kogoś w internecie do podmiany naszego lokalnego XAMPP a.
Jeżeli dalej macie go zainstalowanego na alternatywę Dockera i omówimy to na
przykładzie tego co już ktoś w internecie stworzył.
docker-compose.yaml · 9 min
version: "3.6"
services:
app:
image: nginx
ports:
- 8080:80
volumes:
- ./index.html:/usr/share/nginx/html/index.html