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 polecenia związane z kontenerami.
Więc tak jak wspomniałem w.
Poprzedniej lekcji, aby sprawdzić listę dostępnych poleceń, możemy po prostu
wpisać to polecenie, przynajmniej w przypadku Dockera.
Nie wszystkie programy
działają w ten sposób, więc jeżeli wpiszemy sobie po prostu Docker
na to, zobaczymy wszystkie dostępne komendy na poziomie Dockera.
Ale jeśli wpiszemy docker container to jesteśmy w stanie wypisać wszystkie
polecenia związane z uruchamianiem czy pracą z kontenerami.
Czyli jeśli.
Chcielibyśmy.
Uruchomić kontener, no to oczywiście.
Możemy uruchomić go przy pomocy tutaj jednej z dostępnych metod w docker.
Container.
Ale jest też oczywiście opcja skrótowa, bo nie zawsze chce nam się po prostu.
Wpisywać docker container ram.
Tutaj tak dużo administratorzy systemów
operacyjnych spędzają, że po prostu są do tego skróty.
Czyli jeśli chcielibyśmy.
Wpisać sobie listę uruchomionych kontenerów możemy wpisać docker ps.
PS Jest to polecenie do licytowania
procesów, więc tak naprawdę licytujemy w pewnym sensie procesy.
Jak widzimy tutaj żaden nie jest.
Uruchamiany, więc jeśli zrobimy docker run debian bash możemy.
Tutaj wykorzystać do tego różne flagi.
Oczywiście tych flag jest bardzo dużo.
Najpopularniejsze to jest ID.
Jeżeli chcemy faktycznie mieć interaktywny
dostęp do uruchamianego kontenera, to musimy dodać flagę
AI jako interactive i te y, czyli po prostu nazwa danej powłoki.
Nie musicie tego pamiętać.
Ważne, żeby pamiętać skróty literowe jakie to są.
Jeżeli uruchomię to.
Polecenie, no to wtedy znajdę się wewnątrz kontekstu kontenera Debian.
Ale jeśli nie chce być.
Wewnątrz tego kontekstu.
Mogę.
Podać flagę D jako disabled.
Czyli odłączony.
I jeśli to uruchomimy to zwrócony nam jest tylko taki długi hash danego kontenera.
Ale jeśli wpiszemy.
Docker ps to zobaczymy, że on powinien nam się tutaj wypisać.
A jak się nie wpisał to jesteśmy w stanie.
Podać flagę a do naszego polecenia docker ps.
I wtedy wyświetlone zostaną wszystkie.
Zastosowane kontenery czy kontenery, które zostały wyłączone.
I tutaj widzę, że nasz bash się niestety wyłączył.
Podejrzewam, że po prostu.
Debian jako obraz nie ma tutaj żadnego procesu, który tam jest uruchamiany w tle.
Więc Debian się uruchomił.
Jako że nie było nic do roboty automatycznie się wyłączył.
Ale jeżeli na przykład włączymy sobie serwer HTTP engines.
A tutaj tego basha bash został uruchomiony, ale jako że nie
było żadnego polecenia do tego basha, on się dlatego wyłączył.
Więc jeżeli pozbędziemy się tutaj tego
basha na końcu, no to wtedy uruchomiony zostanie obraz z domyślną komendą.
I tak naprawdę gdybyśmy usunęli sobie
basha z polecenia debian, tak samo by się to nam stworzyło.
Więc jeszcze raz docker ps.
I widzimy, że nasz engine schodzi.
Więc zrobimy tylko, żeby upewnić się, że to ma sens.
Docker ps na Debianie.
I widzimy, że się nie uruchomił.
Czyli to można po prostu podejrzeć co robi dany obraz
jako swoje argumenty uruchomieniowe, jak jest jako entry point np.
właśnie poprzez docker image.
Inspektor Nazwa obrazu.
I zobaczymy nasz endpoint. Zobaczymy.
Komend bash i bash jest po prostu domyślną i domyślnym poleceniem dla Debiana, czyli
też nie ma nic do roboty i automatycznie się wyłącza.
Ale z drugiej strony ma.
Inne polecenie docker image inspektor.
Engineers. I zobaczymy, że tutaj.
Entry point jest to do kręty point i na
cmd mamy uruchomionego demona tekstowego, który po prostu nasłuchuje na ruch http
w swoim kontekscie, czyli po prostu on ciągle chodzi.
Jak sobie wpiszę docker container ponownie aby zobaczyć listę to możemy np.
zabić dany kontener.
Jeżeli chcielibyśmy zastopować go siłowo to możemy wykorzystać polecenie kill.
Jest też polecenie stop aby grać, czyli z gracją zamknąć dany kontener.
Ponieważ w systemach operacyjnych opartych
na Linuksie w momencie gdy zamykamy daną aplikację, ona może skonsumować dane.
Kody wychodzenia.
Ciężko jest to po prostu po polsku przetłumaczyć tak aby np.
w sytuacji kiedy będziemy zamykali nasz proces, nasz kontener, to możemy np.
odłączyć się od bazy danych, aby upewnić się, że gdy aplikacja się zamknie,
nie będzie żadnych artefaktów, przez które połączenie nie zostało zamknięte.
Czyli jeśli chcielibyśmy np. .
Zastopować engineers to możemy zrobić docker container stop.
Tutaj musimy podać nazwę naszego kontenera, nazwę, to znaczy image id.
I znów jak mamy za daleko to możemy po prostu sobie to napisać.
Docker ps i tutaj kontener git.
Jak robimy container fstab.
Nazwa kontenera to on zostanie zatrzymany i czas pokaże, że.
On się wyłączył.
Analogicznie moglibyśmy uruchomić.
Ponownie tutaj engine Exa, zobaczyć jego pracę.
Pamiętajcie, że container będzie za każdym
razem inne, ponieważ tworzymy nowy kontener na podstawie tego samego obrazu.
Jesteśmy go w. Stanie tak samo zabić.
Możemy tutaj zrobić container kill, czyli on wysyła sygnał 9.
I tak naprawdę wtedy nie ma czasu dla
kontenera, aby zrobił jakiekolwiek operacje czyszczące.
To co się działo w systemie operacyjnym,
czyli jeżeli mielibyśmy logikę, która odłącza bazę danych przy
sytuacji gdzie jest to kill, nie ma pozwolenia na to aby to się wydarzyło
ze strony aplikacji, więc nie polecam zabijać.
Na pewno nie zabijać kodem numer 9,
ale oczywiście też to zadziała i w większości przypadków np.
jeżeli będziecie chcieli zabić kontener
nginx Apache to nie będzie z tym najmniejszego problemu.
Jeśli natomiast obraz nie konsumuje tych
sygnałów wejściowych, wtedy Docker będzie czekał 10 sekund zanim.
Dany kontener się. Zamknie.
Czyli jeżeli macie sytuację.
Że kontener.
W momencie gdy uruchamia się docker stop,
bo to też oczywiście nie musimy pisać docker container stop.
Możemy po prostu uruchomić nginx i wpisać docker.
PS.
Pobrać sobie kontener id i wpisać docker stop.
Nazwa kontenera zadziała to w ten sam sposób.
Nie musicie podawać tutaj tego prefiksu container.
To jeżeli dany obraz nie konsumuje.
Sygnałów wyjściowych w sposób poprawny.
Wtedy docker będzie czekał 10 sekund.
I dopiero się wyłączy.
Niezależnie od tego, czy aplikacja w. Ogóle.
Robi coś w tym momencie.
Po prostu jest to taki stały, sztywny timeout.
Aby teoretycznie aplikacja mogła się zamknąć.
Więc jeżeli macie sytuację, że zamykacie
jakiś obraz i zamyka się przez 10 sekund, to jest to dobra wskazówka, że coś jest
nie tak w Waszym w Waszej aplikacji i prawdopodobnie musicie.
Skonsumować sygnały wyjściowe Dockera.
No i zobaczmy jeszcze jakie mamy tam polecenia.
Oczywiście jeżeli uruchomimy sobie sam, to jesteśmy w stanie na niego wejść.
Ale wywołać na nim polecenie. Czyli jeśli zrobimy.
Sobie docker container.
To widzimy, że polecenie jest wewnątrz sklepu container, czyli tak jak
uruchomiliśmy ten kontener za pomocą docker run, to tak naprawdę.
Uruchamiając docker container run.
Uruchamiamy dosłownie tę samą aplikację, bo tworzymy nową instancję tego polecenia.
Nowe polecenie wydajemy
w tym nowym kontenerze i teraz będziemy mieli otwarte dwa exe.
Co istotne, jeżeli zastępujemy.
Dany kontener np.
docker stop.
Hash kontenera.
I wpiszemy sobie docker PS a to zobaczymy.
Mamy tutaj bardzo dużo.
Tych zastosowanych kontenerów i.
Jesteśmy w stanie go wznowić niezależnie od tego.
Czy on już został wyłączony.
Czyli jeśli zrobimy sobie start.
To nasz kontener, który już wcześniej był uruchomiony.
Zostanie przywrócone do życia.
Czyli nie zawsze trzeba uruchamiać.
Z tego docker aby uruchomić kontenera.
Bo tak jak widzimy mamy tutaj duuużo uruchamiania kontenerów.
Co warto pamiętać?
Akurat uruchomione kontenery
czy zastosowane kontenery nie zajmują tak dużo miejsca jak zduplikowane obrazy.
Dlatego też tutaj nie ma informacji o tym,
ile te obrazy zajmują miejsca, ile te kontenery zajmują miejsca, bo jest
to po prostu wydajne z perspektywy Dockera.
No i oczywiście tych poleceń jest o wiele więcej.
Są logi, o których będziemy mówili też w późniejszych częściach tego kursu.
Możecie podejrzeć sobie informacje o danym kontenerze, np.
informacje o warstwie sieciowej.
Jak.
Docker komunikuje się z innymi kontenerami, bo też wielką siłą Dockera
jest to, że jesteśmy w stanie z Capsule ować zamknąć w danym obszarze
całą warstwę sieciową i tylko pojedyncze warstwy aplikacji wystawiać tak, aby były
dostępne dla innych kontenerów czy dla przykład dla hosta?
Czy jeśli np.
byśmy chcieli sprawdzić jakie zmiany.
Pojawiły się na danym kontenerze przy okazji wchodząc do danego kontenera.
Czyli zamiast container exec możemy zrobić sobie exec.
Flaga ID tutaj nazwa kontenera i powiedzmy bash bo chcemy wejść w basha.
To możemy sobie tutaj. Zrobić nowy plik powiedzmy.
Hello world.
Zapiszemy go do nowego pliku txt i w momencie gdy wyjdziemy.
To oczywiście ten proces nie.
Umarł, bo on dalej ma uruchomiony proces, który w nim chodzi i uruchomimy na nim
docker tajner diff i podamy sobie tutaj hasz tego obrazu to
widzimy naszą zmianę naniesioną, czyli ta zmiana Hello text.
Ona jest tworzona.
W momencie kiedy już.
Nasz obraz wystartował.
I te wszystkie rzeczy tutaj też się. Stworzyły.
W momencie startu naszego obrazu, czyli np.
jeżeli. Usuniemy ten.
Kontener całkowicie i stworzymy go na nowo
od obrazu, no to tego pliku hello tutaj nie będzie.
On jest tylko na tym naszym kontenerze jako dodatkowa warstwa tzw.
temporary, chwilowa warstwa odczytu i zapisu.
Wszystkie inne warstwy są tylko warstwami tylko do odczytu.
Więc jak widzicie tych poleceń jest naprawdę bardzo dużo.
Te o których.
Warto pamiętać to docker ps docker run aby uruchomić docker
rm aby usunąć dany kontener czy docker kill aby go zabić całkowicie.
Docker exec aby. Wejść na dany.
Kontener docker logs aby sprawdzić jego
logi, o których też będziemy mówili w dalszych częściach kursu.
I wydaje mi się, że to.
Powinno dać mniej więcej pojęcie o tym,
jakich podstawowych poleceń w kontekście kontenerów możemy używać w Dockera.
W kolejnych lekcjach.
Po kolei zajmiemy się.
Budowaniem obrazu, uruchamianiem nowo stworzonego obrazu.
Montowaniem wolumenów i generalnie ustawianiem.
Wszystkich tych rzeczy.
Które są z reguły potrzebne dla każdej z naszych aplikacji internetowych.