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 kursu omówimy.
Sobie docker Phila. Troszkę.
Dogłębniej.
I oczywiście część poleceń.
Już troszkę wspominałem o nich w poprzednich lekcjach, na przykład.
O poleceniu add czy o poleceniu.
Expose.
Mamy tutaj oczywiście do dyspozycji całkiem.
Sporo słów kluczowych.
Poleceniem add jesteśmy w stanie dodawać pliki do naszego obrazu.
No i oczywiście waga tych.
Plików zostaje dodana wtedy do wagi naszego obrazu.
Czyli jeśli chcielibyśmy dodać np.
plik index.
HTML do katalogu index.
HTML.
Możemy zrobić to w ten.
Sposób i tak samo analogicznie plik serwer.
Jest do pliku.
Server gs.
I oczywiście to jest ważne od tego gdzie jest kontekst budowania naszego pliku.
Czyli jeśli np. bylibyśmy w innym.
Katalogu niż znajdują się tutaj pliki źródłowe, no to oczywiście
musielibyśmy podać zamiast kropki przy docker build jakąś inną.
Wartość, tudzież po prostu.
Zmienić ścieżkę w tym miejscu.
Poprzednio też wystawiliśmy.
Port przy pomocy ECS.
Poza.
Tak, aby w razie potrzeby aplikacja była w stanie być dostępna.
Z poziomu hosta.
No i tak naprawdę jeżeli to zapiszemy zrobimy.
Build z tagiem od.
To nam powinno zadziałać.
Więc widzimy, że tutaj tych kroczków jest coraz więcej.
Mamy trzy osobne. Warstwy.
Część jest skasowana. Część jest nowa.
Expose nie tworzy nowej warstwy.
Jako ciekawostkę.
No i zobaczmy czy będziemy w stanie
uruchomić ten kontener docker run zamiast dash p.
Aby wystawić port na danym miejscu po prostu robimy duże P.
I tutaj w trybie podłączonym.
Docker node.
Proszę.
I to nam powinno zadziałać, jeżeli podamy tutaj.
Plik index czy jest serwer czy jest.
Spróbujmy to sobie odświeżyć.
No i oczywiście nie działa to już na
porcie 80 tylko na losowo przypisanym przez expose.
Jest to 5.5 01.
Czyli jeżeli teraz wejdziemy na 5.5 01.
Nasza aplikacja dalej działa, ale tak jak
wspominałem, jeżeli teraz zmienimy coś w naszych plikach źródłowych.
Czyli. Np.
docker, zrobimy smutną buźkę okaże.
No to ta smutna buźka nie pojawia się,
ponieważ te pliki są zapisane w samym obrazie i nie są podpięte poprzez wolumen.
O tym warto pamiętać.
Co istotne, to mamy dodatkowo takie polecenia jak na przykład stop signal.
Raczej nie poleca się z tego korzystać,
ale czasami, jeżeli nie chcemy pisać całej logiki obsługiwania sygnałów.
Wyjścia w naszych kontenerach, to to jest faktycznie przydatne.
Bo jeżeli teraz zrobimy sobie stop na.
Naszym kontenerze, no to tak jak wspominałem 10 sekund mamy oczekiwania.
Można to obejść na poziomie docker file,
czyli możemy tutaj zdefiniować stop signal.
I ustawić to na dziewiątkę.
I w momencie, kiedy to zapiszemy.
Budujemy nasz obraz.
Jak widzimy, tutaj się skierowały te obrazy.
Czyli nie budowało się wszystko od zera i zrobimy jeszcze raz.
Wystawienie przy pomocy p.
Podejrzewam, że znowu mamy wartość portu o 1 wyższą.
To widzimy, że.
Aplikacja dalej chodzi.
I jeśli będziemy chcieli ją.
Zatrzymać w tym momencie.
Przypominam, że poprzednio jak uruchomiliśmy docker stop na tym obrazie
na kontenerach, które zostały stworzone z tego obrazu, to czekaliśmy te 10.
Sekund i w tym momencie.
Tego okresu oczekiwania 10 sekund. Nie ma więc.
Stop signal. Naprawdę przydatne.
Polecam Pozostałe i są. Jednym z.
Głównych.
Poleceń, które potrzeba w docker filmu znać.
To np. Run.
Run pozwala nam wywołać komendę.
Wewnątrz danego kontenera, czyli tak jak tutaj wystartujemy jeszcze raz ten proces.
Chcielibyśmy na przykład.
Wejść na ten kontener docker exec interaktywnie wywołujemy basha.
No to jeśli na przykład musimy sobie.
Stworzyć nowy katalog.
Sachs i do niego przejść i stworzyć nowy plik.
I wypisać coś.
To nie musimy tego robić, bo tak jak wspominałem wszystkie zmiany,
które robimy tutaj w runtime w momencie kiedy kontener już jest
uruchomiony, one są efemeryczne, to znaczy są ulotne.
W momencie kiedy zamkniemy ten kontener,
stworzymy kontener od nowa z tego samego obrazu.
Tych naszych zmian tutaj nie będzie, dlatego robi się je wewnątrz docker file.
Czyli np. jeżeli sobie.
Uruchomię tutaj polecenie dir powiedzmy.
Fc.
I tutaj zrobimy osobna dir albo cd serce i powiedzmy.
Taki test.
Albo zapiszemy coś do tego pliku. Heloł!
Zapisane do.
Test.
I tutaj zrobimy ostatni raz jako kat.
Serce.
Test zapiszemy.
Wyjdziemy z tego kontenera.
Zastępujemy go sobie.
On się przypominam.
Zamknij już szybko, ponieważ mamy stop signal.
Uruchomimy go ponownie.
Najpierw chcemy go oczywiście zbudować.
Budujemy.
To zobaczycie, że tutaj dla tych warstw jest już.
O wiele więcej. Mamy aż.
6 warstw i każda z.
Tych warstw została wywołana osobno.
Czy było to konieczne?
Niekoniecznie, ponieważ każda z tych warstw jest skasowana, a to też ma.
Wpływ na formę tego, jak.
Wychodzi.
Więc jeżeli macie tego typu polecenia,
to wcale nie musicie ich wpisywać w osobnych ramach.
Możecie po prostu zrobić coś takiego, że
najpierw stwórz serce, potem zrób bez slasha, czyli znak.
Który pozwala nam inaczej interpretować następny znak, który zanim.
I możemy pozbyć się tego.
Serce tak aby pisać w kolejnych liniach.
Tak sobie to. Zapiszemy.
I efekt końcowy będzie dokładnie taki sam
jeżeli teraz byśmy uruchomili ten kontener.
I na niego weszli.
Mogłem wejść w tryb interaktywny i w sumie może tak zróbmy.
Docker ps.
Docker stop.
I możemy.
Wejść sobie tutaj zamiast w trybie D możemy wejść w tryb.
Interaktywny i jest też flaga
ARM, czyli w momencie kiedy my wyjdziemy z tego procesu.
Który jest tutaj uruchomiony, to kontener automatycznie się zamknie.
Zostanie usunięty, nie będzie trzeba go
usuwać, więc też taka przydatna flaga i zobaczymy czy nasz port dalej chodzi.
Tutaj to byłoby pewnie w tym momencie 5.5 0.5.
Dalej chodzi.
Jeżeli stworzymy nowy plik.
Wchodząc w terminal docker.
PS.
Wchodząc w kontener docker exec i.
Bash to możemy sobie sprawdzić, że.
Faktycznie mamy tutaj katalog.
Source.
Sensors. Mamy tutaj.
Test.
W którym jest Chloe.
I oczywiście co się zrobiło przy pomocy.
Osobnych warstw, jeśli dobrze pamiętam.
Jeśli teraz robię kontrolce, to on powinien się zamknąć.
Ale chyba niestety stop.
Sygnał musiałby być trochę inny, więc po prostu zamkniemy go na.
Ręcznie poprzez stopa.
Zamknął i teraz budując ponownie ten obraz.
Zobaczymy, że.
Jeśli będziemy w dobrym katalogu.
To zamiast.
6 warstwa 4.
Tylko tutaj się jakiś błąd pojawił.
Serce test file directory
and bo musielibyśmy mieć tutaj ścieżkę absolutną.
Więc jak sobie zapiszemy budujemy jeszcze raz.
Nie ma sprawy. Czasami się tak zdarza, że.
Mamy błąd na naszym while i on wtedy po
prostu przerywa, ale nic złego się nie dzieje.
No i uruchamiając proces.
Ponownie oczywiście ten efekt końcowy
będzie taki sam, że mamy ten plik zamieszczony w tamtym miejscu.
Możemy dodawać tutaj belki.
Czyli coś takiego, co jest widoczne np.
podczas naszych. Obrazów.
I tutaj możemy podać różne wartości.
Nie będę tutaj zbyt głęboko wchodził w polecenia.
Label, będziemy o nim mówili przy okazji obrazów.
Produkcyjnych. No i tak.
Samo jesteśmy w stanie zadeklarować tutaj zmienne środowiskowe, które.
Możemy przekazywać.
Podczas tworzenia kontenera.
Czyli tak samo jak robimy Docker run, wolumen i porty, na których chcemy
uruchamiać naszą aplikację, to tak samo możemy przekazać zmienne środowiskowe.
Jeżeli je tutaj podamy to wtedy one będą dostępne wewnątrz
naszego docker fila i wewnątrz samego kontenera.
Czyli jesteśmy w stanie z parametry zobaczyć to jak nasz obraz się buduje.
I ostatnio ostatnim poleceniem,
które bym tutaj dodał oczywiście są jeszcze inne jest entry point, jest cmd.
Endpoint pozwala nam wskazać np.
skrypt, który chcemy uruchomić, a cmd pozwala nam wywołać polecenie, które
ma się uruchamiać jako domyślne gdy ten obraz startuje.
Bo to, że tutaj mamy noda to nie znaczy, że koniecznie chcemy wywołać zawsze noda.
Możemy np. sobie wykorzystać NPM a z odpowiednim
prefiksem, czy uruchomić jakiś skrypt dachowy zamiast zamiast noda bezpośrednio.
Więc oprócz tego mamy tutaj cmd.
Entry point.
Label i to są chyba najważniejsze.
Oczywiście oprócz ADA mamy.
Też kopi kopi od ADA różni się tym.
Że AT jest w stanie też dodać zasoby. Z internetu.
Tzn możemy. Podać tutaj np.
.
Domenę zamiast plik lokalny, ale kopi się częściej używa np.
. Przy multiplayerze gildiach których też
będziemy mówili w dalszych częściach tego kursu.
Więc tak wygląda praca z docker.
Files.
Troszkę bardziej niż z samym uruchomieniem.
Jak widzicie polecenia, które tworzą nam kontenery są o wiele czystsze i nie.
Musimy za każdym razem przekazywać wolumenów.
Tutaj jesteśmy w stanie też wewnątrz
docker file dawać wolumeny, natomiast z reguły robi się to przy pomocy
docker composer czy innych plików, które pozwalają nam w wygodny sposób tworzyć.
Więc to tyle w tej lekcji.
W kolejnej lekcji zajmiemy się
omówieniem różnicy między poszczególnymi wersjami obrazów i których wersji obrazu.
Najlepiej używać w danych środowiskach programistycznych.
Dockerfile · 10 min
FROM node
RUN mkdir src && \
cd src && echo "hello" > test && \
cat /src/test;
ADD index.html /index.html
ADD server.js /server.js
EXPOSE 8080
STOPSIGNAL 9