DevOps i automatyzacja Średnio zaawansowany 60 min

Dane, porty i sieć kontenerów

Udostępnisz usługę na hoście, podłączysz trwałe dane i połączysz dwa kontenery prywatną siecią.

Wróć do listy lekcji

1. Krótka teoria

Zapisy w zwykłej warstwie kontenera znikają wraz z jego usunięciem. Nazwany volume przechowuje dane poza cyklem życia instancji i można go podłączyć ponownie. Publikacja portu przez -p 127.0.0.1:8080:80 łączy port 8080 lokalnego hosta z portem 80 kontenera. Adres 127.0.0.1 ogranicza dostęp do hosta; pominięcie adresu może wystawić usługę na wszystkich interfejsach. Samo EXPOSE w obrazie nie publikuje portu. Sieć zdefiniowana przez użytkownika pozwala kontenerom komunikować się po nazwach; nazwa kontenera jest wtedy rozwiązywana przez wbudowany DNS Dockera. Ruch między kontenerami na tej samej sieci nie wymaga publikowania portu bazy na hoście. Zmienne środowiskowe przekazują konfigurację w czasie uruchomienia, ale ich wartości mogą być widoczne w metadanych kontenera, więc nie należy wkładać tam niekontrolowanie sekretów. W produkcji użyj mechanizmu sekretów i ogranicz dostęp do hosta. Po ćwiczeniu usuń kontenery i sieć, a volume zachowaj do sprawdzenia trwałości.

2. Przykłady komend

docker volume create orders-data

Tworzy nazwany magazyn danych niezależny od kontenera.

$ docker volume create orders-data
docker network create orders-net

Tworzy sieć dla usług, które mają się odnajdywać po nazwie.

$ docker network create orders-net
docker run -d --name orders-web --network orders-net -p 127.0.0.1:8080:80 -v orders-data:/usr/share/nginx/html nginx:1.28

Uruchamia usługę z lokalnie opublikowanym portem i podłączonym volume.

$ docker run -d --name orders-web --network orders-net -p 127.0.0.1:8080:80 -v orders-data:/usr/share/nginx/html nginx:1.28
curl -I http://127.0.0.1:8080/

Sprawdza odpowiedź usługi przez port hosta.

$ curl -I http://127.0.0.1:8080/
docker run --rm --network orders-net nginx:1.28 getent hosts orders-web

Sprawdza rozwiązywanie nazwy kontenera w tej samej sieci.

$ docker run --rm --network orders-net nginx:1.28 getent hosts orders-web
docker volume inspect orders-data

Odczytuje metadane magazynu danych.

$ docker volume inspect orders-data
docker network inspect orders-net

Pokazuje podłączone kontenery i konfigurację sieci.

$ docker network inspect orders-net

3. Zadanie praktyczne

Utwórz orders-data i orders-net, uruchom orders-web tylko na adresie lokalnym hosta i potwierdź odpowiedź przez curl. W drugim kontenerze sprawdź, czy nazwa orders-web rozwiązuje się w tej sieci. Porównaj port hosta z portem wewnątrz kontenera. Zatrzymaj i usuń usługę, lecz zachowaj volume; sprawdź, że nadal figuruje na liście.

4. Typowe błędy

  • Zakładanie, że EXPOSE automatycznie wystawia usługę na hoście.
  • Publikowanie portu bazy danych mimo komunikacji wyłącznie wewnątrz sieci.
  • Przechowywanie ważnych danych tylko w zapisywalnej warstwie kontenera.
  • Uznawanie zmiennej środowiskowej za bezpieczny sejf na sekrety.
  • Mylenie portu hosta z portem procesu w kontenerze.

5. Podsumowanie

Volume zachowuje dane po usunięciu instancji, publikacja portu udostępnia usługę hostowi, a prywatna sieć umożliwia komunikację kontenerów po nazwach. Zakres publikacji portu i sposób podania sekretów trzeba dobrać świadomie.

Flow nauki
  1. Teoria
  2. Przykład
  3. Ćwiczenie
  4. Quiz
  5. Praktyka
  6. Podsumowanie