Docker to w mojej opinii najlepsze lokalne środowisko programistyczne dla developerów WordPress. Do lokalnego programowania można używać po prostu lokalnie zainstalowanego stacka, np. LAMP, opakowanego zazwyczaj w wygodne wrappery takie jak Xampp, Wamp czy MAMP, Vagranta, albo właśnie Dockera. W tym artykule dowiesz się jak szybko i bezboleśnie stawiać środowiska lokalne na tym silniku, które po prostu działają.

To nie jest poradnik dotyczący Dockera taki jak wszystkie inne. Kiedy ja poznawałem tą technologię, było mi bardzo ciężko zrozumieć dlaczego Docker działa w ten sposób i jak go używać. Sposób podawania wiedzy w tych wszystkich artykułach sprawia, że zastanawiasz się czy na pewno ten soft ułatwia pracę, a nie ją utrudnia.

Dzieje się tak dlatego, że wszyscy tłumaczenie Dockera zaczynają od CLI (czyli Command Line Interface) i dopiero później przechodzą do Docker Compose. Myślę, że spora część osób, zniechęcona, nigdy nie dociera do tego miejsca. Dlatego my zaczniemy od Compose i na żywym przykładzie zobaczysz, że nie jest to takie straszne. Ja osobiście nie miałem potrzeby korzystania z CLI praktycznie ani razu.

Musisz też wiedzieć, że ja przeszedłem przez typową ścieżkę środowisk lokalnych, przez Wamp i Vagrant i na Dockerze skończywszy. Polecam więc to rozwiązanie zarówno do amatorskiej pracy jak i tej bardziej profesjonalnej.

Zacznijmy jednak od początku.

Dlaczego Docker jest lepszy niż inne środowiska

Jest kilka zalet i przewag przy użyciu środowiska dockerowego.

Porządek

Wszystkie rzeczy, które są wymagane do uruchomienia strony są trzymane wewnątrz kontenera. Nie musisz mieć zainstalowanego na swoim komputerze ani Apache, ani PHP, ani MySQL, ani nic innego.

Każda strona jest odseparowana i działanie jednej nie ma kompletnie żadnego wpływu na działanie drugiej.

Również kiedy jakiś projekt staje się zbędny to po prostu usuwasz kontenery, wolumeny i sieć, usuwasz pliki i zapominasz, że miałeś coś takiego na komputerze.

Szybka i prosta konfiguracja

Szczególnie ważne kiedy musisz zarządzać projektami z dużymi rozbieżnościami co do wymogów środowiskowych. Kiedy jedna strona działa na PHP 5.2 z określonymi rozszerzeniami, a druga na PHP 7.2 z jeszcze innymi to problem nie występuje w ogóle kiedy używasz Dockera. Są to osobne kontenery, w których robisz co chcesz.

O wiele łatwiej jest pracować na środowisku zbliżonym do produkcyjnego.

Praca na obrazach

Kiedy zawsze zaczynasz od jakiegoś punktu startowego to bez sensu jest wykonywać powtarzalne prace. W Dockerze możesz utworzyć swój własny obraz i podczas stawiania każdego kolejnego projektu mieć już gotowe, skonfigurowane środowisko.

Więcej o obrazach przeczytasz poniżej.

Instalacja Docker

Docker powstał głównie dla środowisk UNIXowych i przez dłuższy czas instalacja go na innych OS była mocno utrudniona lub wręcz niemożliwa. Teraz mamy możliwość instalacji na wszystkich najpopularniejszych systemach, z którymi Docker całkiem dobrze się dogaduje.

Ze względu na to, że ja pracuję na Windows mogę się wypowiedzieć na temat tej platformy. Docker najlepiej działa na Windows 10 PRO. To dlatego, że edycja PRO ma możliwość używania Hyper-V – Microsoftowego środowiska do wirtualizacji. Jeśli jednak masz inną edycję, np. Home to nie martw się. Docker też będzie działał, jednak będzie wykorzystywał VirtualBoxa (co oznacza nieco mniejszą wydajność).

Niezależnie od systemu i edycji wystarczy, że ściągniesz i zainstalujesz wygodną paczkę, która ma w sobie wszystkie potrzebne rzeczy. Wersja Dockera jaka nas interesuje to Community Edition, która jest darmowa.

Pobierz Docker CE

Podczas instalacji upewnij się, że zainstalowałeś Docker Compose. Jeśli jednak nie widziałeś takiej opcji, odsyłam Cię do artykułu wyjaśniającego jak zainstalować Docker Compose.

Jak działa Docker

Działanie Dockera postaram się wyjaśnić w jak najbardziej przystępny sposób, więc nie będę zagłębiał się we wszelkie tajniki.

