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.
Ci trochę o tym, czym są warstwy i czym są konkretnie Multi Stage Builder.
Więc będziemy pracowali znowu na docker filo.
O warstwach już troszkę powiedziałem.
Czyli zaczynając tworzyć nasz.
Docker file z jakiegoś obrazu
na przykład możemy to zrobić z obrazu tutaj ja podam jej rekord.
Record Tools.
To jest taki obraz, w którym zawarte są.
Różne narzędzia związane z np.
pracą, pracą, z natłokiem.
To znaczy mamy tam zainstalowanego Karla TGA, jakieś narzędzia typu ping.
Więc generalnie wszystko jeżeli chodzi o cały networking.
Całe te narzędzia. Są tam zainstalowane.
I tak jak wspominałem, jeżeli chodzi o warstwę, to każde polecenie run.
Tworzy nam nową warstwę, która później może być skasowana.
I która.
Jest zawarta w naszym docelowym obrazie wynikowym.
Więc jeżeli byśmy to narysowali w taki sposób, że.
To jest nasz kontener.
To każda warstwa, każdy ram.
Czyli to tak jak byśmy sobie wpisali np.
na razie ran MK Dirt.
Możemy to sobie skopiować kilka razy,
to każdy z tych runów będzie nam tworzył osobną warstwę.
I wracając do naszego grafu będzie to wyglądało w ten sposób, że jedna
warstwa RAM będzie dodawana w sumie na samym początku, czyli
od dołu, więc pierwsze MK dodałby nam się tutaj.
Następnie na nim
dodawane byłyby kolejne warstwy, czyli kolejny run stworzyłby nam tutaj.
Taką. Warstwę tutaj.
I w.
Momencie, kiedy już dojdziemy do końca tego naszego.
Do chwila powiedzmy, że skończyli byśmy go sobie tutaj.
To Docker tworzy tak zwane.
Warstwy read write.
Wszystkie te warstwy, które tutaj.
Widzimy, te, które zostały stworzone przy pomocą tego MK Dirka.
To one są warstwami read only.
To znaczy nie można wprowadzić na nich żadnych zmian.
Jeżeli chcielibyśmy wprowadzić jakąś zmianę w obrazie.
No to powinniśmy po prostu stworzyć dodatkową warstwę, która na przykład
zmieni treść pliku, który został stworzony tutaj.
I warstwy, które zostały dodane.
W runtime, bo też już to zrobiliśmy
tworząc pliki, wchodząc na kontener, następnie tworząc pojedyncze pliki
wewnątrz tego kontenera, to są to warstwy, które mają.
Możliwość zapisu, ale są efemeryczne.
To znaczy, że znikają w momencie, kiedy kontener umiera.
Można to zapisać, aby te warstwy nie.
Umierały za pomocą docker commit.
Ale jeżeli tego nie zrobimy.
To tutaj po prostu dochodzi nam
kolejna warstwa, która nazywa się po prostu warstwą read write.
I ta warstwa.
Odnosi się do zmian.
Podczas trwania życia kontenera, czyli changes in the container runtime.
Więc tak wygląda.
Graf tego jak działają warstwy. I znając.
To możemy też wykorzystać.
Tę mechanikę warstw do tworzenia multi stage bitów.
Czyli o co chodzi w multi segmentach?
Idea jest taka, że nie zawsze chcemy mieć cały np.
framework.
Czy cały język oprogramowania, cały język programowania.
Zainstalowane na naszym docelowym obrazie, tylko chcemy np.
uruchomić jakiś kompilator.
Moglibyśmy np. chcieć.
Uruchomić web packa, który dawałby nasze sety albo logował je do jednego.
Pliku wynikowego.
Jakąś kompilację np. w.
Skrypcie, ale niekoniecznie chcemy mieć zainstalowanego.
Samego klienta na tym naszym urządzeniu.
Więc zamiast tworzyć kolejne.
Warstwy i tutaj pisać npm install save. TypeScript.
No to oczywiście możemy to zrobić inaczej, wykorzystując do tego drugą klauzulę FROM.
Czyli początkowo.
Generalnie do każdej z tych warstw możemy.
Się odnieść po numerku.
One są numerowane tak jak indeksy w tablicach.
Ale możemy je też nazwać. Czyli jeżeli sobie.
Nazwiemy, że nasz obraz ma być budowane z record netto.
Tutaj oczywiście muszą być dwa o
to możemy go nazwać przy pomocy słowa kluczowego as jako np.
fetch data.
I powiedzmy, że nasz kontener będzie potrzebował jakiś informacji.
Z internetu np.
jest tutaj takie API darmowe, z którego można sobie skorzystać
jeżeli chodzi o testowanie naszych aplikacji z.
Jest to. Request response.
In. No i tutaj mamy przykładowe API wypisania.
I to co moglibyśmy zrobić. Dwa podejścia.
To albo zainstalować po.
Prostu wszystkie zależności, które byłyby wymagane do tego, aby pobrać sobie
ten plik stąd na nasz system operacyjny do naszego kontenera.
Moglibyśmy rozszerzyć. Ten obraz.
NET Tools o. Jeżeli np.
zależy nam na czasie.
Albo możemy wykorzystać do tego.
CBD.
Czyli my nie chcemy, aby nasz obraz. Budowy.
Miał w sobie te wszystkie.
Zależności powiązane z pobieraniem.
Informacji z internetu jakiegoś carla
wget, A więc to co możemy zrobić to na tym kontenerze.
Który jest bazowania na obrazie jego Record.
NET tools.
Możemy uruchomić po prostu przejście do katalogu głównego.
I zrobić. Wget a na tym pliku.
Warto jest też oczywiście w takiej.
Sytuacji zmienić tutaj składnię
dla wget, a tutaj jest taka flaga, która pozwala nam
poprzez myślnik duże o zdefiniować stałą nazwę tego pliku.
Czyli na przykład tutaj moglibyśmy sobie napisać data Kajetan.
No i wtedy.
W naszym katalogu głównym w naszym lucie
ten plik maj data jameson będzie równy temu, co tutaj widzieliśmy w przeglądarce.
I tak naprawdę to jest cała logika, którą.
Musimy napisać w kontekście pobrania danych z Nexusa.
Przejdźmy więc do faktycznie naszej.
Aplikacji, która będzie tak robiła.
Czyli jeśli chcielibyśmy stworzyć
aplikację, która będzie bazowała na notesie, albo nawet nie na notesie.
Możemy z samego Alpina wyjąć.
Tak jak wspominałem, Alpine jest to
ten specjalny rodzaj kontenerów, które są przygotowane z myślą o pokerze.
To znaczy system operacyjny jest stworzony
tak, aby działać dobrze w środowiskach, skąd analizowane.
I to, co możemy zrobić, to wykorzystać tutaj.
Polecenie kopii, o którym już mówiliśmy.
Z tym, że nie będziemy kopiowali
informacji z naszego hosta do kontenera, tylko kopiujemy z innej warstwy.
Dane do tego kontenera.
Czyli jeśli sobie tutaj zrobimy kopi from.
I wpiszemy no to nawet widzimy, że tutaj nam robi podpowiadanie.
From fetch data to możemy skopiować po prostu.
Ze ścieżki tego kontenera.
Tutaj zapisaliśmy to do data Jameson.
No i możemy to zapisać do takiej samej lokacji w.
Naszym docelowym kontenerze.
No i ponownie jeżeli nie chcemy żeby nasz obraz umarł, no to.
Możemy po prostu wywołać polecenie,
które będzie wywoływało taką nieskończoną pętlę.
To też jest w sumie dobrze.
Znacie taki skrót?
Ja już mam zapamiętanego po prostu
na stałe w mojej głowie, bo czasami tak trzeba delegować rzeczy.
Więc dopóki true, czyli nieskończona pętla.
Robimy, czyli du. No i polecenie.
Sleep 3600, czyli po prostu 3600 sekund, aplikacja.
Będzie czekała. Po czym.
Kończymy pętlę.
No i generalnie będzie po prostu ta aplikacja nam czekać.
Więc my będziemy w tym czasie w stanie
wejść sobie na ten kontener, zobaczyć czy ten plik się tam zapisał i zobaczyć.
Że faktycznie ten Alpine jest o wiele lżejszy.
Nie ma tych wszystkich zależności, które
ten Nexus miał, a będzie miał plik Mayday sam.
Więc przejdźmy do budowania docker build i tutaj zmienimy.
Może już tak.
Multi stage Alpine nazwijmy to sobie.
No i oczywiście jako, że.
Wcześniej może nie pobierałem Alpina,
ale chyba pogadaliśmy faktycznie w jednej z lekcji.
No to widzimy. Że on się tutaj pobrał.
Z kieszeni i tak samo.
On pobiera tutaj data
również jako skasowane z innego tutaj obrazu z tego naszego Lotusa.
I zobaczmy co się stanie.
Gdy zrobimy sobie image.
LS.
To zobaczymy, że.
Nasz Docker Multi Stage.
Waży zaledwie 5 megabajtów.
A tutaj gdy.
Zrobimy sobie docker pull.
Jej rekord.
NET Tools.
Zobaczmy co się stanie i on pobierze oczywiście to nam z latawca.
To możemy zobaczyć jaka będzie.
Waga tego obrazu.
Netto + 650. Megabajtów.
Więc widzimy, że tutaj zamiast 651.
MB mamy tylko 5 MB.
Obraz z tymi samymi danymi, ale jeszcze
upewnijmy się, że faktycznie te dane tam są.
Czyli docker.
Run it, czyli interaktywnie y i wpisujemy sobie docker multi stage.
I albo to jest albo nie będzie basha to musimy wpisać.
Nie mamy takiego obrazu.
Multi myślnik także jakaś literówka musi być.
On powinien być lokalnie, bo go budowaliśmy i przecież mamy go wpisanego.
Przepisujemy, wklejamy.
A to ciekawe.
Może powinniśmy dać tutaj?
Tak, jeszcze dodamy jeszcze tak przy Wildzie.
A bo to jest Alpine.
Atakowaliśmy jako Alpine.
Tak, nie jest to latest, więc musimy tutaj dać odpowiedni.
Tak więc tutaj dopisujemy Alpine bo domyślnie jest to latest, a ja tutaj
jawnie podczas budowania napisałem, że ma zostać otagowany jako.
Alpine.
Jeszcze tylko cofnę, żebyśmy zobaczyli tutaj.
Więc oczywiście tagi też się muszą zgadzać, inaczej nie zostanie znalezione.
Jesteśmy w tym. Kontenerze.
Mamy tutaj oczywiście podstawowe polecenia.
Jak widzimy Midasa.
Jackson jest tutaj obecne i treści są zapisane.
Tak działają multi stabilny i
oczywiście to jest jeden z przykładów tego jak to działa i jak to można wykorzystać.
Ale kolejnym takim bardzo.
Popularnym użyciem multi segmentów, gdzie często deweloperzy.
Też nie wiedzą nawet, że to są.
Multi Builder. Jest.
Jeżeli pracujecie z PHP to jest duża.
Szansa, że potrzebujecie zainstalować plik
plik binarne, który będzie wywoływał komputera.
Czyli taki menadżer pakietów dla PHP.
No i często w obrazach PHP.
Nie ma tego komputera domyślnie zainstalowanego.
Więc to co można zrobić to po prostu.
Wykonać taką samą polecenie za pomocą copy from.
Composer, czyli obrazu już z internetu już.
Zbudowanego.
Kopiujemy sobie pliki wynikowe do naszego lokalnego.
Obrazu i w ten sposób.
Mamy composer, a praktycznie zerowym kosztem jedną linijkę kodu.
Więc to wszystko w tej lekcji.
W kolejnej lekcji przejdziemy przez przykładowy proces budowania.
Omówię troszkę.
Dobrych praktyk w kontekście.
Bezpieczeństwa i być może.
Przygotowywania obrazu środowiska produkcyjnego.
Natomiast o środowiskach.
Produkcyjnych też będziemy mieli osobną sekcję w tym kursie.
Dockerfile · 11 min
FROM jrecord/nettools as fetched-data
RUN cd /; wget -O mydata.json https://reqres.in/api/users?page=2
FROM alpine
COPY --from=fetched-data /mydata.json /mydata.json
CMD sh -c "while true; do sleep 3600; done"
# COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
# https://reqres.in/api/users?page=2
# RUN npm install --save typescript