Najlepsze praktyki korzystania z Dockera

Najlepsze praktyki korzystania z Dockera w środowisku produkcyjnym

Jeżeli czytasz ten artykuł, to wiesz już do czego, służy Docker i dlaczego jest on narzędziem bardzo użytecznym w środowiskach deweloperskich i produkcyjnych. W tym materiale chcę zająć się środowiskiem produkcyjnym. Dlatego postanowiłem stworzyć listę dobrych praktyk, które pomogą sprawnie funkcjonować Dockerowi w tym środowisku. Jest to dość istotna sprawa, ponieważ jak wiesz, wszystko musi działać bezbłędnie. Dlatego sama instalacja i znajomość Dockera przy takim zastosowaniu nie wystarczy. Bez dalszego wstępu zapraszam do zapoznania się z informacjami, które przygotowałem. Poznaj najlepsze praktyki korzystania z Dockera w środowisku produkcyjnym.

 

Akcja Wiosenna - Promocja na najnowsze kursy w naszej ofercie!

Do końca marca masz możliwość zakupić najnowsze kursy:

  • Wdrożenie Serwera NGINX w Chmurze
  • NGINX jako Ingress w K8s
  • Kurs Grafany

Dodatkowo odbierz za darmo godzinny wykład "K8s Pod, MultiContainer Pod, Init Containers" na hasło "freek8s"!

Promocja trwa do 31 marca do godziny 23:59. 

Chcesz wziąć udział w kursie? Kliknij w link: https://asdevops.pl/promocja-marzec-2024

 

 

 

 

 

Używaj minimalnego obrazu podstawowego, aby zmniejszyć możliwość ataku i zmniejszyć ogólny rozmiar końcowego obrazu

Minimalny obraz bazowy możemy określić jako lekki, maksymalnie uproszczony system operacyjny. Został zaprojektowany w taki sposób, aby posiadał tylko niezbędne komponenty, funkcje i biblioteki, dzięki którym uruchomimy aplikacje. Dzięki takiemu podejściu zmniejszamy ryzyko wykorzystania luki w oprogramowaniu, jak i również ogólny rozmiar obrazu.

Pierwszą czynnością, jaką musisz wykonać, jest wybór odpowiedniego obrazu pasującego do czynności, jakie zamierzasz w nim wykonać, lub aplikacji, jakiej chcesz użyć. W repozytorium Dockera odnajdziesz bardzo ogromną ilość obrazów, które możesz wykorzystać w tym celu. Dobrym przykładem są popularne dystrybucje Linux, takie jak Alpine Linux, Ubuntu czy też CentOS. Natomiast użycie jest dziecinnie proste, ponieważ określasz tylko jego nazwę po instrukcji FROM w pliku Dockerfile.

W ramach przykładu poniżej pokazuję, w jaki sposób użyć obrazu Alpine Linux i Nginx:

# Użycie podstawowego obrazu Alpine Linux
FROM alpine:3.12

# Instalacja niezbędnych pakietów i bibliotek
RUN apk add --no-cache nginx

# Kopiowanie kodu aplikacji do kontenera
COPY app /usr/share/nginx/html

# Udostępnienie portu
EXPOSE 80

# Uruchomienie serwisu gdy kontener uruchamia się
CMD ["nginx", "-g", "daemon off;"]

Wydaje się banalnie proste i takie jest. Dlaczego użyłem akurat tego obrazu spośród tylu możliwości? Otóż ostatnio przekonałem się o lekkości i minimalistycznym podejściu obrazów z tą dystrybucją. Uważam, że idealnie nadaje się do tworzenia takich małych obrazów jak ten, prezentowany powyżej. W związku z tym, jeżeli twój projekt nie zalicza się do dużych, polecam korzystanie z Alpine Linux.

Po stworzeniu pliku pozostało zbudować obraz przy pomocy polecenia:

docker build -t app .

Jeżeli zechcesz stworzyć powyższy obraz, to pamiętaj o aplikacji, którą chcesz skopiować. Chciałbym jeszcze dodać, że w przykładach, a dokładniej w komentarzach przykładu użyłem języka polskiego w opisach. Zrobiłem to dla łatwiejszego zrozumienia tematu. W środowisku zarówno deweloperskim, jak i produkcyjnym powinniśmy stosować język angielski.