Docker to nic innego implementacja idei konteneryzacji. Oznacza to, że aplikacja składa się z wielu kontenerów (containers), które komunikują się ze sobą. Wiesz już zatem skąd te kwadraciki w logo.

Kontener to pojedyncza składowa aplikacji. W naszym przypadku to np. baza danych, serwer, narzędzia do debugowania.

A skąd Docker wie co w tych kontenerach ma się znajdować? Ano wie, bo ma dostępne obrazy (images). O obrazach możesz myśleć jak o skonfigurowanych środowiskach. Taki np. obraz z MySQL zawiera oczywiście zainstalowany i skonfigurowany MySQL, gotowy do użycia. Kontenery to nic innego jak działające instancje obrazów.

Cała nasza aplikacja zawierać będzie kilka kontenerów współgrających ze sobą.

Od razu może nasunąć ci się pytanie jak w takim razie wygląda edycja plików, skoro wszystko jest zamknięte w kontenerach w maszynie wirtualnej. Otóż mamy dostępne coś takiego jak wolumeny (volumes), które są współdzielone między hostem (twoim komputerem), a guestem (czyli maszyną wirtualną). Można skonfigurować ich dowolną ilość, a wymiana danych następuje bardzo sprawnie. Czego niestety nie można powiedzieć o Vagrancie.

Tutaj też warto wspomnieć o różnicy między Docker CLI, a Docker Compose. Każdy kontener może być uruchomiony z linii poleceń i być połączony z innymi kontenerami. Tylko kto o zdrowych zmysłach przetrzymuje wielką komendę, którą uruchamia za każdym razem kiedy zaczyna pracę? Tutaj wchodzi Docker Compose ze swoim plikiem konfiguracyjnym: docker-compose.yml. W tym pliku, w języku YAML przetrzymujemy całą konfigurację projektu, wszystkie serwisy (services) bazujące na obrazach, wszystkie zależności, porty i wolumeny. Wygodnie i jak na tacy.

Prześledźmy teraz jak z Dockera korzystać.

Najważniejsze komendy

Praca z Dockerem odbywa się przez wiersz poleceń, niezależnie od tego czy korzystasz z Docker CLI czy Docker Compose. Nie jest to jednak trudne i przy korzystaniu z Compose do zapamiętania jest tylko kilka komend.

Aby uruchomić swoje środowisko, nie ważne czy po raz pierwszy czy kolejny używamy:

docker-compose up [-d]

Parametr -d jest całkowicie opcjonalny. Powoduje on, że kontenery będą działać w tle. Jeśli chcesz mieć odblokowane okno terminala, to używaj tego parametru. W przypadku kiedy parametr ominiesz okno będzie wyświetlać komunikaty z kontenerów (np. Access log Apache).

Po skończonej pracy wystarczy wywołać:

docker-compose stop

Cała praca w zostanie zatrzymana w kontenerach, nie tracimy więc ani danych w bazie, ani zmian w plikach.

Gdybyśmy jednak chcieli usunąć dane jakiegoś projektu, trzeba użyć komendy:

docker-compose rm

Po takiej operacji można usunąć pliki z dysku, lub wywołać ponownie polecenie up, aby z powrotem postawić świeży projekt.

Wszystkie powyższe komendy uruchamiamy z katalogu, w którym siedzi docker-compose.yml lub z dowolnego katalogu poniżej.

Docker z kontenerem WordPress

WordPress posiada swój oficjalny obraz w Docker Hub. Jest to obraz zawierający w sobie pliki WordPressa oraz PHP i silnik serwera. Jak widzisz na podanej stronie masz do wyboru kilkadziesiąt wersji w różnych konfiguracjach wersji PHP i serwera.

Minimalna konfiguracja jest jednak bardzo prosta. Potrzebujemy jedynie obrazu z WordPressem i bazą danych.

version: '2'
services:
    wordpress:
        image: wordpress
        links:
            - db:mysql
        ports:
            - 80:80
        domainname: localhost
        hostname: localhost
        volumes:
            - ./public:/home/underdev/websites/wpart.pl
        environment:
            WORDPRESS_DB_PASSWORD: docker
        depends_on:
            - db

    db:
        image: mysql
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: docker

To wszystko czego potrzebujesz. Wrzuć ten kod w katalog z projektem w plik docker-compose.yml i uruchom projekt komendą docker-compose up. Docker ściągnie za pierwszym razem wszystkie brakujące obrazy i uruchomi projekt. Za drugim razem zajmie to o wiele mniej czasu.

