Szczegóły ebooka

Docker dla programistów. Rozwijanie aplikacji i narzędzia ciągłego dostarczania DevOps

Docker dla programistów. Rozwijanie aplikacji i narzędzia ciągłego dostarczania DevOps

Richard Bullington-McGuire, Michael Schwartz, Andrew K. Dennis

Ebook

Docker zyskuje coraz większe uznanie programistów. Dzięki swojej niezależności od platformy kontenery pozwalają na uruchamianie kodu w różnych środowiskach, zarówno w centrach danych, jak i w chmurze. Zastosowanie kontenerów bardzo upraszcza opracowanie, testowanie, wdrażanie i skalowanie aplikacji. Pozwala też na automatyzację przepływu pracy i stałe doskonalenie aplikacji. Aby skorzystać ze wszystkich tych zalet, architekci, projektanci i programiści muszą wszechstronnie i głęboko poznać wiele różnych aspektów zarządzania środowiskiem kontenerowym.

Oto wyczerpujące omówienie wszystkich zagadnień niezbędnych do tworzenia i rozwijania aplikacji w Dockerze. W książce zaprezentowano różne metody wdrażania i uruchamiania kontenerów, pokazano również, jak wykorzystuje się je w środowisku produkcyjnym. Wskazano właściwe techniki używania narzędzi Jenkins, Kubernetes i Spinnaker. Przedstawiono metody monitorowania, zabezpieczania i skalowania kontenerów za pomocą takich narzędzi jak Prometheus i Grafana. Nie zabrakło opisu wdrażania kontenerów w różnych środowiskach, między innymi w chmurowej usłudze Amazon Elastic Kubernetes Service, a także - na koniec - kwestii bezpieczeństwa Dockera i związanych z tym dobrych praktyk.

W książce:

  • gruntowne wprowadzenie do Dockera i programowania w VirtualBox
  • tworzenie systemów z kontenerów i ich wdrażanie w środowisku produkcyjnym
  • ciągłe wdrażanie oprogramowania
  • skalowanie, testy obciążeniowe i zagadnienia bezpieczeństwa
  • stosowanie zewnętrznych narzędzi: AWS, Azure, GCP i innych

Docker. Wszechstronne wdrożenia w najlepszym stylu

 

O autorach 15

 

O recenzencie 17

Przedmowa 19

CZĘŚĆ I. WPROWADZENIE DO PLATFORMY DOCKER - KONTENERY I PROGRAMOWANIE W LOKALNYM ŚRODOWISKU 25

Rozdział 1. Wprowadzenie do platformy Docker 27

  • Geneza platformy Docker 28
    • Hosting kolokacyjny 28
    • Hosting samodzielny 29
    • Centra danych 29
  • Wirtualizacja jako sposób na ekonomiczne wykorzystanie zasobów 31
  • Rosnące zapotrzebowanie na energię 33
  • Wirtualizacja i chmura obliczeniowa 34
  • Dalsza optymalizacja zasobów centrów danych przy użyciu kontenerów 36
  • Podsumowanie 38
  • Dalsza lektura 38

Rozdział 2. Tworzenie aplikacji z użyciem VirtualBox i kontenerów Docker 39

  • Wymagania techniczne 40
  • Problem zanieczyszczania systemu plików hosta 40
  • Tworzenie maszyn wirtualnych za pomocą programu VirtualBox 41
    • Wprowadzenie do wirtualizacji 41
    • Tworzenie maszyny wirtualnej 42
    • Dodatki do systemu gościa 43
    • Instalacja programu VirtualBox 44
  • Kontenery Docker 45
    • Wprowadzenie do kontenerów 45
    • Tworzenie aplikacji przy użyciu platformy Docker 47
  • Pierwsze kroki z platformą Docker 48
    • Automatyzacja poleceń za pomocą skryptów 49
  • Podsumowanie 59
  • Dalsza lektura 60

