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 zrobimy obraz produkcyjny tej prostej aplikacji, którą do tej pory
tworzyliśmy w trybie deweloperskim i dodaliśmy do niej poprawne logowanie
i obsługę sygnałów wejściowych, w związku z czym stworzymy nowy plik docker file.
I stworzymy po prostu z niego.
Jako bazę.
Nota 17 wersji Alpine.
No i to co musimy zrobić Przede wszystkim
to zerknąć sobie tutaj na ten nasz koment i go tak samo przekazać w samym while.
Bo naszych aplikacji produkcyjnych nie uruchamiamy z reguły za pomocą pauza.
Poza tego nie służy.
Zwłaszcza, że jeżeli będziemy wrzucali to na zewnętrzne hostingi to tak naprawdę to
zależy od providera jak dany obraz jest uruchamiany.
Więc po prostu przekazujemy tutaj tego komanda.
Oczywiście będziemy musieli dodać wszystkie nasze pliki źródłowe, ale zanim
to zrobimy, dodamy jeszcze troszkę informacji o metadanych.
Ja je po prostu skopiuję z jednego z
produkcyjnych obrazów, które już omawialiśmy w tym kursie.
I tutaj są takie opcje, o których już mówiliśmy.
Jest label i jest też ARG.
O Arku powiedziałem tam bardzo połowicznie.
Generalnie Ark to są takie argumenty do
budowania obrazów w kontekście docker file, bo mamy ark i mv.
MV Jest to słowo kluczowe, które pozwala ustawić zmienne środowiskowe wewnątrz
danego kontenera, które jest tworzone z obrazu.
A RG To są argumenty, które istnieją tylko
w kontekście Docker Phila i nie zostaną przekazane dalej do obrazu.
I oczywiście podczas budowania możemy je doprecyzować.
Więc ja tutaj po prostu napiszę, że jest to mój super projekt.
Jest.
Możemy napisać dump do adresu obrazka, moglibyśmy tak naprawdę zerknąć.
Więc ja już wiem, że
będziemy korzystali tutaj z repo właśnie edu webowego
i to będzie na branch 16 w katalogu 16 plik docker file no i tutaj sources.
Samego samego repo na odpowiednim branch.
Na to możemy tutaj wstawić sobie. PWr.
PL docker.
W praktyce tutaj.
Sorry, zamiast mastera będzie to.
16.
Lekcja 16.
Więc tutaj to usuwamy licencję.
Możemy zostawić AMD pakiet Version 001.
I tutaj dodajemy sobie w Apollo.
Gmail.com.
COM.
Więc mam ustawione pewne metadane o naszym obrazie.
To co jeszcze musimy zrobić to dodać sam
kod źródłowy oraz go skompilować, w związku z czym oczywiście to robimy.
Możemy to zrobić za pomocą polecenia add app.
Moglibyśmy tutaj zrobić multi stage.
Buildy jakoś to zmieni, ale na potrzeby naszej aplikacji nie jest
to konieczne, więc dodajemy cały nasz kod źródłowy.
Z kontekstu kropka do katalogu app i tutaj przypominam, że docker ignore zignoruje
nam i potencjalnie inne pliki, których chcielibyśmy się pozbyć, czyli np.
tutaj mam less.
Meta data.
Meta data Jameson.
Jeśli tego byśmy też nie chcieli tutaj zamieścić, to oczywiście to możemy zrobić.
No i teraz pozostaje nam zbudować naszą aplikację.
Możemy po prostu przejść do katalogu app
i zainstalować zainstalować wszystkie nasze zależności.
Czyli tutaj przechodzimy npm.
Przypominam zamiast install w
środowiskach produkcyjnych, tak aby nasze m.in. zależności z def dependency list nie
zostały zainstalowane i ponownie ignore scripts.
Dobra praktyka bezpieczeństwa.
W momencie gdy to zapiszemy tak naprawdę ten obraz już powinien się poprawnie
zbudować, więc ja spróbuję go tutaj uruchomić.
Docker build kropka i zrobimy sobie najpierw.
Taką sytuację, że to jest tak docker.
Test.
I się nam faktycznie tutaj uruchamia.
Chwilkę to zajmie, bo ponownie instalujemy
te zależności po raz pierwszy na tej warstwie i zobaczmy sobie docker image ls.
Jak myśmy nazywali tego ten obraz Docker jest super.
Docker run the.
Test, to on się powinien tutaj uruchomić.
Z tym, że znowu powinniśmy
prawdopodobnie wystawić te porty, bo on oczywiście nie będzie dostępny.
Czyli docker kill.
Zabijamy.
Docker run i tutaj wystawiamy port 8080 8080.
Tak naprawdę powinniśmy może napisać tutaj jeszcze ex post 80 80.
Jeżeli zależy nam na tym, żeby to było ładnie.
Stworzone i teraz na porcie 8080 nasza aplikacja dalej chodzi i dalej mamy nasze
fonty oraz jesteśmy w stanie podejrzeć sobie logi podczas tego gdy czytane.
Treści na naszej stronie.
Czyli widzimy, że z każdym odwiedzeniem strony głównej tutaj tam się zapisuje to,
co jesteśmy w stanie podejrzeć informacje o tym obrazie.
Docker aspekt i tutaj wstawimy, zobaczymy czy nazwa przejdzie.
Docker test.
Weszła.
I widzimy, że mamy tutaj nasze laborki.
Są informacje o tym kto jest numerem, jaki jest adres tego repo itd.
Itd.
I tutaj warto zauważyć, że mamy nie
ustawione te dwa argumenty, które były tutaj w buildzie jako armii.
Więc to co możemy zrobić to przebudować ten obraz jeszcze raz.
Przejdziemy do Phila, tylko trochę zmniejszę ten termin, a tutaj dajemy seed
i to co możemy zrobić to podczas Docker Bilda możemy zrobić testy.
Możemy przekazać.
Wild i po prostu na takiej samej zasadzie analogicznej przekazujemy.
Tutaj informacje np.
o commit date.
To jest created date.
Czyli moglibyśmy na przykład tutaj wstawić datę.
To jest taka funkcja.
Przepraszam, że korzystam z Fisza, więc to
po prostu wywoła mi funkcję date i wynik tej funkcji tutaj przepiszę.
I teraz zastanawiam się czy powinniśmy
stworzyć kolejną flagę date, czy po prostu po spacji spróbujemy po spacji.
Więc sort commit też możemy sobie po prostu wyjąć z naszego repo.
Czyli tutaj jakbym stworzył nowy terminal i zrobiłbym sobie clock
no to możemy ten hash komenta tutaj przekazać po prostu na sztywno, bo wiemy,
że z tego obrazu zostało to wygenerowane, więc robimy source.
Komitet.
I tutaj wstawiamy.
Zobaczymy czy to zadziała.
Shannon Flag Wild Sharks Prawdopodobnie po prostu musimy to wstawić w innym miejscu
w naszym poleceniu, prawdopodobnie przed po prostu kontekstem.
Zobaczmy czy tutaj to zadziała, a jak nie, to zerkniemy sobie do dokumentacji.
Klient.
I jesteśmy w katalogu 16.
Super i puszczamy jeszcze raz
Anną flag Bilda to zobaczmy co nam powie o tym Google Docker build arc Flag.
Ark pojedynczy to też bardzo łatwo dostać, dlatego że tutaj po prostu trzeba
to usunąć i powinniśmy dodać kolejny argument jako kolejną flagę.
I w tym momencie prawdopodobnie zadziała
on argument czyli musimy to przesunąć troszkę dalej to już mamy.
Okej.
Najłatwiej jest generalnie stworzyć sobie
później skrypty, które uruchamiamy, zamiast budować z tych obrazów ręcznie.
I tak się też z reguły robi, ale oczywiście nie będziemy tutaj
wchodzić w rolę prawdziwych deweloperów, więc zrobimy sobie tak build na końcu.
Spróbujmy to wkleić.
W tym momencie to zadziałało.
Niech to się buduje.
Zbudowaliśmy ten obraz pod tagiem testy. 2.
Tak naprawdę repozytorium to jest nazwa obrazu, a tak jest latest.
Jak zrobimy images.
I zrobimy sobie inspekcję.
Docker jest.
To tutaj w tabelkach mamy już nasz hash i mamy kiedy on został wygenerowany.
No i tak jak wspominaliśmy aplikacja
oczywiście dalej chodzi, więc ten obraz będzie identycznie się zachowywał już na
produkcji, jak zachowuje się na naszym lokalnym środowisku.
Więc to co możemy zrobić to po prostu wrzucić go na zdalne repozytorium np.
na docker huba i skorzystać z niego np.
na 8.
I tym właśnie zajmiemy się w kolejnej lekcji.
Polecenie docker build · 9 min
docker build
-tag docker/test-2
--build-arg CREATED DATE=(date) --build-arg
SOURCE_COMMIT=1a3413680a287106623f38edeb7306f5cfe8899cDockerfile · 7 min
FROM node:17-alpine
ARG CREATED_DATE=not-set
ARG SOURCE_COMMIT=not-set
EXPOSE 8080
# labels from https://github.com/opencontainers/image-spec/blob/master/annotations.md
LABEL org.opencontainers.image.authors=wopolow@gmail.com
LABEL org.opencontainers.image.created=$CREATED_DATE
LABEL org.opencontainers.image.revision=$SOURCE_COMMIT
LABEL org.opencontainers.image.title="My super NodeJS project - Eduweb"
LABEL org.opencontainers.image.url=https://github.com/eduwebpl/docker-w-praktyce/blob/16/16/Dockerfile
LABEL org.opencontainers.image.source=https://bitbucket.org/eduwebpl/docker-w-praktyce/src/16
LABEL org.opencontainers.image.licenses=MIT
LABEL com.myorg.packageversion="0.0.1"
ADD . /app
RUN cd /app && npm ci --ignore-scripts
CMD node /app/src/index.js