20 lutego 2020

(nie) Tutorial Docker cz.1 testy PhpUnit

Witam, w niedawnym czasie zainstalowałem świeży system na swoim komputerze. Jak to zwykle bywa po instalacji świeżego systemu, chciał bym, aby pozostał jak najdłużej w stanie optymalnym. Postanowiłem tym razem nie instalować na nim „miliona” różnych aplikacji, bibliotek itp. które mogą okazać się zbędne.

Wstęp

Jednym z możliwości, dzięki któremu możemy swobodnie pracować/psuć i tym samym pozostawić nasz bazowy system w stanie nienaruszonym jest wirtualizacja.

Oczywiście, nie będziemy instalować w tym celu VirtualBox, skorzystamy z Dockera.

Instalacja

Docker działa na systemach operacyjnych Windows, MacOS oraz Linuks.

Aby zacząć pracę z tym programem na jednym z dwóch pierwszych z wymienionych systemów, będziemy zmuszeni ściągnąć program spod poniższego linka:
https://hub.docker.com/?overlay=onboarding

Jeśli pracujemy na Linuksie (opisana poniżej metoda tyczy się Ubuntu 18.04) należy postępować zgodnie z opisem:

Instalacja Dockera na Ubuntu 18.04

Na początek musimy zainstalować kilka niezbędnych pakietów:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Następnie dodajemy klucz GPG

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

Dodajemy repozytorium Dockera

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Aktualizujemy listę repozytorium

sudo apt-get update

Instalujemy Docker

sudo apt-get install docker-ce

Sprawdzamy wersję zainstalowanego programu

sudo docker --version

Kilka podstawowych pojęć

Za pomocą dockera możemy uruchomić maszynę wirtualną przy użyciu tzw. „Containers” czyli pojemników. Każdy uruchomiony pojemnik musi oprzeć się o jakiś obraz systemu.

Możemy jednocześnie uruchomić wiele pojemników, a nasz program uruchomiony na jednym z nich będzie w stanie komunikować się z pozostałymi pod podanymi przez nas portami.

Obrazy możemy pobrać przy pomocy jednego polecenia, ale skąd mamy wiedzieć jakie obrazy są dostępne ? Wystarczy zerknąć tutaj.

Możemy tworzyć również własne obrazy

Rozpoczynamy pracę

Postaramy się teraz uruchomić pierwszy „Container” Dockera:

docker run busybox

Uprawnienia

Zobaczymy zapewne komunikat podobny do poniższego:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Oznacza to, że użytkownik na którym aktualnie jesteśmy zalogowani, nie ma praw do wykonania powyższego polecenia.

Możemy naszego użytkownika dopisać do grupy Docker

sudo groupadd docker
sudo usermod -aG docker $USER

Po wpisaniu powyższych poleceń, należy się przelogować.

Uruchomienie

Znowu próbujemy uruchomić „Container” korzystając przy tym z obrazu „busybox„:

docker run busybox

Kolejny problem, kolejny błąd:

Unable to find image 'busybox:latest' locally
docker: Error response from daemon: pull access denied for busyboxs, repository does not exist or may require 'docker login'.
See 'docker run --help'.

Oznacza on, że Docker nie znalazł obrazu na naszym lokalnym komputerze.

Powyższego komunikatu możesz nie zobaczyć u siebie, obraz „busybox” powinien zostać pobrany automatycznie przy instalacji programu. Jednakże warto abyś wiedział co należy wykonać w sytuacji opisanej powyżej.

Pobierzmy więc obraz na nasz komuter:

docker pull busybox

Teraz możemy kolejny raz spróbować uruchomić nasz „Container

docker run busybox

Jeśli na ekranie nic nie zostało wyświetlone, oznacza to, że wszystko zostało poprawnie wykonane.

Kilka ciekawych poleceń

docker ps -a

Powyższe polecenie umożliwia nam ujrzenie listy wszystkich maszyn które zostały uruchomione, nawet tych zakończonych (patrz kolumna „status„).

Możemy dostać się do linii poleceń naszej wirtualnej maszyny wpisując komendę:

docker run -it busybox

Teraz będąc wewnątrz maszyny, możemy wydać polecenie „exit” aby ją opuścić, lub w osobnym terminalu wpisać komendę:

docker stop {id_containera}

id_containera” możemy poznać wpisując wcześniej:

docker ps

Wszystkie zakończone „containery” możemy usunąć poleceniem:

docker container prune

Aby usunąć wybrany container:

docker rm {id_containera}

Dockerfile

Żadna korzyść z postawienia maszyny wirtualnej która jest pusta. Fajnie gdyby w momencie tworzenia maszyny automatycznie móc zainstalować na niej kilka przydatnych nam pakietów, np Nginx, php.

W celu stworzenia uszytej na miarę maszyny wirtualnej, musimy stworzyć wpierw plik „Dockerfile” w głównym katalogu naszej aplikacji.

Zawartość mojego pliku „Dockerfile” dla uruchomienia testów w PhpUnit wygląda następująco:

FROM ubuntu

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN echo "Europe/Warsaw" > /etc/timezone

RUN apt-get install -y php-fpm php-dom composer php-mbstring

ADD ./ /var/www/
WORKDIR /var/www/

Uruchomienie maszyny

Po wykonaniu wszystkich powyższych czynności, możemy uruchomić naszą maszynę.
Przy pomocy „Dockerfile” zbudujemy obraz dla naszej maszyny, pomoże nam w tym celu poniższe polecenie:

docker build -t {pseudonim}/{nazwa} .

Oczywiście w miejscu „pseudonim” oraz „nazwa” wstaw właściwe wartości.

Uruchomienie odbywa się analogicznie do poniższego polecenia:

docker run -it -v $(pwd):/var/www/ -P --rm --name {nazwa_maszyny} {pseudonim}/{nazwa}

Powyższe polecenie uruchamia nową maszynę, automatycznie przenosząc nas do jej linii komend oraz synchronizuje katalog w którym aktualnie się znajdujemy z katalogiem /var/www/ na maszynie wirtualnej.

Gdy jesteśmy zalogowani na maszynie wirtualnej uruchomienie testów jednostkowych w PhpUnit nie powinno sprawić najmniejszych problemów.

Dzięki ciągłej synchronizacji katalogów możemy pracować swobodnie, zapominając o jakiejkolwiek wirtualizacji która jest obecna w trakcie naszej pracy.

Zalecam pracować przy użyciu wirtualizacji, ponieważ nie zaśmiecamy tym swego bazowego systemu.

Tworząc projekty musimy pamiętać również o tym, że będą one zapewne działać na innych serwerach produkcyjnych. Dzięki wirtualizacji możemy zbliżyć naszą wirtualną maszynę do serwera produkcyjnego instalując dokładnie te same wersje oprogramowania.