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 podsumujemy całą wiedzę, którą do tej pory zdobyliśmy i stworzymy.
Serwer jest z dynamicznym przygotowywaniem zasobów.
Tak aby było to po prostu developer friendly, czyli wygodne dla developerów.
Oczywiście nie będziemy tutaj instalować
żadnego skryptu packa, bo to jest po prostu duży.
Duży narzut pracy, którą musielibyśmy wykonać w tym krótkim wideo.
Dlatego zaczniemy po prostu od stworzenia.
Nowego projektu NPM.
Tak jak w poprzedniej lekcji, Dynamic jest, tak sobie nazywa naszą aplikację.
I ponownie MPM wygeneruje nam pakiet
Jacksona i do niego możemy zainstalować już pojedyncze zależności.
To co będziemy oczywiście też musieli.
Zrobić, to stworzyć nasz plik docker composer game.
I może na nim się skupmy, bo to jest
najważniejsza część infrastruktury naszej aplikacji.
Version albo 3.6 albo 3.7.
Tak naprawdę chyba 3.7 używam częściej niż 3.6.
No i oczywiście musimy zadeklarować
serwisy o których nam chodzi, więc nasza aplikacja będzie bazowała na obrazie Node.
Powiedzmy 17.
Po prostu bez Alpina, ponieważ jako że to jest środowisko deweloperskie
nie chcemy wycinać tak wszystkiego w tym obrazie, żeby po prostu w razie czego
móc na niego wejść i zrobić na nim podstawowe operacje.
Więc to co musimy zrobić to podpiąć nasz kod źródłowy.
Pod nasz kontener. I możemy to.
Zrobić oczywiście albo obrazem, albo wolumenem, Ale jako że to jest środowisko.
Deweloperskie, zależy nam na dynamicznym przebudowanie zasobów.
Użyjemy tutaj wolumenów.
Więc aby te wolumeny dodać wygodnie.
Bo oczywiście musimy zrobić. Wolumen.
I podać ścieżkę.
Na naszym hoście i ścieżkę na naszej aplikacji.
Aby to było wygodne, po prostu stworzymy sobie tutaj katalog.
Soros i wewnątrz tego katalogu.
Soros będziemy dodawać wszystkie nasze pliki.
Więc tutaj dodam sobie plik index jest. No i tutaj.
Ten nasz sos w kompozycje zostanie dodane
super, więc mamy już podpięty nasz kod źródłowy.
Oczywiście tego kodu źródłowego jeszcze
nie ma za dużo, ale już on się znajdzie na naszym obrazie, który nazwie się APP.
Powinniśmy jeszcze oczywiście wystawić.
Porty i powiedzmy, że.
Na porcie 80 80 będziemy chcieli nasłuchiwać.
No i musimy zmienić domyślną komendę, która jest na notesie,
ponieważ tam z tego co pamiętam i nie wiem czy pamiętacie, jeżeli wejdziemy tutaj na
noda i obejrzymy sobie kod źródłowy tego obrazu, to
okaże się, że po prostu command, które jest wywoływane to po prostu NOD.
Więc to co my tutaj zrobimy to zmienimy ten command.
I możemy go zmienić. Np.
na jakiegoś MPM run D na przykład.
To oczywiście na razie nie zadziała, bo musimy dodać to do naszego Jacksona.
Czy tutaj mamy skrypty?
To oczywiście jest wiedza.
Jeżeli nie znasz tak dobrze Jamesa, to
przekierowuje Cię do odpowiedniego kursu na naszej platformie.
Więc tutaj dodamy sobie skrypt.
Def i on będzie nam.
Odpalał demona.
Czyli taki program.
Który jest napisany de facto w skrypcie.
Który pozwala restartować serwer w momencie.
Kiedy są jakieś zmiany.
Damy sobie na odmianę.
No i odpalimy sobie po prostu aplikację.
AP.
Soros.
Tak naprawdę nie musimy tutaj dawać tego prefiksu.
Po prostu Soros Index to jest pakiet Jackson.
Znajduje się tu ścieżka relatywna z tego miejsca.
Tutaj to jest po prostu indeks G.
Więc jeśli się tego tutaj pozbędziemy, dopiszemy sobie tutaj przecinek.
To nam powinno zadziałać. Tylko musimy.
Oczywiście. Zainstalować te zależności.
I w sumie zainstalowanie tych zależności moglibyśmy zrobić już wewnątrz tego.
Kontenera, aby upewnić się, że będziemy korzystali z tej samej wersji noda.
Więc tutaj możemy zmienić sobie na razie to na.
Tego słynnego.
Basha, które wywołuje po prostu nieskończoną pętlę.
I teraz gdy zrobiłem docker composer a.
W trybie D, czyli odłączonym.
Oczywiście co zacznie się pobierać to
chwilkę zajmie i będziemy mogli wejść od razu sobie na ten kontener.
Przy pomocy. Docker Composer.
Nie musimy znać ID obrazu.
Który został.
Pobrany zbudowany i wchodzimy na basha. No i widzimy, że.
Został dodany katalog AP.
I w tym Apple.
Jest indeks James.
Czy o to chodziło?
Nam chodziło o to, aby całą aplikację dodać.
Może zamiast.
Zamiast samego. AP.
A to dlatego, bo chcemy właśnie.
Zainstalować sobie ten pakiet i mieć dostęp do tego pakietu.
Więc robimy docker composer start.
Może AP, bo oczywiście musimy zaaplikować te zmiany z wolumenów.
Jak widzicie tutaj te 10 sekund musi
upłynąć, bo nie mamy poprawnie obsłużonych sygnałów.
To będziemy robili w lekcji o obsługiwaniu obrazów i konfiguracji produkcyjnych.
Więc on się zrestartował.
Wchodzimy spowrotem do Basha, wchodzimy do AB i tutaj mamy już całą naszą aplikację.
I oczywiście teraz widzimy, że korzystamy z wersji Noda 17 Kropka 6.
Gdzie gdy zrobiłem.
To na moim systemie operacyjnym to było 12.
Więc tutaj już też dobra praktyka, że
instalujemy to sobie na poziomie kontenera npm install save.
No i co my tutaj pobierzemy?
Tak naprawdę chcieliśmy pobrać demona.
Bo to jest ten program do startowania naszej aplikacji.
I co istotne oczywiście przez to, że mam tutaj podpięty ten volume.
To te pliki się nam pojawią tutaj w naszym katalogu, w którym mamy naszą lekcje.
Mam nadzieję, że ten npm install przejdzie nam dosyć szybko.
Więc ja w tym czasie.
Przejdę sobie z powrotem do Jacksona i upewnię się, że to nam zadziała.
Czyli na odmianę Soros
jest zostanie wywołany w momencie, gdy uruchomimy skrypt npm rundę.
Więc w tym miejscu powinniśmy.
Uruchomić npm F&F.
Ale przypominam, że jeżeli nie deklarujemy.
Working dir w naszym obrazie docelowym bądź tutaj, możliwe, że.
Da się to. Zrobić z poziomu.
Samego Yama.
Zobaczymy czy to przejdzie.
Working.
DIR.
Tak, możemy to zrobić na tej zasadzie, że
tutaj po prostu pogadamy sobie i wtedy to zadziała.
Ale.
Możemy też po prostu wykorzystać funkcjonalność npm ową, czyli npm
run dev i możemy dodać prefix, czyli z jakiego katalogu ma się to wywołać?
A. Zapiszemy.
Pozbędziemy się tutaj tej logiki.
No i oczywiście nasza aplikacja musi
chodzić, żeby w momencie gdy ten skrypt się nie wywoła, to żeby ona po
prostu się nam w tym momencie nie włączyła.
Więc możemy zrobić na razie prosty set
interval, który będzie coś wypisywał do konsoli.
Powiedzmy co sekundę.
To po prostu zapobiegnie wyłączeniu się naszego serwera.
I w tym momencie to nam powinno zadziałać.
Docker composer apt.
Czyli przebudowuje ponownie nasz serwer.
Ponieważ zmieniliśmy konfigurację w wielu miejscach, tutaj klimat się
zmienił, zmieniły się same pliki, chociaż one się oczywiście
automatycznie zmienią poprzez nasz wolumen.
No i teraz gdy sobie zrobimy docker.
Composer logs.
To widzimy to heloł, które będzie tutaj
dopisywane co sekundę, więc ta aplikacja nam już chodzi.
Nasz kontener poprawnie funkcjonuje. Więc to co.
Moglibyśmy zrobić to tak naprawdę możemy zostawić tutaj tego followme.
I zobaczcie, że jeżeli ja tutaj.
Zmienię wartość z Hello na Hello World.
To tutaj mamy Starting to changes i zmieniła.
Się nam treść tego, więc Life Flow działa dzięki demonowi
i nasz serwer będzie aktualizowany o wszystkie zmiany, które zapisujemy.
Więc tutaj ja po prostu sobie przejdę do naszego katalogu.
13 docker composer exec.
A bash.
I w tym momencie zainstalujemy.
Kolejne zależności npm install.
Save Express.
Robimy po prostu prosty serwer FTP i tutaj możemy oczywiście wrócić do naszego loga.
Zobaczymy, że jeśli byśmy komentowali i
zmienimy tutaj logikę, czyli ponownie na szybko napiszemy Express Serwer.
Ekspres, więc tworzymy sobie zmienną, która po.
Prostu wywoła tego Express.
Nasłuchuje na porcie 8080.
No i zrobimy AP Port, żeby nie zapomnieć.
No i chcemy serwować nasze.
Statyczne pliki, których oczywiście tutaj nie mamy.
Ten folder static.
Możemy wrzucić gdziekolwiek naszym kodzie źródłowym.
Nie musi to być wewnątrz Source, ale może być.
Więc tutaj dodamy sobie AP Jobs i tutaj Express kropka static.
Oczywiście to zależy od. Wersji Express, z której korzystamy, ale
dla naszego przypadku to będzie właśnie taka składnia.
No i powiedzmy, że apt get hello to będzie jakiś nasz endpoint
sekretny, z którego będziemy pobierali jakieś informacje.
Request. Response.
Crescent.
Hello world!
From my epi.
Zapiszemy tutaj.
Po zapisie.
Nasza aplikacja od razu się restartuje. I oczywiście.
Będziemy musieli ponownie skopiować sobie
nasz plik ze statycznym HTML em, który byśmy chcieli tutaj sobie wykorzystać.
Więc jako to wklejam.
No i nasz serwer się przebudował.
Nie ma żadnej informacji w konsoli,
ponieważ nic po prostu do niego nie pisaliśmy.
Ale na porcie 8080 nasz serwer chodzi i mamy faktycznie prosty serwer http z live.
Bo jeżeli wpiszemy Hello tam mamy heloł!
No i jeśli zrobimy sobie tutaj zapiszemy to się automatycznie
zrestartował i teraz po odświeżeniu będziemy mieli tutaj tą informację.
Nie jest to oczywiście hold reload.
Czyli nie ma tutaj jakiegoś browser synka
z naszą przeglądarką, która automatycznie się odświeży.
Dalej musimy kliknąć controller nr czy F12
czy F5 chyba jest na Windowsie aby zresetować kartę przeglądarki.
Oczywiście tego tutaj nie mamy, ale mamy
prostą przebudowanie assetów zarówno serwerowych jak i.
Statycznych plików HTML, ponieważ tutaj mamy właśnie statyczne serwowanie plików.
Czyli jeżeli ja tutaj zrobię
zamiast tego dockera docker na youtube jest live reload.
Zapiszemy.
Ja tylko tutaj odświeżę to na stronie głównej
i faktycznie widzimy, że ta zmiana została zaaplikowane.
Więc jak widzicie
w ciągu tej jednej krótkiej lekcji jesteśmy w stanie stworzyć aplikację
deweloperską z naprawdę dobrym user experience.
Dla nas dla developerów tak aby działało to szybko.
Działało to jednolicie na różnych
systemach operacyjnych, od zera do działającej aplikacji używającej Dockera.
Zlikwidował DM w Jamesie.
Jak widać się da.
W związku z czym
w następnych sekcjach tego kursu będziemy korzystali właśnie z tej
aplikacji, aby przygotować ją troszkę pod środowisko produkcyjne np.
pod takim kątem, aby aplikacja zamykała się.
Z gracją w momencie kiedy otrzymuje sygnał wyjścia, tak abyśmy np.
nie musieli czekać tych 10 sekund, aby
wystawiała poprawnie logi i tak dalej i tak dalej.
Do zobaczenia w kolejnych sekcjach tego kursu.