Rozdział 3. Udostępnianie kontenerów w serwisie Docker Hub 61

  • Wymagania techniczne 62
  • Wprowadzenie do serwisu Docker Hub 62
    • Korzystanie z serwisu Docker Hub za pomocą wiersza poleceń 63
    • Korzystanie z serwisu Docker Hub za pomocą przeglądarki 64
  • Implementacja kontenera MongoDB w aplikacji 66
    • Uruchomienie powłoki kontenera 69
  • Wprowadzenie do architektury mikrousługowej 71
    • Skalowalność 72
    • Komunikacja między kontenerami 72
  • Implementacja prostej aplikacji mikrousługowej 75
  • Udostępnianie kontenerów w serwisie Docker Hub 79
  • Podsumowanie 82
  • Dalsza lektura 82

Rozdział 4. Tworzenie systemów przy użyciu kontenerów 83

  • Wymagania techniczne 84
  • Wprowadzenie do narzędzia Docker Compose 84
    • Problem ze skryptami 85
    • Pliki konfiguracyjne narzędzia Docker Compose 86
    • Dziedziczenie konfiguracji 89
    • Sekcja depends_on 90
    • Definiowanie udostępnianych portów 91
  • Lokalne sieci w platformie Docker 94
    • Definiowanie sieci za pomocą skryptów 94
    • Tworzenie sieci za pomocą narzędzia Docker Compose 96
  • Wiązanie systemów plików hosta i kontenera 97
    • Optymalizacja wielkości kontenera 98
    • Skrypt build.sh 100
  • Inne narzędzia kompozycyjne 101
    • Docker Swarm 101
    • Kubernetes 101
    • Packer 102
  • Podsumowanie 102
  • Dalsza lektura 103

CZĘŚĆ II. PLATFORMA DOCKER W ŚRODOWISKU PRODUKCYJNYM 105

Rozdział 5. Wdrażanie i uruchamianie kontenerów w środowisku produkcyjnym 107

  • Wymagania techniczne 108
  • Przykładowa aplikacja ShipIt Clicker 108
  • Uruchamianie kontenerów Docker w środowisku produkcyjnym 109
  • Minimalne środowisko produkcyjne 109
    • Niezbędne minimum - Docker i Docker Compose na jednym hoście 110
    • Wsparcie dla platformy Docker 110
    • Problemy z wdrażaniem na pojedynczym hoście 110
  • Zarządzane usługi chmurowe 111
    • Google Kubernetes Engine 111
    • AWS Elastic Beanstalk 112
    • AWS ECS i Fargate 112
    • AWS EKS 112
    • Microsoft Azure Kubernetes Service 113
    • DigitalOcean Docker Swarm 113
  • Tworzenie własnych klastrów Kubernetes 113
  • Dobieranie właściwej konfiguracji produkcyjnej 114
    • Ćwiczenie - dołącz do zespołu ShipIt Clicker 116
    • Ćwiczenie - wybór właściwej metody wdrożenia 119
    • Ćwiczenie - ocena plików Dockerfile i docker-compose.yml 121
  • Podsumowanie 121

Rozdział 6. Wdrażanie aplikacji przy użyciu Docker Compose 123

  • Wymagania techniczne 124
    • Przykładowa aplikacja - ShipIt Clicker v2 124
  • Dobór sprzętu i systemu operacyjnego dla aplikacji jednoserwerowej 124
    • Wymagania dla wdrożenia jednoserwerowego 124
  • Przygotowanie hosta do uruchomienia platformy Docker i narzędzia Docker Compose 125
    • Instalacja platformy Docker i narzędzia Git 126
  • Wdrażanie aplikacji przy użyciu plików konfiguracyjnych i skryptów 127
    • Weryfikacja pliku Dockerfile 127
    • Weryfikacja pliku docker-compose.yml 129
    • Przygotowanie produkcyjnego pliku .env 131
    • Skrypty 132
    • Ćwiczenie - przechowywanie plików aplikacyjnych poza serwerem produkcyjnym 135
    • Ćwiczenie - zabezpieczenie środowiska produkcyjnego 135
  • Monitorowanie niewielkich aplikacji - dzienniki i alarmy 136
    • Dzienniki 136
    • Alarmy 137
  • Ograniczenia aplikacji jednoserwerowych 137
    • Brak automatycznego przełączania awaryjnego 138
    • Brak skalowalności w poziomie wraz ze wzrostem obciążenia 138
    • Niestabilność działania z powodu błędnej konfiguracji 138
    • Katastrofalne skutki awarii w przypadku braku kopii zapasowej 139
    • Studium przypadku - migracja z systemu CoreOS i usługi DigitalOcean do CentOS 7 i AWS 139
  • Podsumowanie 139
  • Dalsza lektura 140

