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 lekcji omówimy montowanie wolumenów
wolumenów, czyli takich dysków twardych dla Dockera, które pozwalają nam
zamieszczać pliki wewnątrz naszych kontenerów i pliki umieszczać w
kontenerach możemy na kilka różnych sposobów.
Jednym z nich jest tak jak.
Wspomniałem w poprzedniej akcji komenda AT.
Która doda nam pliki do samego obrazu.
Oczywiście to będziemy robili jeszcze w kolejnych lekcjach.
Natomiast wolumeny czy wolumen
mają taką przewagę nad dodawaniem plików do obrazów, że w momencie kiedy my
uruchamiamy docker build w obecnym katalogu czy.
W dowolnym miejscu gdzie on się znajduje.
To pliki, które zostaną dodane poprzez
docker Phila one już nigdy nie zostaną zaktualizowane, jeżeli my zmienimy.
Je na naszym na naszym hoście. Czyli powiedzmy, że.
Mielibyśmy tutaj. Plik.
Index jest.
Chcielibyśmy go sobie dodać do obrazu przy pomocy polecenia add.
Możemy to zrobić w taki sposób, że po prostu podajemy sobie indeks.
Czy jest tutaj ścieżkę, gdzie to ma się pojawić?
To wtedy w momencie umieszczenia tego pliku.
Wewnątrz kontenera to się oczywiście nam
tutaj zrobi i utworzy się do tego nowa warstwa.
To zobaczymy, że docker image.
Teraz to jest nasz.
Obraz.
Oczywiście musimy zapisać i możemy zrobić to na wpiszemy tego hasła.
I tutaj widzimy, że była druga warstwa z 2 na 2, czyli każda.
Każde kolejne polecenie to jest osobna warstwa.
Jeśli zrobimy tutaj docker image +.
No to widzimy, że tutaj ten obraz nam się napisał.
I jeśli wejdziemy na ten obraz naszym.
Docker run.
Nasz obraz, to zobaczymy, że ten plik tutaj się znajduje.
Tylko, że jeżeli ja w tym momencie.
Zmienię treść tego pliku na powiedzmy trzy wykrzykniki.
I spróbuję odczytać ten plik ponownie, no
to widzimy, że tylko stan tego pliku z momentu budowania.
Nam się tutaj zaaplikował.
Czyli ja wychodząc.
Z tego obrazu musiałbym go ponownie przebudować.
To oczywiście może trwać krócej albo dłużej.
Tutaj możemy tego obrazu zmienić na docker node row.
I teraz jak.
Wpiszemy sobie indeks to jest to faktycznie są trzy wykrzykniki.
Ale znów jeżeli będzie zmiana w pliku,
który jest na to, musimy przebudować to ponownie.
Więc lepszym rozwiązaniem.
Zwłaszcza na środowiskach developerskich. Są właśnie.
Wolumeny. Tutaj tego nie będziemy nawet zapisywać,
bo nie ma żadnych potrzeb, żeby robić jakiekolwiek zmiany w kodzie.
Mamy tutaj nasz plik index.
Jest on jest dalej tym samym plikiem index, który był w lekcji pierwszej.
I aby użyć wolumenów musimy dodać odpowiednią flagę do.
Polecenia docker. Run.
Czyli jeśli sobie wpiszemy polecenie docker run to tutaj mamy.
Oczywiście informację o tym jak korzystać z tego polecenia.
I jeśli sobie wpiszemy.
Docker run w trybie dataset na naszym obrazie.
Pozbędziemy się tutaj tej logiki, która trzyma nam.
Na żywo nasz obraz.
I wpiszemy sobie plik index.
To jest tak aby uruchomić ten plik to zobaczymy, że to oczywiście nam się.
Tutaj wyłączyło czy on się wyłączył?
Jeszcze raz usuńmy go.
Jest dużo tych obrazów naraz.
Omówimy sobie jak w najprostszy sposób usuwać już obecne obrazy.
Ale jeszcze raz docker rm nazwa obrazu
image rem i tutaj zrobimy forth, aby wszystkie obrazy, które były wykorzystane,
aby wszystkie kontenery, które były wykorzystane przez ten obraz.
Wygenerowane przez użycie tego obrazu
zostały usunięte i spróbujemy go sobie jeszcze raz przebudować.
Żeby się upewnić, że tego pliku już tam nie ma.
Wcześniej albo dodane przez polecenie add i uruchomimy tego.
Nowo zbudowanego.
Image tutaj sobie wpiszemy.
Powiedzmy, że chcielibyśmy uruchomić plik
jest na to nam wyjdzie z błędem, powie, że po prostu tego pliku
index część nie ma, więc możemy dodać ten plik.
Poprzez wolumeny
i aby to zrobić musimy dodać tutaj na początku jeszcze przed samą.
Nazwą obrazu flagę V jak w ogóle.
I wygląda to na takiej zasadzie, że
musimy podać ścieżkę na naszym hoście do naszego pliku czyli np.
index s i po dwukropka ścieżkę.
W jakim ten wolumen ma zostać zaaplikowany.
Czyli powiedzmy. Również index.
Jest to powinno zadziałać, ale nie zadziała z jednego powodu,
ponieważ tutaj mamy informację invalid index co jest moim must be?
Absolutnie. Czyli generalnie ścieżki z których.
Montujemy nasze pliki i które mają się
znaleźć w obrazie docelowym powinny być absolutne.
Czyli tutaj sobie dodajemy ścieżkę docelową jako root index yes.
I widzimy, że to nam.
Jeszcze tu nie wyskoczyło, więc po prostu
zobaczymy nasz PWD, czyli Print Working Directory.
To jest moja nazwa katalogu, w którym obecnie się znajduje.
Jak to tutaj wkleja.
Indeks jest.
To zobaczymy, że ten plik się.
Uruchomił i faktycznie mamy na
standardowym wyjściu tą logikę która się wydarzyła.
Czyli jesteśmy w stanie podpiąć dowolny
plik czy katalog do danego obrazu pokerowego.
Ja go tutaj zamknę kontrolce
albo control jeżeli się tego nie da zamknąć, bo oczywiście nie ma tutaj
handlowania sygnałów wyjściowych, o którym też już
wspomniałem wcześniej, albo możemy po prostu nawet zabić cały terminal.
To nie ma takiego znaczenia.
Stworzymy sobie nowy terminal.
I zobaczymy czy ten.
Proces dalej chodzi, dalej chodzi i możemy sobie nawet robić inspekcje.
Żeby zobaczyć jakie polecenie tutaj zostało wywołane.
I widzimy, że. Polecenie jest to indeks czy jest.
Czyli nasza aplikacja.
Się uruchomiła, dalej chodzi.
Możemy ją tutaj zabić bądź zastopować.
Jeżeli ją zastosujemy.
To zobaczymy, że dalej ma te 10 sekund oczekiwania, ponieważ nie są
obsłużone sygnały wyjściowe, które też będziemy robili w kolejnych lekcjach.
Więc zaletą tego jest to, że. Jeśli.
Zmienimy coś. Teraz w tym naszym pliku, to jest.
Zapiszemy to.
I uruchomimy na nowo ten. Proces.
Oczywiście musimy stworzyć nowy kontener za każdym razem, ponieważ
w momencie uruchomienia tego pliku index nie ma tutaj listy kodu, który też
będziemy robili w kolejnych sekcjach tego kursu.
To zobaczymy, że nie ma konieczności uruchamiania docker build,
ponieważ tylko uruchamiamy nowy kontener z tego samego obrazu.
Czyli w naszym obrazie początkowo nie ma tego pliku, ale w momencie uruchamiania
kontenera na ścieżce index jest jest dodawany.
Mój lokalny plik z mojego hosta.
I po lewej stronie mamy wartość hosta.
Po prawej stronie pod dwukropkiem mamy wartość wewnątrz kontenera.
I jeszcze raz jak to uruchomimy to będzie.
Czyli.
Widzimy, że mamy kilka możliwości
zamieszczania danych wewnątrz naszych obrazów.
Wolumeny są świetne dla środowisk developerskich albo dla środowisk.
Gdzie po prostu dane muszą się zmieniać dynamicznie.
Powiedzmy.
Natomiast dodawanie danych bezpośrednio do docker file jest.
Dobre np.
w systemach, które już mają być uruchamiane w środowiskach produkcyjnych.
Ale warto też pamiętać, że każdy plik, który dodamy tutaj
wewnątrz docker file on zwiększy rozmiar naszego wygenerowanego obrazu.
Czyli jeżeli byśmy dodali katalog z
tysiącem obrazków tutaj na tym etapie, to każdy nasz.
Obraz wygenerowany będzie cięższy o te 1000 obrazków.
Gdzie jeżeli byśmy nie dodali go na poziomie docker file.
Tylko dodali go na poziomie.
Wolumenów to nasz docker file i nasz obraz jest o wiele lżejszy, a pliki są.
Dodawane tak jakby w momencie tworzenia nowego kontenera.
W następnej lekcji uruchomimy prosty serwer.
HTTP w kodzie.
I wystawimy porty do naszego hosta tak abyśmy my z przeglądarki mogli.
Dostać się do logiki wewnątrz Dockera.