Docker dla PrestaShop: Konfiguracja środowiska deweloperskiego
Skonfiguruj Docker do pracy z PrestaShop — testy wielu wersji, praca z modułami, zarządzanie bazą danych, debugowanie Xdebug i wdrożenia produkcyjne.
Dlaczego Docker do rozwoju PrestaShop?
Jeśli kiedykolwiek próbowałeś uruchomić PrestaShop 1.6, 1.7, 8.x i 9.x na jednym komputerze, znasz ten ból. Każda wersja wymaga innej wersji PHP, innej wersji MySQL i innej konfiguracji. Instalowanie tego wszystkiego natywnie to przepis na godziny debugowania.
Docker rozwiązuje ten problem. Każda wersja PrestaShop działa we własnym izolowanym kontenerze z dokładnie takimi zależnościami, jakich potrzebuje. Nic nie koliduje. Nic się nie psuje.
- Testowanie wielu wersji: Uruchom PS 1.7, 8.x i 9.x jednocześnie. Przetestuj moduł na wszystkich w jedno popołudnie.
- Izolacja: Każdy kontener ma własne środowisko PHP, bazę danych MySQL i system plików.
- Powtarzalność: Całe środowisko jest zdefiniowane w jednym pliku
docker-compose.yml. Udostępnij go zespołowi, a każdy otrzyma identyczną konfigurację. - Łatwe sprzątanie: Uruchom
docker compose down -vi wszystko znika. Odtwórz to od nowa w dwie minuty.
Uruchamiamy ponad 25 kontenerów PrestaShop na jednym serwerze — od PS 1.6 po PS 9.1 — do rozwoju i testowania modułów. Docker to jedyny praktyczny sposób, żeby tym zarządzać. Ten poradnik przedstawia wzorce, które udoskonalaliśmy przez lata rzeczywistego użytkowania.
Wymagania wstępne
Instalacja Docker
Ubuntu/Debian: curl -fsSL https://get.docker.com | sh — następnie sudo usermod -aG docker $USER, aby uruchamiać Docker bez sudo.
macOS: Pobierz Docker Desktop dla Mac (obsługiwane Intel i Apple Silicon).
Windows: Najpierw zainstaluj WSL2, potem Docker Desktop z włączonym backendem WSL2.
Kluczowe pojęcia Docker
- Image: Szablon tylko do odczytu zawierający system operacyjny, PHP, Apache i PrestaShop. Oficjalne obrazy:
prestashop/prestashopna Docker Hub. - Container: Uruchomiona instancja obrazu. Możesz uruchomić wiele kontenerów z tego samego obrazu.
- Volume: Trwałe miejsce przechowywania danych, które przetrwa restarty kontenera. Bez volume’ów dane są tracone po usunięciu kontenera.
- Network: Wirtualna sieć umożliwiająca komunikację między kontenerami — PrestaShop musi mieć połączenie ze swoim kontenerem MySQL.
Wymagania sprzętowe
Zaplanuj 1,5–2 GB RAM na instancję PrestaShop (aplikacja + baza danych). Dla 2–3 wersji wystarczy 8 GB RAM i dysk SSD. Dla 10+ kontenerów zalecane jest 32 GB+ i szybkie dyski SSD.
Podstawowa konfiguracja: pojedynczy kontener PrestaShop
Utwórz katalog i dodaj ten plik docker-compose.yml:
version: '3.8'
services:
prestashop:
image: prestashop/prestashop:8.2
container_name: my-ps-shop
ports:
- "8080:80"
environment:
- DB_SERVER=db
- DB_USER=prestashop
- DB_PASSWD=prestashop_password
- DB_NAME=prestashop
- PS_DOMAIN=localhost:8080
- PS_FOLDER_ADMIN=admin-dev
- PS_FOLDER_INSTALL=disabled
- ADMIN_MAIL=admin@yourshop.com
- ADMIN_PASSWD=admin_password_123
volumes:
- ps-data:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
container_name: my-ps-shop-db
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=prestashop
- MYSQL_USER=prestashop
- MYSQL_PASSWORD=prestashop_password
volumes:
- db-data:/var/lib/mysql
volumes:
ps-data:
db-data:
DB_SERVER musi odpowiadać nazwie usługi (db). PS_DOMAIN mówi PrestaShop, pod jakim adresem jest dostępny. PS_FOLDER_INSTALL=disabled pomija kreator instalacji przy kolejnych uruchomieniach. Uruchom za pomocą docker compose up -d i śledź pierwszą instalację poleceniem docker compose logs -f prestashop (trwa 1-2 minuty).
Wejdź do sklepu pod adresem http://localhost:8080, a do Back Office pod http://localhost:8080/admin-dev.
Zawsze używaj nazwanych volume’ów dla bazy danych. Bez volume’ów usunięcie kontenera niszczy wszystkie dane — produkty, zamówienia, wszystko. Nazwane volume’y istnieją dopóki ich jawnie nie usuniesz.
Konfiguracja testowania wielu wersji
To właśnie tutaj Docker błyszczy. Uruchomienie trzech wersji PrestaShop obok siebie to kwestia zdefiniowania ich w pliku compose z różnymi portami:
version: '3.8'
services:
ps178:
image: prestashop/prestashop:1.7.8
ports: ["8081:80"]
environment:
- DB_SERVER=ps178-db
- PS_DOMAIN=localhost:8081
# ... ten sam schemat co wyżej
volumes:
- ps178-data:/var/www/html
networks: [ps-network]
ps178-db:
image: mysql:5.7
volumes: [ps178-db-data:/var/lib/mysql]
networks: [ps-network]
ps82:
image: prestashop/prestashop:8.2
ports: ["8082:80"]
environment:
- DB_SERVER=ps82-db
- PS_DOMAIN=localhost:8082
volumes:
- ps82-data:/var/www/html
networks: [ps-network]
ps82-db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes: [ps82-db-data:/var/lib/mysql]
networks: [ps-network]
ps9:
image: prestashop/prestashop:9.0
ports: ["8083:80"]
environment:
- DB_SERVER=ps9-db
- PS_DOMAIN=localhost:8083
volumes:
- ps9-data:/var/www/html
networks: [ps-network]
ps9-db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes: [ps9-db-data:/var/lib/mysql]
networks: [ps-network]
networks:
ps-network:
driver: bridge
Wybierz spójny schemat portów: 8081 dla PS 1.7, 8082 dla PS 8.x, 8083 dla PS 9.x. Dla wygodniejszej pracy użyj Nginx Proxy Manager, aby przypisywać nazwy hostów jak ps178.dev.local zamiast numerów portów.
Zawsze używaj osobnych baz danych. Nigdy nie współdziel jednej instancji MySQL między wersjami PrestaShop — schemat różni się między wersjami, a migracje uszkodzą dane.
Przepływ pracy przy tworzeniu modułów
Zamontuj katalog modułu do kontenera za pomocą bind mount, aby każda edycja była natychmiast dostępna:
volumes:
- ps82-data:/var/www/html
- /home/user/modules/my_module:/var/www/html/modules/my_module
Aby testować na wszystkich wersjach, zamontuj ten sam katalog do każdego kontenera. Edytuj jeden plik, odśwież trzy karty przeglądarki — Twoja zmiana jest widoczna wszędzie.
Symlinki a montowanie volume’ów
Montowanie volume’ów (zalecane): Zmiany są natychmiastowe, działa na wszystkich platformach, czyste rozdzielenie. Symlinki: Działają tylko jeśli pliki PrestaShop są w systemie plików hosta, nie działają dobrze z Docker volume’ami. W większości przypadków montowanie volume’ów to właściwy wybór.
Obsługa cache
PrestaShop agresywnie cache’uje szablony i konfiguracje. Podczas prac deweloperskich czyść cache po zmianach:
docker exec ps82 rm -rf /var/www/html/var/cache/*
Możesz też wyłączyć cache szablonów w Back Office → Advanced Parameters → Performance podczas aktywnego rozwoju. Włącz go ponownie po zakończeniu testów — błędy związane z cache są realne.
Zarządzanie bazą danych
Łączenie z MySQL
# Interaktywna sesja MySQL
docker exec -it ps82-db mysql -u root -p'root' prestashop
# Uruchomienie pojedynczego zapytania
docker exec ps82-db mysql -u root -p'root' -e "SELECT COUNT(*) FROM ps_product;" prestashop
Kontener phpMyAdmin
phpmyadmin:
image: phpmyadmin:latest
ports: ["9090:80"]
environment:
- PMA_HOSTS=ps178-db,ps82-db,ps9-db
- PMA_USER=root
- PMA_PASSWORD=root
networks: [ps-network]
Import i eksport
# Eksport
docker exec ps82-db mysqldump -u root -p'root' prestashop > backup.sql
# Import
docker exec -i ps82-db mysql -u root -p'root' prestashop < backup.sql
Trwałe vs tymczasowe
Trwałe (nazwane volume’y): Dane przetrwają restarty — używaj w głównych środowiskach deweloperskich. Tymczasowe (bez volume’a): Świeża instalacja za każdym razem — przydatne do testów typu „czy ten moduł instaluje się poprawnie na czystym sklepie?”
Testowanie emaili z Mailpit
Mailpit przechwytuje wszystkie wychodzące emaile i wyświetla je w interfejsie webowym — niezbędne do testowania przepływów checkout bez wysyłania prawdziwych wiadomości.
mailpit:
image: axllent/mailpit
ports:
- "8025:8025" # Web UI
- "1025:1025" # SMTP
networks: [ps-network]
W PrestaShop Back Office → Advanced Parameters → E-mail: ustaw serwer SMTP na mailpit, port 1025, bez szyfrowania, bez uwierzytelniania. Przechwycone emaile znajdziesz pod http://localhost:8025.
Debugowanie z Xdebug
Konfiguracja Xdebug 3
Utwórz własny Dockerfile:
FROM prestashop/prestashop:8.2
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
Plik xdebug.ini:
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.idekey=VSCODE
Na Linuksie dodaj extra_hosts: ["host.docker.internal:host-gateway"] do usługi w pliku compose — host.docker.internal nie istnieje domyślnie na Linuksie.
Konfiguracja VS Code
Zainstaluj rozszerzenie PHP Debug i dodaj do .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [{
"name": "Listen for Xdebug (Docker)",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html/modules/my_module": "${workspaceFolder}"
}
}]
}
Wpisy pathMappings są kluczowe — mówią VS Code, jak ścieżki w kontenerze odpowiadają ścieżkom lokalnym. Bez tego breakpointy nie będą działać.
PHPStorm
Settings → PHP → Servers: dodaj serwer z localhost i portem kontenera, mapując /var/www/html na lokalny projekt. Ustaw port Xdebug na 9003 w PHP → Debug i kliknij „Start Listening.”
Przydatne polecenia Docker
| Zadanie | Polecenie |
|---|---|
| Uruchom wszystkie kontenery | docker compose up -d |
| Zatrzymaj wszystkie kontenery | docker compose down |
| Zatrzymaj i usuń wszystkie dane | docker compose down -v |
| Pokaż logi | docker compose logs -f |
| Wyczyść cache PS | docker exec CONTAINER rm -rf /var/www/html/var/cache/* |
| MySQL CLI | docker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop |
| Eksportuj bazę danych | docker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql |
| Importuj bazę danych | docker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql |
| Wejdź do kontenera | docker exec -it CONTAINER bash |
| Sprawdź zużycie zasobów | docker stats --no-stream |
| Przebuduj po zmianach Dockerfile | docker compose up -d --build |
| Uruchom konsolę PrestaShop | docker exec CONTAINER php bin/console cache:clear --env=prod |
| Uruchom Composer w module | docker exec -w /var/www/html/modules/my_module CONTAINER composer install |
Uwagi dotyczące produkcji
Dla większości sklepów PrestaShop Docker to narzędzie deweloperskie. Sklepy produkcyjne działają lepiej na tradycyjnym hostingu, ponieważ:
- Pojedynczy serwer ze stosem LAMP jest prostszy w utrzymaniu i monitorowaniu
- Natywne operacje plikowe są szybsze niż Docker volume’y (PrestaShop ładuje tysiące plików PHP na żądanie)
- Większość hostów PrestaShop oferuje cPanel/Plesk, a nie Docker
Docker w produkcji ma sens, gdy: masz duży zespół deweloperski z pipeline’ami CI/CD, potrzebujesz auto-skalowania podczas wyprzedaży, zarządzasz 10+ sklepami lub potrzebujesz wdrożeń bez przestojów (buduj nowy obraz, podmieniaj, cofnij jeśli coś nie działa).
Docker Compose vs Kubernetes: Compose obsługuje do 20–30 kontenerów na jednym serwerze i jest prosty w zarządzaniu. Kubernetes dodaje auto-skalowanie, samoleczenie i orkiestrację wielowęzłową, ale wymaga znaczącej infrastruktury. Dla większości wdrożeń PrestaShop, Compose na wydajnym serwerze jest wystarczający.
Częste problemy i rozwiązania
Problemy z uprawnieniami plików
Objaw: Błędy „Permission denied”, nie można przesłać modułów ani zapisać obrazów.
Przyczyna: Apache działa jako www-data (UID 33) wewnątrz kontenera, ale zamontowane pliki hosta mogą należeć do Twojego użytkownika (UID 1000).
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/var
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/img
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/modules
Kontener nie może połączyć się z bazą danych
DB_SERVERmusi dokładnie odpowiadać nazwie usługi MySQL w pliku compose- MySQL może nie być jeszcze gotowy — dodaj healthcheck i użyj
depends_on: condition: service_healthy - Oba kontenery muszą być w tej samej sieci Docker
- MySQL 8.0 domyślnie używa
caching_sha2_password— dodajcommand: --default-authentication-plugin=mysql_native_passworddo usługi MySQL
Wolne operacje plikowe na macOS
Objaw: Ładowanie stron trwa 10–30 sekund z bind mount.
Rozwiązania:
- VirtioFS: Przełącz z gRPC FUSE na VirtioFS w ustawieniach Docker Desktop — największa pojedyncza poprawa
- Montuj mniej: Montuj tylko katalog modułu, używaj nazwanych volume’ów dla rdzenia PrestaShop
- Mutagen: Szybka dwukierunkowa synchronizacja plików, która eliminuje karę wydajności macOS
SSL w środowisku deweloperskim
Moduły płatności i logowanie społecznościowe często wymagają HTTPS. Opcje:
- Nginx Proxy Manager: Obsługuje terminację SSL dla wszystkich kontenerów. Najczystsze podejście.
- mkcert: Generuj lokalnie zaufane certyfikaty poleceniem
mkcert localhosti montuj je do Apache. - Traefik: Automatycznie wykrywa kontenery i udostępnia certyfikaty.
Kontenerowi kończy się pamięć
MySQL 8.0 domyślnie zużywa dużo pamięci. Ogranicz to:
command: >
--innodb-buffer-pool-size=128M
--max-connections=50
W Docker Desktop (macOS/Windows) zwiększ globalny limit pamięci w Settings → Resources do co najmniej 6 GB dla 3+ kontenerów. Zatrzymuj kontenery, których aktualnie nie używasz: docker compose stop ps178.
Pętle automatycznej instalacji
Jeśli PrestaShop reinstaluje się przy każdym restarcie, upewnij się, że volume /var/www/html jest trwały i że PS_FOLDER_INSTALL=disabled jest ustawione w zmiennych środowiskowych.
Mixed content po zmianie portu
Zaktualizuj domenę w bazie danych po zmianie mapowania portów:
docker exec ps82-db mysql -u root -p'root' -e "
UPDATE ps_configuration SET value='localhost:8082'
WHERE name IN ('PS_SHOP_DOMAIN','PS_SHOP_DOMAIN_SSL');
UPDATE ps_shop_url SET domain='localhost:8082', domain_ssl='localhost:8082';
" prestashop
Podsumowanie
Docker przekształca rozwój PrestaShop z kruchego doświadczenia z jedną wersją w powtarzalny przepływ pracy z wieloma wersjami. Początkowa konfiguracja zajmuje jedno popołudnie. Potem możesz uruchomić dowolną wersję PrestaShop w kilka minut, testować moduły na wszystkich wspieranych wersjach jednocześnie i udostępnić dokładnie takie samo środowisko swojemu zespołowi.
Zacznij od podstawowej konfiguracji z jednym kontenerem. Gdy poczujesz się pewnie, dodaj więcej wersji, phpMyAdmin, Mailpit i Xdebug. Pliki compose z tego poradnika to przetestowane w produkcji wzorce z naszej własnej infrastruktury. Skopiuj je, dostosuj i rozbudowuj.
Repozytorium PrestaShop Docker na GitHub to doskonałe źródło informacji o aktualizacjach oficjalnych obrazów i najlepszych praktykach.
More guides available
Browse our knowledge base for more practical PrestaShop tutorials, or reach out if you need help.