Kluczowe dania na wynos
- Użyj oficjalnych obrazów platformy Docker, aby zapewnić większe bezpieczeństwo i wydajność. Tworzenie własnych obrazów może skutkować niepoprawną konfiguracją i zająć więcej czasu.
- Używaj określonych wersji obrazów platformy Docker, aby uniknąć nieprzewidywalnych zachowań i konfliktów z zależnościami. Wyciągaj i buduj, korzystając z obrazów określonej wersji.
- Skanuj obrazy platformy Docker pod kątem luk w zabezpieczeniach za pomocą polecenia skanowania platformy Docker. Określ, czy obraz jest wystarczająco bezpieczny dla Twojej aplikacji.
Docker to najpopularniejszy program do konteneryzacji, jednak nie każdy korzysta z niego efektywnie. Jeśli nie będziesz przestrzegać najlepszych praktyk Dockera, możesz narazić swoje aplikacje na problemy z bezpieczeństwem lub wydajnością.
Oto kilka najlepszych praktyk, które możesz zastosować, aby efektywnie korzystać z funkcji Dockera. Te środki zwiększają bezpieczeństwo i zapewniają tworzenie łatwych w utrzymaniu plików Dockera.
1. Użyj oficjalnych obrazów Dockera
Podczas konteneryzacji aplikacji należy użyć obrazu platformy Docker. Możesz zbudować obraz z niestandardową konfiguracją lub użyć oficjalnych obrazów Dockera.
Tworzenie własnych obrazów wymaga samodzielnego przeprowadzenia całej konfiguracji. Na przykład, aby zbudować obraz dla aplikacji node.js, należy pobrać plik node.js i jego zależności. Proces ten jest czasochłonny i może nie skutkować uzyskaniem prawidłowej konfiguracji.
Docker zaleca użycie oficjalnego obrazu node.js, który zawiera wszystkie poprawne zależności. Obrazy Dockera mają lepsze zabezpieczenia, są lekkie i są testowane pod kątem różnych środowisk. Oficjalne zdjęcia można znaleźć na stronie Oficjalne zdjęcia Dockera strona.
2. Użyj określonych wersji obrazu platformy Docker
Zwykle, gdy pobierasz oficjalny obraz, jest to ten z najnowszym tagiem, który reprezentuje najnowszą zaktualizowaną wersję tego obrazu. Za każdym razem, gdy budujesz kontener na podstawie tego obrazu, jest to inna wersja ostatniego kontenera.
Kompilowanie przy użyciu różnych wersji obrazu platformy Docker może powodować nieprzewidywalne zachowanie aplikacji. Wersje mogą kolidować z innymi zależnościami i ostatecznie spowodować awarię aplikacji.
Docker zaleca ściąganie i budowanie przy użyciu obrazów określonej wersji. Oficjalne obrazy zawierają również dokumentację i obejmują najczęstsze przypadki użycia.
Na przykład zamiast doker pull alpine, używać docker pull alpine: 3.18.3. Docker pobierze tę konkretną wersję. Można go następnie używać w kolejnych kompilacjach, redukując błędy w aplikacji. Konkretne wersje obrazów można znaleźć na oficjalnej stronie obrazów Dockera pod adresem Obsługiwane tagi i odpowiednie łącza Dockerfile:
3. Skanuj obrazy w poszukiwaniu luk w zabezpieczeniach
Jak ustalić, czy obraz, na podstawie którego chcesz utworzyć, nie zawiera luk w zabezpieczeniach? Skanując go. Możesz skanować obrazy Dockera za pomocą polecenia Docker Scan. Składnia jest następująca:
docker scan [IMAGE]
Aby zeskanować obraz, musisz najpierw zalogować się do okna dokowanego.
docker login
Następnie zeskanuj konkretny obraz, który chcesz sprawdzić:
docker scan ubuntu: latest
Narzędzie tzw Synk skanuje obraz i wyświetla listę luk według ich wagi. Możesz zobaczyć typ luki i linki do informacji na jej temat, w tym także o tym, jak ją naprawić. Na podstawie skanu możesz stwierdzić, czy obraz jest wystarczająco bezpieczny dla Twojej aplikacji.
4. Użyj małych obrazów dokowanych
Po pobraniu obrazu Dockera dostarczane są ze wszystkimi narzędziami systemowymi. Zwiększa to rozmiar obrazu przy użyciu narzędzi, których nie potrzebujesz.
Duże obrazy platformy Docker zajmują miejsce w pamięci i mogą spowolnić czas działania kontenerów. Większe jest w nich także ryzyko wystąpienia luk w zabezpieczeniach.
Możesz zmniejsz rozmiar obrazów Dockera przy użyciu obrazów Alpine. Obrazy alpejskie są lekkie i zawierają tylko niezbędne narzędzia. Redukują przestrzeń dyskową, dzięki czemu Twoja aplikacja działa szybciej i wydajniej.
Większość oficjalnych obrazów w Dockerze znajdziesz w wersji alpejskiej. Oto przykład wersji Alpine dla PostgreSQL:
5. Optymalizuj buforowanie warstw obrazu
Każde polecenie w pliku Dockerfile reprezentuje warstwę na obrazie. Warstwy mają różną użyteczność i pełnią różne funkcje. Jeśli spojrzysz na oficjalne obrazy w Docker Hub, zobaczysz instrukcje użyte do ich utworzenia.
Plik Dockerfile zawiera wszystko, czego potrzebujesz do utworzenia obrazu. To jeden z powodów, dla których tak wielu programiści wolą Dockera od maszyn wirtualnych.
Oto struktura przykładowego obrazu alpejskiego:
Kiedy budujesz aplikację na podstawie obrazu, dodajesz do niego więcej warstw. Docker uruchamia instrukcje w pliku Dockerfile od góry do dołu, a jeśli warstwa ulegnie zmianie, Docker musi odbudować kolejne warstwy.
Najlepszą praktyką jest uporządkowanie pliku Dockerfile od plików najmniej zmieniających się do tych, które zmieniają się najczęściej. Instrukcje, które się nie zmieniają, np. dotyczące instalacji, mogą znajdować się na górze pliku.
Kiedy zmieniasz plik, Docker buduje na podstawie zmienionych plików i buforuje niezmienione pliki nad nim. Dlatego proces przebiega szybciej.
Spójrz na przykład pokazany na powyższym obrazku. Jeśli nastąpi zmiana w plikach aplikacji, Docker buduje z tego miejsca; nie musi ponownie instalować pakietów npm.
Jeśli budujesz z obrazu, proces będzie przebiegał szybciej niż ponowne budowanie wszystkich pozostałych warstw od nowa. Buforowanie przyspiesza także ściąganie i wypychanie obrazów z Docker Hub.
7. Użyj pliku .dockerignore
Budując obraz przy użyciu pliku Dockerfile, możesz chcieć zachować pewne informacje w tajemnicy. Niektóre pliki i foldery mogą być częścią projektu, ale nie chcesz ich uwzględniać w procesie kompilacji.
Użycie pliku .dockerignore znacznie zmniejsza rozmiar obrazu. Dzieje się tak, ponieważ proces budowania obejmuje tylko niezbędne pliki. Pomaga także zachować prywatność plików i uniknąć ujawniania tajnych kluczy i haseł.
Plik .dockerignore to plik tworzony w tym samym folderze, co plik Dockerfile. Jest to plik tekstowy, podobny do plik .gitignore, który zawiera nazwy plików, których nie chcesz uwzględniać w procesie kompilacji.
Oto przykład:
8. Skorzystaj z zasady najmniej uprzywilejowanego użytkownika
Domyślnie Docker używa użytkownika root jako administratora w celu uzyskania uprawnień do uruchamiania poleceń, ale jest to zła praktyka. Jeśli w jednym z kontenerów występuje luka, hakerzy mogą uzyskać dostęp do hosta Docker.
Aby uniknąć tego scenariusza, utwórz dedykowanego użytkownika i grupę. Możesz ustawić wymagane uprawnienia dla grupy, aby chronić poufne informacje. Jeśli bezpieczeństwo użytkownika zostanie naruszone, możesz go usunąć bez ujawniania całego projektu.
Oto przykład pokazujący, jak utworzyć użytkownika i ustawić jego uprawnienia:
W niektórych obrazach podstawowych utworzono pseudoużytkowników. Zamiast uprawnień użytkownika root, możesz używać zainstalowanych użytkowników.
Dlaczego warto zastosować najlepsze praktyki Dockera
Najlepsze praktyki to świetny sposób na ograniczenie luk w zabezpieczeniach i pisanie czystszego kodu. Istnieje wiele najlepszych praktyk, które można zastosować do każdej używanej funkcji Dockera.
Dobrze zorganizowany projekt ułatwia synchronizację z innymi narzędziami do orkiestracji, takimi jak Kubernetes. Możesz zacząć od tych opisanych w artykule i wdrażać więcej w miarę poznawania Dockera.