Rozdział 7. Ciągłe wdrażanie oprogramowania przy użyciu systemu Jenkins 141

  • Wymagania techniczne 142
    • Przykładowa aplikacja - ShipIt Clicker v3 142
  • Wykorzystanie systemu Jenkins w procesie ciągłej integracji oprogramowania 143
    • Pułapki, których powinieneś unikać 143
    • Wykorzystanie istniejącego serwera 144
    • Instalacja systemu Jenkins 144
    • Ciągłe wdrażanie oprogramowania przy użyciu systemu Jenkins 148
  • Plik Jenkinsfile i połączenie z serwerem 148
    • Testowanie systemu Jenkins i platformy Docker za pomocą skryptu procesowego 148
    • Łączenie z serwerem produkcyjnym za pomocą usługi SSH 150
  • Modyfikowanie konfiguracji za pomocą systemu Jenkins 154
    • Umieszczenie pliku Jenkinsfile w serwisie GitHub 154
    • Zmiana źródeł wszystkich repozytoriów 156
    • Definiowanie zmiennych środowiskowych dla serwera produkcyjnego 157
    • Budowanie kontenerów i umieszczanie ich w serwisie Docker Hub 158
    • Umieszczanie kontenerów w serwisie Docker Hub i wdrażanie ich w środowisku produkcyjnym 159
  • Wdrażanie różnych odgałęzień oprogramowania w kilku środowiskach 162
    • Utworzenie środowiska testowego 162
    • Definiowanie zmiennych środowiskowych dla serwera testowego 163
    • Wymuszenie wdrożenia testowego odgałęzienia projektu 163
  • Złożoność i ograniczenia skalowalności systemu Jenkins 165
    • Zarządzanie wieloma hostami 165
    • Złożoność skryptów 166
    • Kiedy wiadomo, że została osiągnięta granica? 166
  • Podsumowanie 167
  • Dalsza lektura 167

Rozdział 8. Wdrażanie kontenerów Docker przy użyciu platformy Kubernetes 169

  • Wymagania techniczne 170
  • Opcje lokalnej instalacji platformy Kubernetes 170
    • Docker Desktop i platforma Kubernetes 170
    • Minikube 171
    • Sprawdzenie poprawności działania platformy Kubernetes 172
  • Wdrożenie przykładowej aplikacji ShipIt Clicker v4 172
    • Instalacja programu Helm 172
    • Lokalne wdrożenie aplikacji ShipIt Clicker i kontrolera NGINX Ingress Controller 173
  • Dobór dystrybucji platformy Kubernetes 175
    • Google Kubernetes Engine 175
    • AWS EKS 175
    • Red Hat OpenShift 176
    • Microsoft Azure Kubernetes Service 176
    • Inne opcje 177
  • Pojęcia stosowane w platformie Kubernetes 178
    • Obiekty 178
    • Mapy ConfigMap 179
    • Pody 180
    • Węzły 180
    • Usługi 180
    • Kontrolery wejściowe 181
    • Skrytki 182
    • Przestrzenie nazw 187
  • Konfigurowanie usługi AWS EKS za pomocą szablonu CloudFormation 187
    • Wprowadzenie do szablonów AWS EKS Quick Start CloudFormation 188
    • Przygotowanie konta AWS 188
    • Szablony AWS EKS Quick Start CloudFormation 192
    • Konfigurowanie klastra EKS 195
  • Wdrożenie aplikacji w klastrze AWS ESK i ograniczenie zasobów 197
    • Konfigurowanie ograniczeń chroniących przed wyciekiem pamięci i przeciążeniem procesora 197
    • Przygotowanie aplikacji ShipIt Clicker do korzystania z kontrolera ALB 198
    • Wdrożenie aplikacji ShipIt Clicker w klastrze EKS 198
  • Repozytorium AWS Elastic Container Registry w klastrze AWS EKS 199
    • Tworzenie repozytorium ECR 200
  • Rozdzielanie środowisk za pomocą etykiet i przestrzeni nazw 202
    • Przykład - oznaczenie etykietami środowisk w domyślnej przestrzeni nazw 202
    • Środowiska programistyczne, akceptacyjne, testowe i produkcyjne 203
  • Podsumowanie 204
  • Dalsza lektura 204

