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 zajmiemy się wystawianiem portów z naszej aplikacji.
Dlatego przygotowałem tutaj dwa dodatkowe pliki.
Jednym z nich jest serwer.
DNS i on tworzy zwykły.
Serwer HTTP z wbudowanego modułu HTTP.
No i logika jest taka, że.
Po prostu jeżeli jest jakikolwiek request przychodzący to piszemy
Status Code 200, czyli poprawna odpowiedź i wysyłamy ostateczny kod Hello World.
Tutaj tworzymy ten serwer i.
Nasłuchuje na porcie 80 80, a więc.
To co zrobimy.
W tej lekcji to.
Zbudujemy obraz, dodamy nasze.
Nasze pliki za pomocą wolumenów.
Spróbujemy uruchomić ten serwer.
I wystawić go do naszego hosta.
Czyli zaczynając robimy docker build.
On prawdopodobnie już jest zbudowany.
Tutaj mamy.
Internal Lock Ignore.
Oczywiście musimy być w katalogu numer 3,
ponieważ jest to trzecia nasza lekcja, w której mamy osobne branch na GitHubie.
Więc tutaj wpisujemy ponownie kropka.
Możemy atakować, tylko być może bez tego na Łukasza nie ma to sensu w tym momencie.
Reagujemy, budujemy dwie sekundy.
Tym razem to zajęło i mamy nasz obraz, więc uruchamiamy go.
I możemy uruchomić go tak samo jak otworzyliśmy poprzedni serwer.
Czyli tutaj to. Byłoby docker run.
Możemy sobie to zapisać tutaj na górze, żebyśmy mieli to wygodnie pod ręką.
Zapiszemy naszą obecną ścieżkę.
Jeżeli jesteśmy w płaszczu, to w sumie możemy zrobić to troszkę wygodniej.
Czyli jeśli np. uruchomimy.
Sobie pwd.
To widzimy.
Naszą ścieżkę obecną, której się znajdujemy.
Ale jeśli.
Zrobimy sobie.
W marszu.
Coś takiego, że tutaj dodajemy wolumen przy pomocy flagi V.
I chcemy po prostu dynamicznie użyć tej wartości pwd.
Na to możemy. Stworzyć.
Nowy sprzęt. Tutaj używamy.
Do tego TK, TK on jest pod klawiszem TD. I tutaj wpisujemy.
Komendę którą chcemy wywołać.
I chcemy dodać ten nasz plik serwera.
Że jest w.
Katalogu głównym serwer. James.
Czyli z naszego hosta.
Pobieramy obecny katalog, dodajemy do niego plik serwer DNS, który nas.
Interesuje i on zostanie.
Zamontowany w głównym katalogu naszego kontenera pod nazwą serwer.
Później spróbujemy. Wywołać polecenie.
Na serwerze jest aby uruchomić właśnie
ten serwer i zobaczmy co się stanie gdy to uruchomię.
On się chyba zawiesił.
Albo faktycznie chodził ten serwer bo nie dałem.
Flagi disabled.
Więc ten serwer nam tutaj chodzi.
Piszemy do Krebs to widzimy, że on faktycznie jest uruchamiany.
Docker exec nazwa kontenera Wchodzimy na kontener do basha.
I jeżeli mamy zainstalowanego kernela, którego nie mamy.
To też od razu możemy
pokazać jak instaluje się zależności wewnątrz kontenera.
Akurat obraz jest bazowanie.
Na obrazach Debiana. Więc możemy.
Tutaj wykorzystać apt get update i apt get install, żeby.
Zainstalować po prostu. Polecenie o które nam chodzi.
Kernel jest to taki. Polecenie do.
Pobierania zasobów ze stron internetowych, czyli możemy sobie pobrać tego kernela.
Co się nam pobiera. To jest.
Jakby rzecz Debiana blisko systemów operacyjnych, ale to też
warto wiedzieć jako web developer, bo to jest bardzo często przydatne.
I teraz jesteśmy w stanie zrobić sobie kernela do tego naszego.
Serwera który chodzi na porcie 80 80.
Czyli localhost.
Localhost 80 80 i mamy odpowiedź Hello world.
Tylko, że jeżeli ja tutaj wejdę z naszej.
Przeglądarki na localhost 80 80. To zobaczymy.
Że ta strona nie może być osiągnięta, nie jest osiągalna.
W związku z czym ten serwer już wchodzi.
Lokalnie wewnątrz kontenera.
Ale nie jest wystawiony na zewnątrz, nie jest dostępny dla naszego hosta.
Tak jak wspominałem w poprzednich
lekcjach, Docker domyślnie nie wystawia wszystkich portów.
Aplikacji, które ma uruchomione. Tak aby też nie było.
Konfliktów właśnie z innymi aplikacjami,
jak ten nieszczęsny skrypt, z którym miał kiedyś w przeszłości konflikty z XAMPP.
Więc co możemy zrobić z poziomu uruchomionego kontenera?
Już jest ciężko wystawić, więc po prostu wyjdziemy z tego kontenera.
Wpiszemy PPS, zabijemy ten proces docker kill.
Na kontenerze i on się od.
Razu nam tutaj zamknął.
Nie czekał tych dziesięciu sekund, gdzie normalnie czekałby dziesięć sekund.
Więc po prostu troszkę zaoszczędziliśmy naszego czasu.
I to, co trzeba zrobić, to
albo wewnątrz naszego docker file, albo wewnątrz naszego docker file.
Zrobić tutaj polecenie ex post.
Który powie naszemu obrazowi, że.
Na tych portach jakaś aplikacja może chodzić.
Jeżeli ktoś poprosi, to wystaw ten port dalej i my wiemy, że nasza aplikacja.
Chodzi na 8080.
Jest to zakodowane
w naszym kodzie źródłowym, więc jeśli sobie to przewidujemy.
Oczywiście ponownie musimy być w odpowiednim katalogu.
Pamiętajcie, że jeżeli robi się
kropka, no to musicie być w katalogu, w którym się znajduje.
W przeciwnym wypadku.
Możecie po prostu podać ścieżkę do tego katalogu i tego pliku.
Oczywiście możemy też używać innych tagów.
To ja tutaj dalej korzystam z neutral.
To jest tylko dla mojej wygody możemy tutaj wpisać v2.
Możemy podążać za serwerem.
Ale wracając jeśli uruchomiłem ponownie ten proces.
I zobaczmy, czy on tutaj nam się zamknął.
Wyjdziemy stąd albo możemy wejść do Basha i po prostu sobie skopiować to polecenie.
To sam ex post niestety nie wystawi.
Naszej aplikacji na zewnątrz.
Ale powie silnikowi, że jeżeli ktoś poprosi o wystawienie.
Wszystkich portów na zewnątrz albo jeszcze ich części.
No to port.
80 80 będzie na liście tych portów, które są dostępne do wystawienia.
I wystawić porty przy poleceniu docker run.
Możemy za pomocą.
Dodatkowej flagi dash p z wielkiej litery oznacza.
Wystaw wszystkie porty, które są wyeksportowane w.
Docker film. No i.
Oczywiście możemy zerknąć do dokumentacji.
Jak działa ta flaga. Czyli np.
jeżeli sobie wpiszemy docker run flags albo jeżeli wpiszemy sobie.
Po prostu ekspansja, to tutaj możemy sobie to.
Przeszukać.
I zobaczymy jak to wszystko działa
i jak działa flaga P czyli publish on host interface.
Czyli po przebudowanie.
Tego obrazu z expose.
70/80.
Dodanie flagi Dash p pozwoli wystawić.
Ten port w danym miejscu.
Oczywiście znów nie dodałem flagi dash D czyli w tym momencie
nie mogę wpisywać kolejnych poleceń, bo mamy dalej uruchomiony ten proces.
Jesteśmy podłączeni pod niego i przez to,
że nie mamy obsłużone wychodzenia aplikacji w momencie kiedy
jest sygnał przychodzący z kontrolce który zamyka
wszystkie aplikacje to jesteśmy tacy zablokowani troszkę.
Ale jeżeli sobie wpiszemy docker PS to zobaczymy, że.
Tutaj. Ten port 80 80 w kategorii port.
Został przekierowany do 0:00 czyli.
Jest to.
Broadcast.
Jeżeli dobrze pamiętam z nomenklatury tcp ip.
Został przekierowany. Do portu 55 000.
Czyli on nie jest automatycznie przepisywany.
Na port 80 80, przynajmniej jeżeli robimy to przy pomocy EQ spoza flagi P.
Ale spróbujmy w takim razie na naszym hoście.
Wejść na aplikację.
Na porcie 80 80.
I faktycznie widzimy, że to działa.
Jest też inna droga oprócz.
Eksponowania tego w ten sposób
i spróbujemy zabić ten kontener docker kill.
Zabijamy.
Możemy go uruchomić za pomocą.
Flagi.
Małe P i wtedy jest to tak naprawdę prostsza.
Troszkę trasa. Ja tutaj wyjdę z tego basha, bo on mi się
niestety troszkę tutaj zacina i przepiszę sobie to na składnię.
Chwilową.
Jeśli zrobimy sobie małe P to jesteśmy
w składni bardzo podobnej do tego jaka była wolumen.
A wystawić dane porty.
Czyli jeśli chcielibyśmy aby nasz port 80 80 był wystawiony na hoście na porcie.
80 80. To możemy to zrobić na tej.
Zasadzie.
Wysłać to tutaj widzę, że on bez dolara przyjmuje i nawet nie dodałem
flagi Dash, więc będziemy musieli zamknąć terminal.
Ale w tym momencie wchodząc na localhost.
8080 mamy dalej naszą aplikację.
I tutaj zaleta tego jest też taka.
Oczywiście, że jeżeli chcielibyśmy na innym porcie wystawić te nasze aplikacje.
To możemy to zrobić w sposób wygodny bez modyfikowania naszego.
Maila i przez to, że mamy użyte volume. Jeśli np.
chcielibyśmy serwować.
Statyczny kontent na przykład ten plik index.html.
No to zmiany na naszym.
Systemie operacyjnym miałyby wpływ na to jak ta aplikacja
działa bez konieczności przebudowania obrazu przy każdej zmianie pliku index.
HTML. Zrobimy to w kolejnej lekcji, gdzie też
zrobię krótkie podsumowanie tego wszystkiego, o czym do tej pory mówiliśmy.
I to będzie ostatnia lekcja w tej sekcji tego kursu.
A następnie omówimy wszystkie polecenia docker file, bo w tym momencie.
Tak naprawdę zajęliśmy się tylko.
Konceptem budowania, ale nie samą.
Składnią i tym, co można przez samego Docker maila osiągnąć.
Do zobaczenia w kolejnej lekcji!
server.js · 9 min
const http = require('http');
const requestListener = function (req, res) {
res.writeHead(200);
res.end('Hello, World!');
}
const server = http.createServer(requestListener);
server.listen(8080);Dockerfile · 9 min
FROM node
EXPOSE 8080