Jeśli również pracujesz na Macu i masz problem z wolno działającym Docker for Mac, to mam dla Ciebie kilka tricków, które przyspieszą działanie Twojego Dockera bez dodatkowych narzędzi.
Ale na początek, jak wyglądają czasy jednego z projektów nad którym pracuje. Zobaczmy więc docker-compose. Możemy w nim zauważyć montowanie wolumenu do kontenera nginx i nadanie mu aliasu, który wykorzystujemy w kontenerze PHP.
|
|
Jak sami widzicie, czasy są nie do zaakceptowania. A jest to tylko jedna prosta podstrona aplikacji z wykorzystaniem Symfony.
Co możemy w takiej sytuacji zrobić? Sprawdźmy jak będą wyglądały czasy po wprowadzeniu kilku poprawek wydajnościowych.
1. Używaj NFS
Po pierwsze wykorzystaj NFS do synchronizacji danych między hostem lokalnym a kontenerem. Przyspieszy to działanie dockera.
- Pobieramy plik z gist – https://gist.github.com/seanhandley/7dad300420e5f8f02e7243b7651c6657#file-setup_native_nfs_docker_osx-sh
- Uruchamiamy pobrany wcześniej skrypt
- Modyfikujemy docker-compose
|
|
- Uruchamiamy kontener
Jak to wygląda teraz dla tej samej strony? Na pewno duże lepiej, ale nadal nie jest idealnie.

Pierwsze załadowanie po zmianach w kodzie

Kolejne załadowanie strony
2. Wyrzuć niepotrzebne sprawdzanie katalogów
Docker for Mac domyślnie ma ustawione kilka głównych katalogów, które za każdym razem sprawdza czy, któryś plik się nie zmienił. Jeżeli używamy NFS’a jest to zbędna operacja, która tylko zajmuje czas. Nie potrzebujemy, aby docker zajmował się sprawdzaniem i synchronizacją plików między hostem a kontenerem, ponieważ mamy od tego NFS.
Wchodzimy więc w ustawienia Docker for Mac > Resources > File sharing, a następnie usuwamy wszystkie pozycje. Jeżeli jednak potrzebujecie synchronizować jakiś katalog bez użycia NFS, wybierzcie jego ścieżkę. Dzięki temu nadal będziecie mogli wykorzystywać synchronizację plików, która zapewnia Docker, a jednocześnie przyspieszycie aplikację.
Uwaga, wykorzystanie tego kroku, praktycznie eliminuje używanie docker run
, a co za tym idzie, również nie skorzystamy w dockera w naszym IDE. Wszystko będziemy musieli uruchamiać w działającym kontenerze via CLI.
Sprawdźmy jak teraz działa nasza aplikacja.

Pierwsze załadowanie po zmianach

Kolejne załadowanie strony
Na prostej stronie nie widzimy zbyt dużej różnicy. Jednak przy większych projektach, ta różnica potrafi być spora.
3. Wersja Edge – mutagen.io
Najnowsza wersja Docker for Mac w wersji Edge wprowadziła możliwość synchronizacji plików przy pomocy mutagen.io. Więcej informacji znajdziesz tutaj: klik. Według mnie będzie to game changer dla osób pracujących na Macu. Dlaczego będzie skoro zostało już wprowadzone? Po pierwsze jest to dopiero w wersji Edge, a po drugie ma jeszcze sporo błędów i widać jedynie Error na liście File Sharing. Błędy, które wystąpiły możemy zobaczyć odpytując lokalne API Dockera:
|
|
Implementacja mutagena a Dockerze ma problem z linkami absolutnymi w aplikacji. To niestety wyklucza użycie phpunit w symfony:
|
|
Mimo wszystko sprawdźmy jak zachowuje się nasza aplikacja po włączeniu mutagena.
|
|

Pierwsze odświeżenie po zmianach w kodzie

Kolejne załadowanie
Wygląda to naprawę dobrze. Ale… Dodajmy jeszcze volumen na cache
|
|

Pierwsze załadowanie po zmianach w kodzie

Kolejne odświeżenie strony
Praca z dockerem na Mac OSX wcale nie musi być utrapieniem. Jeżeli znasz jeszcze inne tricki jak zoptymalizować dockera, koniecznie daj znać w komentarzu.
P.S. Jeżeli będziesz chciał przejść na Docker Edge, pamiętaj, że pierwsze uruchomienie Docker Edge wyczyści wszystkie obrazy, kontenery oraz wolumeny!! Jeżeli masz kontenery z danymi, których nie chciał byś wyczyścić, zrób koniecznie ich backup.