Po chwili w twoim katalogu projektu zostanie utworzony katalog public ze wszystkimi plikami WordPress, a pod adresem localhost ujrzysz ekran instalacyjny WordPress. Proste, prawda?

Wersje obrazów

Wspomniałem o różnych wersjach obrazów, nie ma nic prostszego niż użycie ich.

Zakładając, że chcesz korzystać z WordPress w najnowszej wersji, na PHP 7.2 i NGINX. W definicji obrazu wystarczy podać:

image: wordpress:4.9-php7.2-fpm

A może zamiast MySQL chcesz mieć MariaDB w wersji 10.1.34?

image: mariadb:10.1.34

Aktualne wersje obrazów zawsze znajdziesz w Docker Hub.

Mój Dockerowy stack do pracy z WordPress

Powyższy bazowy stack w zasadzie jest gotowy do pracy i można z powodzeniem go używać. W mojej firmie jednak poszedłem o krok dalej i rozbudowałem projekt o kilka przydatnych serwisów oraz przygotowałem plik konfiguracyjny tak, aby łatwo było projektem zarządzać. Oto mój docker-compose.yml z którego korzystam na codzień.

version: '2'
services:
    wordpress:
        build:
            context: ./
            dockerfile: ./Dockerfile
        links:
            - db:mysql
            - mailhog
        ports:
            - 80:80
        domainname: env.localhost
        hostname: env
        volumes:
            - ./public:/home/underdev/websites/wpart.pl
            - ./wp.sh:/home/underdev/websites/wpart.pl/wp.sh
            - ./phpconf.ini:/usr/local/etc/php/conf.d/phpconf.ini
        environment:
            WORDPRESS_DB_PASSWORD: docker
        depends_on:
            - mailhog
            - db

    mailhog:
        image: mailhog/mailhog
        ports:
            - 1025:1025
            - 8025:8025

    wpcli:
        image: tatemz/wp-cli
        volumes_from:
            - wordpress
        links:
            - db:mysql
        command: "sh wp.sh"

    db:
        image: mysql
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: docker

Jak widzisz projekt jest o wiele bardziej rozbudowany. Prześledźmy po kolei co w nim jest i jak z tego korzystać.

WordPress

Jak widzisz serwis WordPress to niestandardowy build. Korzystamy tutaj z pliki Dockerfile, którym możemy po prostu rozszerzać inne obrazy. Sam oficjalny obraz WordPress działa na takiej samej zasadzie.

Dla przejrzystości projektu nie pokażę tutaj treści Dockerfile (możesz go zobaczyć na GitHub), napiszę jedynie, że instalowane są w nim wszystkie niezbędne rozszerzenia PHP i konfigurowany jest Mailhog oraz Xdebug.

Wolumenami zarządzam w taki sposób, że każda niestandardowa wtyczka (np. taka nad którą właśnie pracuję) ląduje w katalogu plugins/plugin-slug, analogicznie sprawa ma się w motywami. Zależności tzw. 3rd party instalowane z repozytorium zostają w katalogu public.

Na zewnątrz wyciągnięty jest również plik phpconf.ini dla łatwego zarządzania konfiguracją PHP.

Mailhog

Bardzo przydatny kontener podczas pracy lokalnej. Jest to taki bardzo prosty serwer sendmailowy wraz z minimalistycznym klientem, który łapie wszystkie maile wysyłane z naszego WordPressa. Dzięki temu żaden mail nie jest faktycznie wysyłany i możemy podejrzeć jego treść.

Maile możemy przeczytać pod adresem localhost:8025 o ile nie zmieniliśmy portu. Na porcie 1025 działa serwer SMTP, którego możesz aktywować bardzo prostą wtyczką, jednak dzięki podmianie sendmail w Dockerfile nie jest to potrzebne.

WP-CLI

Kontener zawierający WP-CLI oraz odpalający plik wp.sh za każdym razem kiedy uruchamiasz środowisko. Przydatne, kiedy chcesz mieć pewność, że w WordPress jest zainstalowana jakaś wtyczka.

Baza danych

Standardowa konfiguracja MySQL na domyślnym porcie 3306.


Wszystkie pliki niezbędne do uruchomienia środowiska znajdziesz na GitHubie, w repozytorium, które specjalnie przygotowałem.

Sposób pracy z Docker

Ten rozdział zawiera odpowiedzi na pytania, które mogą się pojawić podczas korzystania z WordPressa na Dockerze oraz praktyki, które stosuję w swojej codziennej pracy.

Adresy stron lokalnych

Docker działa na dowolnym adresie lokalnym i na dowolnym porcie. Ja dla wygody korzystam z portu 80, aby nie ciągnąć w adresie zbędnych rzeczy.