Rozdział 9. Ciągłe wdrażanie oprogramowania w chmurze przy użyciu platformy Spinnaker 207

  • Wymagania techniczne 208
  • Zaktualizowana wersja aplikacji ShipIt Clicker v5 208
  • Usprawnienie platformy Kubernetes pod kątem utrzymywania aplikacji 209
    • Zarządzanie klastrem EKS za pomocą lokalnej stacji roboczej 209
    • Diagnozowanie problemów z połączeniem narzędzia kubectl z klastrem 210
    • Przełączanie pomiędzy kontekstem klastra i lokalnej stacji 210
    • Sprawdzenie poprawności działania kontrolera wejściowego ALB 211
    • Przygotowanie domeny Route 53 i certyfikatu 211
    • Utworzenie i wdrożenie aplikacji ShipIt Clicker v5 212
  • Platforma Spinnaker - kiedy i dlaczego są niezbędne bardziej zaawansowane wdrożenia 215
    • Wprowadzenie do platformy Spinnaker 215
  • Instalacja platformy Spinnaker w klastrze AWS EKS za pomocą programu Helm 217
    • Komunikacja z platformą Spinnaker za pomocą proxy kubectl 218
    • Udostępnianie platformy za pomocą kontrolera wejściowego ALB 218
    • Konfiguracja platformy Spinnaker za pomocą programu Halyard 220
    • Połączenie platformy Spinnaker z systemem Jenkins 220
    • Integracja systemu Jenkins z platformą Spinnaker i repozytorium ECR 221
    • Połączenie platformy Spinnaker z serwisem GitHub 226
    • Połączenie platformy Spinnaker z serwisem Docker Hub 226
    • Diagnozowanie problemów z platformą Spinnaker 227
  • Prosta strategia wdrożenia aplikacji ShipIt Clicker za pomocą platformy Spinnaker 228
    • Definiowanie aplikacji w platformie Spinnaker 228
    • Definiowanie procesu w platformie Spinnaker 229
    • Utworzenie wpisu DNS dla kontrolera wejściowego 234
  • Funkcjonalności wdrożeniowe i testowe platformy Spinnaker 235
    • Wdrożenie kanarkowe 235
    • Wdrożenie "czerwone/czarne" 235
    • Anulowanie wdrożenia 236
    • Testowanie aplikacji 236
  • Podsumowanie 237
  • Dalsza lektura 237

