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:
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
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.
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:
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.
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).
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.
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.