Sugeruję korzystanie z adresu http://localhost i subdomen ponieważ nie trzeba za każdym razem wpisywać w plik hosts przekierowania (Firefox i tak potrzebuje takich wpisów).

Tak naprawdę to pierwsza instalacja WordPress sprawi, że ustawisz adres strony. Ja w swoich projektach korzystam z subdomen o wielu poziomach np. http://projekt.klient.localhost. Pozwala to na efektywne zarządzanie hasłami oraz orientację w projektach.

Uruchamianie wielu środowisk

Na Docker możesz mieć uruchomioną dowolną ilość projektów równocześnie. Problem jest tylko z portami, ponieważ z jednego portu nie może korzystać więcej niż jeden kontener. Dlatego, kiedy chcesz mieć dwa WordPressy działające równolegle, to muszą mieć one inne porty.

W praktyce łatwiej stopować jeden projekt i uruchamiać drugi.

Jeśli chodzi o projekty nie uruchamiane jednocześnie to możesz mieć ich dowolną ilość. Nazwa projektu oraz sieci przyjmie nazwę katalogu z projektem.

Zauważ, że Docker może konfliktować z już działającymi usługami na twoim komputerze. Jeśli masz zainstalowanego Wampa lub podobny soft, to najprawdopodobniej nie uruchomisz na domyślnym porcie MySQL, ale mogą konfliktować też inne rzeczy.

Migracja baz danych

Jak wiesz baza danych siedzi w swoim kontenerze. Jak więc najlepiej migrować bazy danych między środowiskiem lokalnym, a publicznymi serwerami? Polecam wtyczkę WP Sync DB lub Duplicator.

Dostęp do bazy danych

Do bazy danych można się dobrać conajmniej na dwa sposoby:

  • Dodając sobie serwis z phpMyAdmin
  • Łącząc się bazą danych z hosta

Polecam to drugie rozwiązanie i jeśli korzystasz z Windows to najlepiej jest użyć HeidiSQL.

Dane do połączenia to:

  • Typ: MySQQL (TCP/IP)
  • IP: 127.0.0.1
  • Użytkownik: root
  • Hasło (z pliku docker-compose.yml): docker
  • Port (z pliku docker-compose.yml): 3306

Migracja całych środowisk

Jeśli chcesz wysłać swojemu współpracownikowi lokalne środowisko wystarczy je spakować i przesłać. Tak po prostu, cały katalog projektu. Na innym komputerze wypakowujemy archiwum, uruchamiamy docker-compose up i pozostaje tylko synchronizacja bazy danych.

Podsumowanie

Nie wyobrażam sobie powrotu do innych środowisk wirtualnych. Docker jest najlepszy pod względem organizacyjnym jak i wydajnościowym.

Spróbuj uruchomić na nim WordPressa i koniecznie daj znać jak ci się podoba taki sposób!

Opublikowany przez Kuba Mikita

Miłośnik minimalizmu i prostoty, bo nie potrafi stworzyć niczego ładnego. Ma kołdrę, na której wypisane są funkcje WordPressa.

