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 opowiem troszkę więcej o.
Logowaniu w kontekście Jamesa i Dockera.
Tak jak wspominałem, jeżeli mamy proces ID ustawiony.
Na 1 to.
Wtedy już większość rzeczy powinna działać tak, że jeżeli np.
sobie zrobimy. Sytuację, że sprawdzimy czy docker PS.
Nam chodzi, nasza aplikacja chodzi.
Zrobimy na tym docker logs follow.
Oczywiście tutaj akurat ten kontener nie
wystawia żadnych logów i to też za chwilkę naprawimy, zmienimy.
Natomiast jeśli ja bym tutaj przerzucił to na bok.
Wrzucił go tutaj.
To zobaczymy, że przy docker pps i docker kill.
Albo stop. Tak naprawdę nie ma znaczenia.
Mamy informacje o granicy.
Czyli tutaj standardowe wyjście jest poprawnie przekierowane.
Ponieważ zmieniliśmy tutaj, że
naszym entry pojęciem jest bezpośrednia NOT, więc jest to proces IT.
1.
Jakbyśmy zrobili sobie tutaj CD gdziekolwiek i przejdźmy dalej, to już to
nie będzie proces, bo to zostanie zawarte wewnątrz powłoki basowej jako skrypt.
W związku z czym trzeba po prostu zrobić
to w ten sposób albo rozwiązać to jakoś inaczej.
Natomiast nasza aplikacja.
Sama z siebie.
Nie wystawia żadnych logów w momencie, gdy jest jakiś ruch na niej.
Czyli jeśli np.
ja odwiedzę to raz tą stronę oczywiście musi wstać, nasza baza musi się uruchomić.
Uruchomił się. Jak widzimy tutaj przy docker.
POZ.
Logs posiada jeszcze logi z poprzedniego uruchomienia bo zrobiliśmy tylko update.
Jakbyśmy usunęli ten kontener i zrobili go ponownie to by nie było.
Ale widzimy, że nie ma. Żadnych informacji o tym gdy przychodzi
request, a to dlatego bo nasza aplikacja po prostu nic nie loguje.
W tym momencie zamiast.
Dodawać do każdego requestów.
Informacje na ten temat, możemy użyć do tego biblioteki.
Ona nazywa się Morgan i co prawda to już
jest taki obraz powiedzmy, który staraliśmy się robić bardziej produkcyjny,
więc będziemy musieli po prostu go restartować, chyba że po prostu chwilowo.
Zmienimy tutaj z powrotem na tą
informację deweloperską, ale wtedy będziemy musieli naprawić ścieżki do
naszego statycznego serwowania plików, więc ja to zostawię tak jak jest.
Wejdę sobie do tego kontenera.
A masz.
I tutaj application zrobię sobie npm install say.
Morgan Morgan to jest taka.
Aplikacja middleware, który może być użyty z ekspresem.
Do tego pobierzemy Morgan Tequila Morgan.
I co robimy?
AP juz.
Morgan Companies i to nam powinno wystarczyć.
Aby nasza aplikacja w momencie kiedy ją
zrestartuje, bo oczywiście nie ma tutaj już litery lodu, wyłączyliśmy go,
więc możemy sobie zrobić docker composer docker vs apt.
Jak widzimy jest tutaj rating D i wyszliśmy z kodem 0.
Czyli docker down wysyła sygnał, który nie jest błędem.
Chociaż zastanawiam się czy powinniśmy tutaj bezpośrednio przekazywać.
Prawdopodobnie powinniśmy dodać jakąś logikę.
Jeżeli to był exit kod taki, to zastanówmy się co powinniśmy z tym dalej zrobić.
Niemniej możemy sprawdzić logi i teraz przy odświeżaniu tej strony
my powinniśmy mieć tutaj informację w takim stylu.
A więc te informacje tutaj są i one są poprawnie wystawione.
Dzięki temu, że właśnie nasz Docker Composer czy
cokolwiek uruchamia naszą aplikację, korzysta bezpośrednio z procesu noda.
Czyli obraz jeżeli byśmy mieli zbudowanej
ustawili mu cmd na takie to też nasz obraz chodziłby poprawnie.
Natomiast czasami zdarza się.
Że nie jesteśmy w stanie zrobić, że proces
IT 1 będzie należał do aplikacji, która ma być uruchomiona.
Czasami mamy kilka serwerów wewnątrz jednego kontenera, tak aby uprościć trochę
konfigurację, żeby nie komunikować się z zewnętrznymi kontenerami.
W związku z czym co można zrobić.
To na przykład jeżeli byśmy stworzyli.
Drugą tutaj aplikację
i tutaj sobie zrobimy alternative login i tutaj sobie zrobimy po prostu z Debiana.
Nie potrzebujemy żadnych wolumenów
wolumenów, nie potrzebujemy żadnych portów, komend.
Wykorzystamy ponownie bash.
C will true.
Do 3600 ton,
a więc po prostu będziesz tutaj chodził jak zrobimy sobie trochę kompost.
Update to nasz serwer się nie zmieni, ale zostanie dodany tutaj ten najnowszy.
Debian i on.
Też będzie sobie chodził jako kontener, który nie robi w tym momencie nic.
Możemy zrobić docker ps żeby. Się upewnić.
I widzimy, że jest tutaj ten Debian uruchomiony.
Jak zrobimy sobie docker logs.
W tym miejscu nie mamy.
Żadnych informacji o tym, co się dzieje w tym kontenerze.
Więc to co można zrobić.
To na etapie budowania obrazu i tutaj sobie zrobimy po prostu test.
Docker failed file test nie ma znaczenia.
Zrobiłem from Debian.
Przeniesiemy.
Tę komendę do cmd.
Czyli będzie nam po prostu wisiał, a to co my zrobimy.
To sprawimy, że inne pliki gdzieś w tym systemie plików będą przekierowane jako.
Standardowe wyjście tego kontenera.
Czyli jeśli otworzymy sobie tutaj polecenie RAM.
I stworzymy mk drm var log custom access log.
Tutaj potrzebujemy flagi P, żeby cała ścieżka została stworzona.
Jeżeli nie będzie takich informacji wcześniej, możemy.
Postawić. Na różnych warstwach.
Tak naprawdę nie ma to znaczenia.
I tutaj sobie stworzymy dwa pliki, czyli taki.
Axis lock.
I tak.
Error log tworzy nam pliki.
Jeżeli plik nie istnieje, zostanie on utworzony, a tak naprawdę sam
w sobie aktualizuje ostatnią datę modyfikacji tego pliku.
Więc tworzymy sobie tutaj.
Dwa pliki.
I to co możemy zrobić, to przekierować
nasze standardowe wyjście w ten sposób, aby czytało z access logu.
I z error logu i robi się to w ten sposób, że po prostu robi się symbolicznego linka.
Czyli jakby skrót w Windowsie ponownie,
który będzie zapisywał do takiego magicznego katalogu.
W Debianie na systemach, które bazują na Debianie.
Tutaj nie będę w to zbyt głęboko wchodził,
bo to jest bardzo systemowe administracyjne.
I np. jeżeli chcielibyśmy przekierować logi.
Apacza, to moglibyśmy zrobić w ten sposób.
Ja to po prostu napiszę jako custom
i teraz po zapisaniu to powinno już zadziałać.
Więc to co ja zrobię to docker build kropka.
Fire test.
I możemy je jakoś otagować.
Czyli docker custom logs latest.
Jak widzicie dalej korzystamy z poleceń Dockera.
Pomimo tego, że mamy poza.
Moglibyśmy to zamieścić w opcji build, ale.
Tak też może być.
Po prostu czasem wygodniej less i może tona custom.
Mamy nasz obraz zbudowane 7 sekund temu.
Więc po prostu użyjemy go w naszym pauzie zamiast Debiana.
I teraz po zrobieniu Docker composer
the one się nam aktualizują, więc alternative following się nam reprezentuje
i znów czekać 10 sekund, ponieważ nie było obsługi procesów wyjściowych.
Czasami nawet dłużej niż 10 sekund.
Tutaj mamy docker pauza, który jest
ustawiony na nasłuchiwanie na logi wszystkich kontenerów.
Dlatego tutaj nam się pojawiła informacja, że ten kontener się zrestartował.
Ale jeżeli teraz zobaczymy docker PS to
znowu mamy tutaj tego dockera z custom owymi logami.
Jak zrobiłem sobie docker log.
Tutaj nie będzie żadnych logów wystawionych.
Ale jeżeli sobie zrobimy docker composer.
Exec co to jest alternative floating
państwa to nazwa tej osoby po prostu skopiuję.
Alternative looking.
Wchodzimy do basha i.
Jeżeli po prostu zapiszemy do tego.
Pliku, który zdefiniowaliśmy, że jest
naszym wejściem czy wyjściem na out czy error, to robiąc np.
chrome.
Do tej lokalizacji.
Zobaczymy, że w naszych logach pojawia się ta informacja.
I tak samo. Analogicznie do Access mamy również plik.
Error log i on się też loguje.
W tym samym miejscu, ale jest po prostu jakby w innej kategorii.
Jest jako kategoria błędów, więc to też
jest alternatywna opcja tego jak można sprawić, aby nasze
kontenery czytały informacje o logach i przekazywały je do docker logs.
Nawet jeżeli proces IT nie jest autentycznie tym, który wystawia
nam te informacje, więc tak to właśnie wygląda.
W kolejnej lekcji zbudujemy obraz.
Produkcyjny naszej aplikacji, na którą teraz pracowaliśmy.
A w jeszcze następnej umieścimy ją na zewnętrznym hostingu stron internetowych.
Czyli akurat w naszym wypadku będzie to digital Fusion.
docker-compose.yaml · 9 min
version: '3.7'
services:
app:
image: node:17
volumes:
- .:/app
ports:
- 8080:8080
command: node /app/src/index.js
# command: npm run dev --prefix /app
alternative-logging:
image: docker/custom-logs
command: bash -c "while true; do sleep 3600; done"Dockerfile.test · 8 min
FROM debian
RUN mkdir -p /var/log/custom/
RUN touch /var/log/custom/access.log && touch /var/log/custom/error.log
RUN ln -sf /proc/1/fd/1 /var/log/custom/access.log \
&& ln -sf /proc/1/fd/2 /var/log/custom/error.log
CMD bash -c "while true; do sleep 3600; done"