Rozdział 10. Monitorowanie kontenerów Docker przy użyciu systemów Prometheus, Grafana i Jaeger 239

  • Wymagania techniczne 240
    • Wdrożenie demonstracyjnej aplikacji ShipIt Clicker v7 240
  • Dzienniki kontenerów Docker i programów uruchomieniowych 243
    • Dzienniki kontenerów Docker 243
    • Cechy idealnego systemu zarządzania dziennikami 244
    • Diagnozowanie problemów z warstwą sterowania platformy Kubernetes na podstawie dzienników 245
    • Zapisywanie dzienników w usłudze CloudWatch Logs 246
    • Długotrwałe przechowywanie dzienników w usłudze S3 247
    • Analiza dzienników za pomocą usług CloudWatch Insights i Amazon Athena 248
    • Ćwiczenie - sprawdzenie liczby uruchomień gry ShipIt Clicker 249
  • Testy dostępności, gotowości i uruchamiania w platformie Kubernetes 249
    • Sprawdzanie za pomocą testów dostępności, czy kontener odpowiada na zapytania 250
    • Sprawdzanie za pomocą testów gotowości, czy usługa może przetwarzać ruch 250
    • Przystosowanie aplikacji ShipIt Clicker do osobnych testów dostępności i gotowości 251
    • Ćwiczenie - wymuszenie negatywnego wyniku testu gotowości aplikacji ShipIt Clicker 252
  • Zbieranie wskaźników i wysyłanie alarmów za pomocą systemu Prometheus 252
    • Historia systemu 253
    • Zapytania i interfejs WWW 253
    • Definiowanie w aplikacji wskaźników dla systemu Prometheus 254
    • Odczytywanie niestandardowych wskaźników 256
    • Konfiguracja alarmów 256
    • Wysyłanie powiadomień za pomocą modułu Alertmanager 258
    • Szczegóły zapytań i zewnętrznego monitoringu 260
  • Wizualizacja danych operacyjnych za pomocą systemu Grafana 260
    • Dostęp do systemu 260
    • Dodawanie paneli opracowanych przez społeczność użytkowników 261
    • Utworzenie nowego panelu z niestandardowym zapytaniem 262
  • Monitorowanie wydajności aplikacji za pomocą systemu Jaeger 264
    • Interfejs OpenTracing API 264
    • Wprowadzenie do systemu Jaeger 265
    • Instalacja klienta systemu Jaeger w aplikacji ShipIt Clicker 267
    • Instalacja rozszerzenia Jaeger Operator 270
  • Podsumowanie 272
  • Dalsza lektura 272

Rozdział 11. Skalowanie i testy obciążeniowe aplikacji w środowisku Docker 275

  • Wymagania techniczne 276
    • Nowa aplikacja ShipIt Clicker v8 276
  • Skalowanie klastra Kubernetes 278
    • Ręczne skalowanie klastra 279
    • Dynamiczne skalowanie klastra 281
  • Siatka usług Envoy i jej zastosowania 285
    • Zarządzanie ruchem w sieci 286
    • Instalacja siatki Envoy 287
  • Testowanie skalowalności i wydajności aplikacji za pomocą narzędzia k6 291
    • Rejestrowanie i odtwarzanie sesji 292
    • Ręczne tworzenie realistycznego testu 293
    • Wykonanie testu obciążeniowego 297
  • Podsumowanie 298
  • Dalsza lektura 299

CZĘŚĆ III. BEZPIECZEŃSTWO KONTENERÓW DOCKER 301

Rozdział 12. Wprowadzenie do bezpieczeństwa kontenerów 303

  • Wymagania techniczne 304
  • Wirtualizacja i modele bezpieczeństwa hiperwizora 304
    • Wirtualizacja i pierścienie ochronne 304
    • Platforma Docker i pierścienie ochronne 306
  • Kontenerowe modele bezpieczeństwa 308
  • Docker Engine, containerd i zabezpieczenia w systemie Linux 309
    • Przestrzeń PID 310
    • Przestrzeń MNT 311
    • Przestrzeń NET 311
    • Przestrzeń IPC 311
    • Przestrzeń UTS 311
    • Przestrzeń USER 312
  • Uwaga dotycząca grup cgroups 312
  • Dobre praktyki w skrócie 312
    • Regularnie instaluj poprawki 313
    • Zabezpieczaj gniazdo sieciowe 313
    • Nie uruchamiaj błędnego kodu 315
    • Zawsze twórz konto użytkownika z minimalnymi uprawnieniami 315
  • Podsumowanie 315