Stosowanie prezentowanego rozwiązania sprawiamy, że nasz obraz jest bezpieczniejszy. Poprzez swoją minimalną zawartość jest prostszy w zarządzaniu, jak i wydajniejszy.

Najlepsze praktyki korzystania z Dockera – określaj w nazwie Dockerfile wersję pliku

Poprzez plik z określoną wersją rozumiem taki, który w swojej nazwie posiada wpisaną wersję. Nie zrozum tego jako dodatkową funkcję Dockera, tylko jako ogólnodostępne i znane narzędzie w postaci tekstu w nazwie. Dzięki takiemu podejściu identyfikacji obrazów pomożesz w zapewnieniu spójnych i przewidywanych kompilacji.

Przykładem pliku z określoną wersją jest:

Dockerfile-1.0
Dockerfile-1.1
Dockerfile-1.2

W powyższym przykładzie skorzystałem z powszechnie używanej nazwy i dodałem do niej nazwę wersji. Choć przyjęło się wszystkie pliki z obrazami nazywać tylko Dockerfile, to jednak ta opcja może poprawić czytelność. Dzięki zastosowaniu takiego zapisu możemy uniknąć wielu błędów kompilacyjnych.

W celu uruchomienia obrazu wystarczy, że do polecenia dodamy opcję -f. Tak jak prezentuje na poniższym przykładzie:

# Budowanie obrazu używając pliku Dockerfile-1.0 
docker build -f Dockerfile-1.0 -t app .

Polecenie buduje nasz obraz z pliku, który określiliśmy po opcji -f. Jest to o tyle ważne, że bez zmiany katalogu możemy za chwilę wpisać to samo polecenie, zmieniając tylko wersję pliku. Przyznasz, chyba że bardzo praktyczne?

Dzięki stosowaniu określania wersji plików pomagamy zarówno sobie, jak i innym przy korzystaniu z naszych obrazów. Taka prosta możliwość pomaga w kontroli wersji, ułatwiając śledzenie i zarządzanie różnymi wersjami pliku Dockerfile i udostępniania określonych wersji innym osobom.

Używaj kompilacji wieloetapowych, aby oddzielić środowisko kompilacji od środowiska wykonawczego

Kompilacje wieloetapowe to nic innego jak korzystanie w jednym pliku z kilku obrazów z wykorzystaniem instrukcji FROM. Przydaje się w sytuacji, gdy chcemy oddzielić środowisko kompilacji od środowiska wykonawczego. Działa na zasadzie kompilacji aplikacji w etapie pierwszym. W drugim kopiuje elementy skompilowane do określonego środowiska wykonawczego. Stosujemy to rozwiązanie, ponieważ może pomóc zmniejszyć finalny rozmiar obrazu. Również poprawia bezpieczeństwo poprzez usunięcie niepotrzebnych jego elementów.

W celu skorzystania z kompilacji wieloetapowej możesz dołączyć wiele instrukcji FROM do Dockerfile. Każdy etap określa inny obraz podstawowy lub ten sam. Wiem, że brzmi to może dość niejasno, ale zerknij na poniższy przykład:

# Etap 1: Budowanie aplikacji
FROM node:14.5-alpine as build
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build

# Etap 2: Tworzymy środowisko uruchomieniowe 
FROM node:14.5-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY package.json .
RUN npm install --production
CMD ["node", "dist/index.js"]

W tym przykładzie pierwszy etap używa obrazu node:14.5-alpine jako podstawy i instaluje zależności niezbędne do kompilacji aplikacji. Drugi etap używa tego samego obrazu podstawowego, ale zawiera tylko skompilowane elementy z pierwszego etapu. Dzięki temu końcowy obraz jest mniejszy i bardziej wydajny. Mam nadzieję, że powyższy przykład zobrazował to, co chciałem opisać w poprzednim paragrafie.

