Docker dla
programistów
Rozwijanie
aplikacji i narzędzia ciągłego dostarczania DevOps
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
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
376
stron, Format: 17.0x24.0cm, oprawa miękka