Rozdział 13. Podstawy bezpieczeństwa i dobre praktyki korzystania z platformy Docker 317

  • Wymagania techniczne 318
  • Bezpieczeństwo obrazów kontenerów 318
    • Weryfikacja obrazu 320
    • Minimalny obraz bazowy 322
    • Ograniczanie uprawnień 323
    • Zapobieganie wyciekowi danych 324
  • Bezpieczne korzystanie z poleceń w platformie Docker 326
    • Polecenia COPY i ADD - jaka jest różnica? 326
    • Kopiowanie rekurencyjne - bądź ostrożny 327
  • Bezpieczeństwo procesu budowania kontenerów 328
    • Wieloetapowy proces budowania obrazu 329
  • Ograniczanie możliwości i zasobów wdrażanego kontenera 330
    • Ograniczanie zasobów 330
    • Ograniczanie możliwości 331
  • Podsumowanie 332

Rozdział 14. Zaawansowane zabezpieczenia: skrytki, poufne polecenia, znaczniki i etykiety 333

  • Wymagania techniczne 334
  • Bezpieczne przechowywanie poufnych danych w platformie Docker 334
    • Dziennik Raft 335
  • Tworzenie, edytowanie i usuwanie skrytek 336
    • Tworzenie skrytek 336
    • Odczytywanie skrytek 336
    • Usuwanie skrytek 337
  • Skrytki w akcji - przykłady 338
  • Zabezpieczanie kontenerów za pomocą znaczników 340
  • Umieszczanie w etykietach metadanych aplikacji 341
  • Podsumowanie 342

Rozdział 15. Skanowanie, monitorowanie i zewnętrzne narzędzia 343

  • Wymagania techniczne 344
  • Skanowanie i monitorowanie a bezpieczeństwo kontenerów w chmurze i środowisku programistycznym 344
    • Skanowanie obrazów kontenerów za pomocą programu Anchore Engine 345
    • Chef InSpec 349
    • Lokalny monitoring platformy Docker za pomocą natywnego narzędzia stats 350
    • Agregowanie danych monitoringowych w chmurze za pomocą narzędzia Datadog 353
  • Zabezpieczanie kontenerów w chmurze AWS 356
    • Alarmy bezpieczeństwa w usłudze AWS GuardDuty 357
  • Zabezpieczanie kontenerów w chmurze Azure 358
    • Monitorowanie kontenerów w chmurze Azure 358
    • Zabezpieczanie kontenerów przy użyciu usługi Security Center 359
  • Zabezpieczanie kontenerów w chmurze GCP 360
    • Analiza kontenerów i uwierzytelnienie binarne 361
    • Wykrywanie ataków za pomocą usługi Security Command Center 362
  • Podsumowanie 363
  • Dalsza lektura 364

Rozdział 16. Wnioski - koniec drogi, ale nie podróży 365

  • Wymagania techniczne 365
  • Kontenery w skrócie 366
  • Czego się dowiedziałeś o tworzeniu aplikacji 366
    • Wzorce projektowe 366
  • Poszerzenie wiedzy o tworzeniu i utrzymaniu aplikacji 369
    • Inżynieria chaosu i tworzenie niezawodnych systemów produkcyjnych 369
  • Bezpieczeństwo i dalsze kroki 371
    • Metasploit i testy penetracyjne 371
  • Podsumowanie 373
  • Tytuł: Docker dla programistów. Rozwijanie aplikacji i narzędzia ciągłego dostarczania DevOps
  • Autor: Richard Bullington-McGuire, Michael Schwartz, Andrew K. Dennis
  • Tytuł oryginału: Docker for Developers: Develop and run your application with Docker containers using DevOps tools for continuous deliver
  • Tłumaczenie: Andrzej Watrak
  • ISBN: 978-83-283-7728-8, 9788328377288
  • Data wydania: 2021-06-22
  • Format: Ebook
  • Identyfikator pozycji: dockpr
  • Wydawca: Helion