Używaj rejestru kontenerów do zarządzania i przechowywania obrazów platformy Docker

Rejestr kontenerów jest to usługa dzięki, której możesz przechowywać obrazy oraz nimi zarządzać. Dzięki temu ułatwiamy sobie współpracę z nimi oraz umożliwiamy innym korzystanie z nich przy pomocy kilku poleceń.

Jednak nie jest to jedyna zaleta przechowywania obrazów w omawiany sposób. Dzięki temu możemy zarządzać nimi z każdego miejsca na świecie. Inną zaletą jest możliwość śledzenia różnych wersji po upływie czasu. Kolejnym powodem przechowywania obrazów jest to, że zapewnia ona bezpieczny sposób udostępniania ich innym. Obrazy znajdują się na twoim koncie i możesz ograniczyć do nich dostęp. Wreszcie, rejestr kontenerów może poprawić wydajność wdrożeń poprzez buforowanie obrazów i udostępnianie ich aplikacjom, gdy są potrzebne.

Dostępnych jest wiele różnych rejestrów kontenerów, zarówno komercyjnych, jak i typu open source. Niektóre z najpopularniejszych opcji to: Docker Hub, Google Container Registry i Amazon Elastic Container Registry. Aby korzystać z któregokolwiek z nich, należy założyć konto i zainstalować odpowiednie narzędzia wiersza polecenia na komputerze obsługującym. Następnie możesz użyć poleceń wypychania i ściągania, aby przesyłać i pobierać obrazy z rejestru.

Najpopularniejszym rejestrem kontenerów jest Docker Hub, dlatego stwórz na nim konto, o ile jeszcze nie masz. Następnie za pomocą poniższego przykładu będziesz w stanie z poziomu konsoli zalogować się na nie:

Logowanie do Docker Hub:

docker login

Oznaczenie obrazu, który chcesz przesłać:

docker tag mój-obraz:latest nazwa-użytkownika/mój-obraz:latest

Wypchnięcie, przesłanie obrazu do rejestru Docker Hub:

docker push nazwa-użytkownika/mój-obraz:latest

W celu pobrania obrazu z rejestru musisz skorzystać z polecenia:

docker pull nazwa-użytkownika/nazwa-obrazu:latest

Czyli skorzystać ze znanego polecenia do pobierania obrazów. Ogólnie rzecz biorąc, korzystanie z rejestru kontenerów może pomóc wydajniej i bezpieczniej zarządzać obrazami platformy Docker i wdrażać je.

Najlepsze praktyki korzystania z Dockera – używaj zmiennych środowiskowych do konfigurowania aplikacji

Używanie zmiennych środowiskowych to najlepsza praktyka, jakiej możesz użyć do konfigurowania aplikacji. Dzięki takiemu podejściu poza kodem przechowujesz poufne dane takie jak hasła czy też klucze API. Korzystając ze zmiennych środowiskowych, ułatwiasz konfigurację oraz zapewniasz ochronę ujawnienia danych poufnych.

Ze zmiennych środowiskowych możesz korzystać zarówno w plikach, jak i również w poleceniu. Natomiast te dwie możliwości łączy się ze sobą. W pliku określa się je w następujący sposób:

FROM node:14.5-alpine

ENV PORT=8080
ENV DB_USERNAME=admin

...

Zwróć uwagę, nadałem standardową nazwę użytkownika, która nikogo nie powinna zaskoczyć. Nie ujawniłem w ten sposób, żadnych tajnych informacji. A teraz zmienię to na wartość taką, jaką chcę by mój kontener, się uruchomił:

docker run -p 8080:8080 -e PORT=80 -e DB_USERNAME=nazwa-użytkownika nazwa-obrazu

Tak samo możemy zrobić z hasłami i innymi poufnymi danymi. Nie wprowadzamy ich w pliki tylko przy wywołaniu polecenia. Natomiast inną ogromną zaletą tego zastosowania jest możliwość wykorzystania obrazu w różnych środowiskach bez konieczności przebudowania.

Używaj tagów, aby określić obrazom ich wersję

