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ą.
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
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.