Dlaczego używanie mounted volumes w Dockerze na Windows to zły pomysł

Czyli o tym jak po raz drugi rwałem włosy z głowy dlaczego moja aplikacja działa bardzo wolno 🐌

W świecie nowoczesnego rozwoju aplikacji, Docker stał się kluczowym narzędziem do konteneryzacji aplikacji, umożliwiając łatwą i elastyczną konfigurację środowisk. Jednym z najczęściej używanych rozwiązań w Dockerze jest montowanie woluminów (mounted volumes), które pozwala na synchronizację plików między kontenerem, a systemem operacyjnym gospodarza. Choć ta funkcjonalność jest bardzo przydatna, na systemach Windows napotykamy na szereg problemów, które mogą wpłynąć na wydajność, stabilność oraz bezpieczeństwo aplikacji. W tym artykule omówię, dlaczego używanie mounted volumes w Dockerze na Windowsie jest złym pomysłem, szczególnie w kontekście problemów z uprawnieniami plików oraz wydajnością, a także zaproponuję alternatywne rozwiązania.

Co to są mounted volumes w Dockerze?

Mounted volumes to mechanizm w Dockerze, który pozwala na mapowanie lokalnych folderów z systemu operacyjnego gospodarza (np. Windows) na kontener. Dzięki temu zmiany dokonane w plikach na hoście są automatycznie synchronizowane z kontenerem, co jest szczególnie przydatne w przypadku aplikacji, które muszą działać w środowisku kontenerowym, ale mają dostęp do plików na dysku. Często jest to rozwiązanie stosowane w aplikacjach webowych, takich jak PrestaShop, które wymagają dostępu do plików, np. w celu zapisu logów czy przesyłania obrazów.

Problemy związane z mounted volumes na Windowsie

Wydajność: wolne działanie i długie czasy wczytywania

Głównym problemem przy używaniu mounted volumes w Dockerze na Windowsie jest znaczny spadek wydajności. Docker na Windowsie działa na maszynie wirtualnej lub poprzez WSL 2 (Windows Subsystem for Linux 2), co wprowadza dodatkowy narzut przy synchronizacji plików między systemem plików Windows (NTFS), a Linuxowym systemem plików kontenera (np. ext4). W praktyce oznacza to, że operacje na plikach, takie jak odczyt, zapis, czy kopiowanie, są znacznie wolniejsze niż na systemach Linux, gdzie Docker działa natywnie. Na przykład, aplikacje webowe oparte na kontenerach, takie jak PrestaShop czy te oparte o framework Symfony, mogą doświadczać opóźnień w ładowaniu stron, ponieważ system Windows nie jest zoptymalizowany do szybkiej synchronizacji plików w kontenerach. W rezultacie może to prowadzić do znacznego spadku wydajności aplikacji.

Problemy z uprawnieniami plików

Kolejnym problemem związanym z mounted volumes na Windowsie są kwestie uprawnień do plików. Na Linuxie system uprawnień jest bardzo dobrze zoptymalizowany do pracy z Dockerem i kontenerami. W przypadku Windowsa jednak mechanizm uprawnień do plików jest znacznie mniej kompatybilny z systemem plików kontenera. W kontekście aplikacji takich jak PrestaShop, które często wymagają dostępu do plików i katalogów, np. do zapisywania logów czy przesyłania plików multimedialnych, mogą wystąpić błędy związane z dostępem do plików. Wiele aplikacji wymaga szczególnych uprawnień do modyfikacji plików na dysku, a synchronizacja między Windows, a kontenerem może powodować problemy z prawami dostępu. Np. PrestaShop może nie mieć odpowiednich uprawnień do zapisu w katalogu /var/www/html/img lub w innych folderach, co może prowadzić do błędów w działaniu aplikacji (np. brak możliwości przesyłania zdjęć lub generowania miniatur). Tego typu problemy mogą być trudne do zdiagnozowania, ponieważ wynikają z różnic w systemach plików i uprawnieniach między Windows, a Linuxem. Na Linuxie uprawnienia są kontrolowane bezpośrednio przez system plików, podczas gdy na Windowsie mogą wystąpić różnice w sposobie zarządzania dostępem do plików przez Docker, co skutkuje błędami w aplikacjach.

Problemy z kompatybilnością systemów plików

Nawet w przypadku używania WSL 2, Docker na Windowsie nie działa tak płynnie jak na Linuxie. Mimo że WSL 2 jest znacznie szybszy i lepiej obsługuje system plików Linuxa, nadal mogą występować problemy z kompatybilnością między systemem NTFS na Windowsie, a systemem plików w kontenerach, takim jak ext4. To może prowadzić do błędów, takich jak brak synchronizacji plików lub nieprawidłowe zapisy w plikach.

Alternatywy dla mounted volumes na Windowsie

Mimo że mounted volumes w Dockerze są popularnym rozwiązaniem, istnieją alternatywy, które mogą rozwiązać powyższe problemy na systemie Windows:

Używanie WSL 2 z Docker Desktop

Jeśli musisz używać Docker na Windowsie, zdecydowanie warto korzystać z WSL 2. Dzięki tej technologii Docker działa na systemie Linux uruchomionym w maszynie wirtualnej na Windowsie, co pozwala na lepszą kompatybilność z systemem plików Linux i wyeliminowanie wielu problemów z wydajnością oraz synchronizacją plików. WSL 2 pozwala na znacznie szybsze operacje i poprawia synchronizację plików między systemem Windows, a kontenerem.

Bind mounts tylko do danych, nie do kodu źródłowego

Jeśli musisz używać mounted volumes, warto rozważyć ich użycie tylko do przechowywania danych, takich jak bazy danych, logi lub pliki aplikacji, a nie do samego kodu źródłowego. Kod źródłowy najlepiej trzymać wewnątrz kontenera lub przechowywać w systemie kontroli wersji, takim jak Git. Dzięki temu unikniesz problemów z wydajnością i uprawnieniami związanymi z synchronizacją plików między hostem, a kontenerem.

Praca z Dockerem na Linuxie

Jeśli masz możliwość pracy na maszynie z systemem Linux, warto rozważyć uruchomienie kontenerów Docker bezpośrednio na tym systemie. Docker na Linuxie działa natywnie, a synchronizacja plików między kontenerem a systemem gospodarza jest o wiele szybsza i bardziej niezawodna. To także pozwoli uniknąć problemów z uprawnieniami plików.

Używanie dedykowanych narzędzi do zarządzania plikami

Możesz również rozważyć używanie dedykowanych narzędzi do synchronizacji plików między hostem, a kontenerem, które będą działały lepiej niż wbudowane mounted volumes. Narzędzia takie jak rsync mogą pomóc w synchronizacji plików na poziomie aplikacji, unikając problemów związanych z synchronizacją w czasie rzeczywistym.

Podsumowanie

Choć mounted volumes w Dockerze na Windowsie mogą wydawać się wygodnym rozwiązaniem, w rzeczywistości prowadzą do wielu problemów związanych z wydajnością, synchronizacją plików oraz uprawnieniami. Zdecydowanie warto rozważyć alternatywy, takie jak WSL 2, praca na Linuxie, czy ograniczenie użycia mounted volumes do danych, aby uniknąć frustracji związanych z błędami w aplikacjach, takich jak PrestaShop. Właściwe podejście do pracy z Dockerem na Windowsie może znacznie poprawić wydajność, stabilność oraz bezpieczeństwo Twojego środowiska deweloperskiego.