29 odpowiedzi na “Docker dla WordPress – kompletny poradnik”

  1. Cześć,

    Super artykuł, mam jednak problem z WP-CLI, a dokładnie z poleceniami wpisanymi do pliku wp.sh – nie wykonują się podczas uruchamiania kontenera.

    Po uruchomieniu kontenera, te same polecenia wpisane z konsoli wykonują się poprawnie,

  2. Cześć, zabrakło mi jednej rzeczy w artykule. Zachwalasz, że nie wyobrażasz sobie teraz pracy na WordPressie bez Dockera, ale tak naprawdę jaka jest przewaga nad np. takim MAMPem
    Jestem freelancerem, nikomu nie muszę wysyłać kontenerów bo sam nad projektem pracuję. Możesz wypisać jakie to ma wymierne korzyści?
    Pozdrawiam

    1. No to będziemy debugować :) Docker wstaje poprawnie? Możesz to sprawdzić poprzez uruchomienie go bez flagi `-d` i zobaczyć czy kontener wordpress nie printuje czegoś w stylu „exited with error 1”.

      Dodatkowo, co pokazuje przeglądarka pod localhost? Może po prostu nie masz tej domeny skierowanej na 127.0.01.

      1. Mam wordpress_1 | MySQL Connection Error: (2054) The server requested authentication method unknown to the client i docker_wordpress_1 exited with code 1

        1. O widzisz, już coś wiemy. Kontener wordpress nie wstaje, bo kontener db prawdopodobnie nie wstał. Być może jakiś konflikt z portami lub jeszcze czymś innym.
          Czy kontener db podaje jakieś błędy tego typu?

          1. Odnośnie tego kontenera mam:
            db_1 | 2018-06-27T19:15:25.564222Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using –skip-symbolic-links (or equivalent) is the default. Consider not using this option as it’ is deprecated and will be removed in a future release.
            db_1 | 2018-06-27T19:15:25.564310Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.11) starting as process 1
            db_1 | mbind: Operation not permitted

          2. Udało się – zmieniłem:
            db:
            image: mysql
            na:
            db:
            image: mysql:5.7.22

  3. „Kontener to pojedyncza składowa aplikacji. W naszym przypadku to np. baza danych, serwer, narzędzia do debugowania.”
    „Jak wiesz baza danych siedzi w swoim kontenerze. ”
    Jesteś pewien, iż każdy „serwis” to oddzielny kontener? I ty w swoim configu uruchamiasz aż 4 kontenery? Bo do tej pory, byłem przekonany iż kontener, to właśnie twój konfig – tak jak prawdziwy kontener wypełniasz go czym chcesz (jaki chcesz serwisami), ale działa jeden kontener.

  4. Bardzo fajny artykuł, dzięki.

    Niestety nie mogę sobie poradzić z mapowaniem voluminów w windowsie

    Próbowałem coś takiego, ale nie działa:

    volumes:
    – G://wordpress-docker//

    Będę wdzięczny za podpowiedź?

    1. To wygląda jak bardzo rozległy volumen, ostrożnie.

      Nie działa bo prawdopodobnie dysk partycja G nie jest udostępniona Dockerowi. Jeśli korzystasz z Docker dla Windows to w ustawieniach popatrz w Shared Drives.

      1. Hmm OK, może nie do końca rozumiem zasady Dockera, to może inaczej zadam pytanie…
        Mam docker toolbox, zainstalowałem docker na g:/Docker Toolbox

        Załużmy, że padnie mi Windows i partyca systemowa, czy moje obrazy i kontenery są bezpieczne?

        1. Nie wiem :) znam jednak przypadki, że środowiska były przenoszone na zewnętrznym dysku między komputerami i wszystko działało bez problemu. W praktyce może być różnie, bo Docker zapisuje jednak swój obraz w określonym miejscu, wydaje mi się, że to maszyna wirtualna. Jeśli jednak bazę danych mapujesz sobie do plików i takiego WordPressa do katalogu public to nic Ci nie zagraża.

  5. „Pobierz środowisko WordPress na Docker” link nie działa :(

  6. Link do samego Docera w wersji CE nie działa. Do tego aktualna wersja 2.0.0.3 wymaga juz Win 10 Pro ;(

    1. Ogólnie Windows w wersji PRO jest lepiej wspierany nawet w starszych wersjach, bo ma swoją wirtualizację Hyper-V. W innym przypadku Docker działa na maszynie w VirtualBoxie, co przekłada się oczywiście na wydajność.

      Link do pobrania zaktualizowałem (obecnie wymaga zalogowania, aby pobrać paczkę).

  7. Przepraszam ze głowę zawracam, ale czuje się kosmitą w tym całym słownictwie,

    Po pierwsze, mam jakiś problem z localhostem, nic tam nie wchodzi jak instalowałem xampp to musiałem zmienić port, i było na localhost:81

    Po pobraniu docker toolbox wszystko ładnie tylko po uuchomieniu mi wyskakuje „default machine with IP 192.168.99.100| (co nijak nie podchodzi pod localhost, musze po prostu to IP wpisać i już). Chyba że to gdzies się zmienia?

    Uruchamiam tego dockera-composera z różnymi konfiguracjami,

    W tej Twojej konfiguracji siada na:
    Error: Cannot locate specified Dockrfile: ./Dockerfile

    W pierwotnej wordpressa, uruchamia się stronka pod tym ip http://192.168.99.100/ ale, „Error establishing a database connection”, zmieniłem w tym cmoposer słówko localhost na to moje IP i lipa nie działa, dalej ten error

    No i może najważniejsze pytanie, gdzie u licha są te pliki, bo bym sobie ten error w plikach może ogarnął?
    Rozumiem że to coś wirtualnego ale pisałeś że gdzieś są one dostepne mimo wszystko? Tak po ludzku dla zielonych?

    1. To sporo problemów :)

      Muszę przyznać, że my przez niestabilność takich środowisk i problemy z bazą porzuciliśmy ostatnio wirtualizowanie na Docker Compose. W zamian tego używamy narzędzia Local by Flywheel w wersji beta, które wydaje się być o wiele stabilniejsze.

Możliwość komentowania została wyłączona.