Knowledge Base Guide

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 -v i 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/prestashop na 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

ZadaniePolecenie
Uruchom wszystkie kontenerydocker compose up -d
Zatrzymaj wszystkie kontenerydocker compose down
Zatrzymaj i usuń wszystkie danedocker compose down -v
Pokaż logidocker compose logs -f
Wyczyść cache PSdocker exec CONTAINER rm -rf /var/www/html/var/cache/*
MySQL CLIdocker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop
Eksportuj bazę danychdocker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql
Importuj bazę danychdocker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql
Wejdź do konteneradocker exec -it CONTAINER bash
Sprawdź zużycie zasobówdocker stats --no-stream
Przebuduj po zmianach Dockerfiledocker compose up -d --build
Uruchom konsolę PrestaShopdocker exec CONTAINER php bin/console cache:clear --env=prod
Uruchom Composer w moduledocker 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_SERVER musi 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 — dodaj command: --default-authentication-plugin=mysql_native_password do 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 localhost i 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.

Ładowanie...
Powrót do góry