.

Rozpocznij swoją przygodę z docker-console

Osoby śledzące nasz blog, zapewne wiedzą, że w Droptica używamy Dockera, który świetnie się spełnia przy okazji Drupal developmentu ze względu na poszerzenia środowiska.

Pisaliśmy już o tym, jak można w łatwy sposób uruchomić projekt za pomocą naszej aplikacji docker-drupal (https://www.droptica.pl/blog/poznaj-aplikacje-docker-drupal-w-15-minut-docker-i-przyklad-projektu-na-drupal-8/).

Kolejnym krokiem w rozwoju z dockerem jest aplikacja docker-console, która jest nowszą wersją docker-drupal i tak jak ona powstała z myślą, aby w łatwiejszy i sprawniejszy sposób budować środowisko do pracy z Drupalem. Jak to wszystko działa? Postaram przybliżyć Wam to w tym artykule, a ponieważ w Droptica pracujemy na systemie operacyjnym Linux (głównie na Ubuntu), dlatego przedstawione tu komendy wykonywane były na Ubuntu 16.04.

Instalacja Dockera

Oczywiście całą naszą przygodę musimy rozpocząć od instalacji Dockera, o której mogliście przeczytać wcześniej. Dla porządku przypomnę, że w tym celu należy wykonać poniższe komendy:
 

wget -qO- https://get.docker.com/ | sh 

sudo usermod -aG docker $(whoami) 

sudo apt-get -y install python-pip

sudo pip install docker-compose

Instalacja docker-console

Następnym krokiem jest instalacja aplikacji docker-console. Aby to zrobić, należy zacząć od instalacji pakietu python-pip, który pozwala na prostą instalację oraz upgrade naszej aplikacji:

sudo apt-get update && sudo apt-get -y install python-yaml python-setuptools python-pip python-dev build-essential 

Teraz nie pozostaje nam nic innego jak instalacja samego docker-console, której dokonać można za pomocą tej prostej komendy:

sudo pip install docker-console 

Po instalacji będziecie mieć dostępne w konsoli nowe polecenie docker-console (lub krócej - dcon), po którego uruchomieniu powinniśmy otrzymać listę dostępnych opcji oraz akcji:

dcon

Inicjalizacja nowego projektu

Teraz możemy rozpocząć naszą przygodę z docker-console. Na początku zakładamy, że nie mamy dostępnego żadnego projektu z Drupalem, więc musimy założyć nowy. Możliwe jest to dzięki poleceniu:

docker-console init --tpl drupal7 

drupal7init

Po jego wykonaniu powinna się nam wygenerować cała struktura projektu (taka jak ta na obrazku powyżej), która pomoże nam sprawnie zorganizować projekt. Wspomniane wcześniej polecenie służy do wygenerowania struktury projektu dla Drupala w wersji 7, jednak nic nie stoi na przeszkodzie, abyście użyli polecenia, które wygeneruje projekt dostosowany do Drupala 8:

docker-console init --tpl drupal8 

Ja pozostanę przy projekcie z Drupalem 7, dlatego też kolejnym krokiem będzie pobranie tej wersji Drupala ze strony: https://www.drupal.org/project/drupal i rozpakowanie zawartości do katalogu app.

Start kontenerów

Teraz żeby zacząć pracę z projektem, konieczne będzie jeszcze uruchomienie kontenerów, które zawierają usługi niezbędne do działania strony (np. apache, mysql, phpmyadmin, nginx - w tradycyjnym systemie pracy musielibyście mieć je zainstalowane lokalnie na swoim komputerze). Wszystkie usługi, których będziemy potrzebować podczas pracy, powinny być dodane i skonfigurowanie w pliku docker-compose.yml (plik dla tego projektu pokazany jest poniżej i znajduje się w głównym katalogu projektu). My nasze pliki docker-compose budujemy w oparciu o wersję 1. Jeżeli chciałbyś dowiedzieć się więcej o jego budowie, polecam zajrzeć na stronę projektu: https://docs.docker.com/compose/compose-file/compose-file-v1/ Poniższa konfiguracja spowoduje uruchomione się trzech kontenerów:

  • web: apache i PHP,
  • mysql,
  • phpmyadmin.

docker-compose

W celu uruchomienia kontenerów należy w konsoli wpisać:

dcon up 

Po chwili (za pierwszym razem może to potrwać trochę dłużej, ponieważ wszystkie obrazy będą musiały się pobrać) powinniście w konsoli zobaczyć efekt podobny do tego:

dcon-up

Strona jest zbudowana, możemy ją podejrzeć, wchodząc na adres IP kontenera. Sprawdzenie adresu IP wykonujemy komendą "docker inspect":

docker inspect --format "{{ .NetworkSettings.IPAddress }}" dockerconsoleprojectexample_web_1 

W moim przypadku był to adres http://172.17.0.23/ (adres może być różny, zależnie od działających kontenerów).

Instalacja Drupala

Zanim rozpoczniemy instalację drupala, najpierw należy wykonać komendę:

dcon set-permissions

Komenda ta ustawi odpowiednie uprawnienia na plikach i katalogach w projekcie, dzięki czemu unikniemy błędów podczas instalacji.

Wchodząc teraz na adres zwrócony przez "docker inspect", powinien nam się pokazać ekran instalacyjny Drupala, który nie różni się niczym od standardowego, dlatego też nie będę się tutaj rozpisywał na temat każdego kroku. Jednak ważne jest, aby przy konfiguracji bazy danych użyć danych z pliku docker-compose.yml. Tak jak pokazano to na ilustracjach poniżej, a więc nazwa bazy danych zgodna z parametrem MYSQL_DATABASE, użytkownikiem (może być podany w MYSQL_USER z hasłem MYSQL_PASSWORD lub root z hasłem podanym w MYSQL_ROOT_PASSWORD), konieczne jest również podanie hosta zgodnego z nazwą kontenera bazy danych, gdyż w innym wypadku nie uda nam się uzyskać z nią połączenia.

mysql

install-Drupal

Strona uruchomiona

Teraz kiedy strona jest już gotowa i dostępna pod adresem IP kontenera web, możecie spokojnie wprowadzać na niej zmiany i uzupełniać ją treścią. Musicie jednak pamiętać, że wszystko to dzieje się w kontenerach Dockera i jeżeli je usuniecie to baza danych zostanie utracona. Nie dotyczy to plików aplikacji ponieważ są one jedynie zmapowane z katalogu lokalnego do katalogu app w kontenerze. Jeśli chcecie mieć bezpieczną bazę danych, nawet w przypadku usunięcia kontenerów, powinniście również zmapować pliki bazy do lokalnego katalogu. Będą one wtedy na bierząco synchronizowane z katalogiem w kontenerze. Co ważne - baza danych nie jest usuwana jeżeli kontenery zostaną tylko zatrzymane np. w przypadku wyłączenia komputera. Wówczas możemy je ponownie uruchomić poleceniem "dcon up". W tym przykładzie wykonamy zrzut bazy danych, której będziemy mogli używać później przy kolejnym zbudowaniu projektu.

Ponowne zbudowanie projektu

Pierwszą rzeczą jaką teraz powinniście zrobić to zrzut bazy danych i plików. Ja w tym celu wykorzystałem moduł backup and migrate (https://www.drupal.org/project/backup_migrate), ale możecie to zrobić w dowolny sposób. Ważne jest natomiast, aby te pliki skompresować do formatu tar.gz i nazwać kolejno database.sql.tar.gz oraz files.tar.gz. Następnie plik z bazą danych umieszczamy w katalogu app_databases, a paczkę z plikami w katalogu app_files.

Jeżeli do wykonania zrzutu bazy danych chcielibyście się dostać do kontenera z phpmyadminem, to oczywiście możecie to zrobić, podając w przeglądarce tym razem adres IP tego kontenera i logując się danymi, które już wcześniej pokazywaliśmy w pliku docker-compose.yml.

Do wykonania zrzutu bazy danych można też wykorzystać komendę:

dcon dump

Komenta ta wykonuje zrzut bazy danych i od razu kompresuje go do formatu tar.gz, a następnie umieszcza w katalogu app_databases. app_databases jest to domyślna lokalizacja ustawiona w DUMP_EXPORT_LOCATION w zmiennej DB w pliku dc_settings.py, którą można zmienić w razie potrzeby.

Otrzymany w ten sposób plik ze zrzutem bazy jest gotowy do importu, wystarczy zmienić mu uprawnienia oraz nazwę na database.sql.tar.gz.

Jeśli nie wykonywaliście poprzednich kroków, możecie pobrać mój projekt oraz bazę danych i pliki. W ten sposób, po uprzedniej instalacji dockera, docker-compose i docker-console, będziecie mogli zacząć swoją przygodę z docker-console, z pominięciem tworzenia własnego projektu.

Repozytorium projektu: https://github.com/DropticaExamples/docker-console-project-example

Zrzut bazy danych: https://www.dropbox.com/s/tcfkgpg2ume17r3/database.sql.tar.gz?dl=0

Pliki projektu: https://www.dropbox.com/s/hl506wciwj60fds/files.tar.gz?dl=0

Aby sklonować mój projekt i uruchomić kontenery z usługami, musiecie w swojej konsoli wywołać:
 

cd

git clone https://github.com/DropticaExamples/docker-console-project-example

cd docker-console-project-example 

git checkout docker-console-start 

cd app_databases wget https://www.dropbox.com/s/tcfkgpg2ume17r3/database.sql.tar.gz?dl=0 

cd ../app_files wget https://www.dropbox.com/s/tnl0ftfluyr5j7p/files.tar.gz?dl=0 

cd .. 

dcon up 

Natomiast jeśli wykorzystujecie projekt, który stworzyliście wcześniej na podstawie tego artykułu wystarczy wywołanie:

dcon up 

Chyba że już wcześniej mieliście odpalone te kontenery - w tym wypadku nie ma potrzeby uruchamiać ich ponowne (wywołanie polecenia dcon up w przypadku już utworzonych kontenerów, powinno pokazać tylko informację, że są one uruchomione i aktualne).

dcon_up-to-date

Jeżeli nie jesteście pewni, czy Wasze kontenery dockerowe są zbudowane i aktywne, możecie to sprawdzić poleceniem:

docker ps -a 

Jeśli wszystko przebiegło poprawnie, powinniśmy mieć uruchomione 3 kontenery:

  • web: apache i PHP,
  • mysql,
  • phpmyadmin.

Budowanie projektu

W tym kroku odtworzymy swoje środowisko pracy na podstawie plików i bazy danych, które wcześniej umieściliśmy w odpowiednich katalogach. Dzięki temu możemy stale pracować na środowisku jak najbardziej zbliżonym do produkcyjnego. Teraz możemy już zbudować stronę na działających kontenerach. W tym celu wpisujemy komendę:

dcon build 

Wcześniej ten krok nie był wywoływany ponieważ nie było potrzeby wykonywania sekwencji, która składa się na budowanie projektu(przy nowym projekcie nie ma jeszcze plików, a baza danych jest pusta). W przypadku tego konkretnego projektu jego budowanie składa się z:

  • kroku potwierdzającego, że budowanie ma się rozpocząć,
  • kopii settings,
  • czyszczenia bazy danych,
  • importu bazy danych,
  • rozpakowania plików,
  • czyszczenia cache (drush cc all),
  • wygenerowania linku do logowania (drush uli),
  • zmiany uprawnień do plików.

Dlatego w przypadku kiedy chcemy do projektu zaimportować bazę danych i pliki konieczne będzie wykonanie polecenia dcon build.

Strona gotowa

Strona jest zbudowana, możemy ją podejrzeć tak jak poprzednio, wchodząc na adres IP kontenera.

Docker-console-Drupal7

Podsumowanie

W ten oto sposób mamy szybko postawiony projekt, oparty o Dockera i docker-console. Za pierwszym razem może się wydawać, że to dość skomplikowana procedura, ale możecie mi uwierzyć, że czas poświęcony na naukę Dockera szybko się zwróci, gdy na projekcie będziemy chcieli szybko dodać nową usługę lub przetestować inne konfiguracje. Ten wpis oczywiście nie wyczerpuje tematu. W miarę dostępnego czasu, będziemy pisać więcej o docker-console.

Tymczasem polecam zapoznać się z readme, opisującym projekt na stonie: https://github.com/droptica/docker-console oraz w ramach ćwiczeń uruchomić projekt z Drupalem 8. Koniecznie dajcie nam znać jak Wam poszło z tym zadaniem :)

A my już niedługo podzielimy się z Wami nagraniem z DrupalCamp Wrocław 2017, gdzie między innymi o docker-console opowiadał Maciej Łukiański.

3. Najlepsze praktyki zespołów programistycznych