Jak pracować z Laravel na platformie Docker?
Obecnie możemy zauważyć, że wiele firm w swojej działalności używa Docker’a do wsparcia pracy zespołów deweloperskich. W moim artykule chciałbym przybliżyć możliwości Docker’a oraz przekonać do korzystania z tej platformy do pracy z Laravel. Nie jest moim celem, zrobienie z programisty DevOps’a, dlatego też nie będę za bardzo wnikał w szczegóły działania Docker’a oraz w jego budowę. W artykule wszelkie instalacje i przykładowe wykonania komend wykonywane były w środowisku Ubuntu. Jeśli używasz innego systemu to również ten artykuł pozwoli Ci opanować pracę z Docker’em.
Czym jest Docker?
Początkowo był to wewnętrzny projekt firmy dotCloud rozwijany przez Solomona Hykesa, który miał usprawnić proces tworzenia projektów w firmie. W 2013 roku projekt został udostępniony publicznie i zaczął zyskiwać coraz więcej użytkowników. Jako programista mogę określić Docker’a, jako platformę pozwalającą na uruchomienie środowiska pracy w zwirtualizowanym środowisku kontenerów. Gdzie kontener posiada:
- system plików (rootfs)
- procesy
- pamięć urządzenia
- porty sieciowe
W środowisku Linux kontenery uruchamiane są jako procesy. Dzięki temu obciążenie środowiska jest mniejsze, co pozwala na używanie Docker’a zarówno w środowisku deweloperskim, jak i produkcyjnym. Poza tym możliwość stawiania platform z różnymi kontenerami w ramach jednego systemu pozwala na lepsze odwzorowanie architektury mikroserwisów.
Jeśli chcecie dowiedzieć się więcej na temat architektury i możliwości Dockera, proponuję zapoznać się z jego dokumentacją.
Instalacja Docker’a
Poniżej przedstawię przebieg instalacji w systemie Ubuntu. Jeśli posiadacie inny system to odsyłam do opisu instalacji dla pozostałych systemów.
Na początku aktualizujemy bazę paczek:
$ sudo apt-get update
Instalujemy wymagane do dalszej instalacji paczki:
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
softwares-common
Dodajemy GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Sprawdzamy, czy mamy poprawny fingerprint:
$ sudo apt-key fingerprint 0EBFCD88
Dodajemy repozytorium Docker’a dla x86_64 / amd64:
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
Ponownie aktualizujemy bazę paczek:
$ sudo apt-get update
Instalujemy edycję CE Docker’a:
$ sudo apt-get install docker-ce
Sprawdzamy, czy Docker został zainstalowany poprawnie:
$ sudo docker run hello-world
Docker dla środowiska PHP
Dość ciekawym rozwiązaniem dla programistów używających Laravel, ale również innych frameworków bądź aplikacji napisanych w PHP, a chcących pracować z Docker’em jest narzędzie Laradock. Najprościej możemy określić Laradock jako zestaw narzędzi (aplikacji, oprogramowań), przygotowanych do stworzenia środowiska pracy dla programistów PHP.
Główne narzędzia, z których możemy korzystać to:
- Bazy: MySql, PostgreSql, MongoDB, MariaDB
- Cache: Redis, Memcached, Aerospike
- Serwery: Apache, Nginx, HHVM
- “Kompilatory”: PHP FPM, HHVM
- Proxy: HAPProxy
- Kolejkowanie: RabbitMQ, PHP Worker, Beanstalkd
- Inne: PhpMyadmin, Varnish, Jenkins, Laravel Echo, Elasticsearch...
W zależności od potrzeb możemy postawić środowisko Docker’a dla jednej aplikacji bądź wielu. W swoim artykule przedstawię możliwość wykorzystania jednej instancji Docker’a do obsługi n aplikacji Laravel. Na początek stwórzmy sobie katalog, w którym będziemy trzymali środowisko pracy oraz nasze aplikacje.
$ cd ~/
$ mkdir workspace
Zainstalujmy Laradock:
$ git clone https://github.com/Laradock/laradock.git
Wchodzimy do katalogu laradock i tworzymy plik konfiguracyjny, który zawiera parametry pracy Docker'a oraz dostępnych narzędzi (tutaj będziemy ustawiali hasło do bazy danych, Redis’a, wersję PHP etc.):
$ cd laradock
$ cp env-example .env
Edytujemy plik .env:
$ vim .env
Ustawiamy potrzebne parametry:
PHP_VERSION=7.2
WORKSPACE_INSTALL_PYTHON=true
MYSQL_VERSION=5.7
MYSQL_USER=root
MYSQL_DATABASE=db_name
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=secret
Warto tutaj wspomnieć, że istnieje również plik konfiguracyjny Docker’a zawierający ustawienia, na podstawie których budowane będą kontenery i działały poszczególne serwisy o nazwie docker-compose.yml.
Możemy dokonać pierwszego uruchomienia środowiska pracy, dość standardowego dla programistów PHP:
$ docker-compose up -d nginx mysql redis workspace phpmyadmin
W poniższy sposób może sprawdzić, działanie uruchomionych kontenerów.
$ docker-compose ps
Wynikiem powyższego polecenia będzie wyświetlenie tabeli kontenerów, z informacją o ich ID, poleceniu, portach na jakich pracują oraz statusie.
Oczywiście nasza aplikacja działa już pod urlem:
http://localhost
Natomiast phpmyadmin pod urlem
http://localhost:8080
Instalacja Laravel w środowisku Docker
Na początku przejdźmy do powłoki środowiska pracy:
$ docker-compose exec --user=laradock workspace bash
laradock@bd7fc09891b0:/var/www$
Stwórzmy nasz pierwszy projekt:
$ composer create-project laravel/laravel project1
$ cp .env.example .env
$ vim .env
Ustawmy host’y do baz danych:
DB_HOST = mysql
REDIS_HOST = redis
Doinstalujmy wymaganą paczkę i zakończmy instalację aplikacji:
$ composer require predis/predis
$ php artisan migrate
$ npm install
Aplikacja jest już zainstalowana i dostępna pod urlem:
http://localhost
Ustawienie własnej domeny
Najlepszym rozwiązaniem dla programistów jest ustawianie własnych domen, pod projekty nad którymi pracujemy w środowisku lokalnym. Aby ustawić sobie domenę pod nasz projekt musimy wykonać kilka dość prostych czynności.
1) Musimy określić pod jakim IP pracuje Docker. W tym celu należy wykonać poniższe polecenie:
$ docker network inspect bridge | grep "Gateway" | awk '{ print $2 }';
Jako wynik zapytania otrzymujemy IP:
“172.17.0.1”
2) Określmy nazwę naszej domeny i przypiszmy ją do powyższego IP:
$ vim /etc/hosts
172.17.0.1 project1.test
3) Zmodyfikujmy konfigurację hosta, aby był on powiązany z naszą domeną:
server_name project1.test;
root /var/www/project1/public;
4) Na koniec zrestartujmy serwer:
$ docker-compose restart nginx
5) Pod poniższym adresem powinna już być widoczna nasza strona:
http://project1.test
Konfiguracja “zadań w tle”
Poprawna instalacja frameworka Laravel wymaga również ustawienia crontaba pod wykonywanie schedule’ra.
$ cd ~/workspace/project1
vim workspace/crontab/laradock
* * * * * laradock php /var/www/project1/artisan schedule:run >> /dev/null 2>&1
Aktualizacja zmian:
$ docker-compose build workspace
$ docker-compose restart workspace
Aliasy
Aliasy pozwalają na szybszą pracę z poziomu konsoli.
$ cd ~/workspace/laradock
$ vim workspace/aliases.sh
Po wejściu do pliku zobaczymy listę aliasów. Oczywiście zawsze możemy dodać własne.
...
alias art="php artisan"
alias artisan="php artisan"
alias migrate="php artisan migrate"
alias refresh="php artisan migrate:refresh"
alias rollback="php artisan migrate:rollback"
alias seed="php artisan:seed"
alias serve="php artisan serve --quiet &"
...
Po każdej zmianie należy przebudować i zrestartować kontener. W tym przypadku workspace.
$ docker-compose build workspace
$ docker-compose restart workspace
Oczywiście to nie wszystkie możliwości Laradock, aczkolwiek te powyżej opisane wystarczą, aby rozpocząć przygodę z Docker’em.
Jeśli jeszcze nie używasz Docker’a jako platformy dla swojego środowiska pracy to czas to zmienić! :)