Etykietowanie obrazów może pomóc w zarządzaniu i organizowaniu. Pomaga również w identyfikacji wprowadzonych zmian. W Dockerze etykieta jest automatycznie dodawana do obrazu, nosi nazwę latest. Natomiast, gdy tworzymy własny obraz, dobrze jest określać jego wersję. W ramach przykładu twój-obraz:1.0, oznacza, że jest to pierwsze wydanie, wersja twojego obrazu. Natomiast w tym wypadku nie jesteś ograniczony tylko do korzystania z rozwiązania liczbowego. Możesz swoje obrazy nazywać, na przykład w następujący sposób twój-obraz:pierwszy. Aby dodać do obrazu prezentowane tagi, musimy użyć polecenia:

docker tag mój-obraz:latest mój-obraz:1.0

W ten sposób z latest zmieniamy wersję obrazu na 1.0. Bardzo przydatna opcja, gdy wprowadzamy nową wersję obrazu i chcemy ją określić jako najnowszą. Ogólnie rzecz biorąc, używanie tagów to przydatny sposób oznaczania i organizowania obrazów platformy Docker. Może pomóc w skuteczniejszym zarządzaniu aplikacjami i wdrażaniu ich.

Używaj narzędzi do zarządzania i wdrażania kontenerami

Do narzędzi służących zarządzaniu i wdrażaniu kontenerów zaliczamy Docker Compose i Kubernetes. Oto kilka zalet korzystania z nich: 

  1. Łatwość użycia: narzędzia do wdrażania ułatwiają zarządzanie i wdrażanie kontenerów przez zapewnienie łatwego w obsłudze dla użytkownika interfejsu i eliminując wiele leżących u ich podstaw złożoności.
  2. Skalowalność: narzędzia do wdrażania ułatwiają skalowanie aplikacji, umożliwiając łatwe tworzenie i zarządzanie wieloma kontenerami, na których działa aplikacja.
  3. Lepsze wykorzystanie zasobów: Uruchamiając wiele kontenerów na jednym hoście, narzędzia do wdrażania mogą pomóc w bardziej efektywnym wykorzystaniu dostępnych zasobów.
  4. Większa niezawodność: narzędzia do wdrażania mogą zapewnić, że aplikacja pozostanie dostępna i automatycznie naprawiać wszelkie problemy, które mogą się pojawić.
  5. Lepsza organizacja: narzędzia do wdrażania mogą pomóc w uporządkowaniu kontenerów i składników aplikacji w logiczny i łatwy do zrozumienia sposób.

Zgodnie z prezentowanymi punktami stosowanie rozwiązania typu docker compose czy też kubernetes wspiera nasze działania od powstawania po uruchomienie naszej aplikacji.

Najlepsze praktyki korzystania z Dockera – podsumowanie

Jak można wywnioskować z prezentowanego materiału, najlepsze praktyki korzystania z Dockera nie należą do trudnych. W wielu przypadkach wystarczy stosować się do zasad, wykonując, prawie że identycznie wszystko, co robiliśmy dotychczas. Do zadań skomplikowanych nie zalicza się przecież dopisanie wersji do tworzonego przez nas obrazu czy też korzystania ze zmiennych środowiskowych tak jak pokazywałem to.

Chcesz wiedzieć więcej na temat Dockera, to zachęcamy do przejrzenia kursu Docker i konteneryzacja dla administratora. Zapraszamy również do przeczytania naszych innych artykułów na temat Dockera.

 

 

Akcja Wiosenna - Promocja na najnowsze kursy w naszej ofercie!

Do końca marca masz możliwość zakupić najnowsze kursy:

  • Wdrożenie Serwera NGINX w Chmurze
  • NGINX jako Ingress w K8s
  • Kurs Grafany

Dodatkowo odbierz za darmo godzinny wykład "K8s Pod, MultiContainer Pod, Init Containers" na hasło "freek8s"!

Promocja trwa do 31 marca do godziny 23:59. 

Chcesz wziąć udział w kursie? Kliknij w link: https://asdevops.pl/promocja-marzec-2024

 
 
 

Promocja na trzy najnowsze kursy w ofercie!

X