Docker

Informacje

Terminologia

* klient dockera – polecenie docker używane do kontrolowania środowiska dockera oraz komunikacji ze zdalnymi serwerami dockera
* Serwer dockera – polecenie docker uruchomione w trybie daemona. Zamienia serwer linuksowy w serwer dokera na którym można uruchamiać, budować i wyłączać kontenety za pomocą zdalnego klienta.
* obrazy dockera – obrazy zawierające jedną lub więcej abstrakcyjnych warstw filesystemu oraz istotne metadane reprezentujące wszystkie pliki niezbędne do uruchmienia aplikacji w kontenerze. Pojedynczy obraz może być kopiowany na inne hosty. Obraz z reguły posiada nazwę i tag, tag jest używany głównie do identyfikacji wydania obrazu.
* kontener dockera – jest to linuksowy kontener zainicjowany z konkretnego obrazu. Konkretny kontener może istnieć tylko raz, jednak można łatwo stworzyć wiele kontenerów z tego samego obrazu.

Wymagania

* Linux kernel w wersji nowszej niż 3.8
* Aplikacja musi działąć a FOREGROUNDZIE, nie może być demonizowana (można uruchamiać aplikacje jako daemony za pomocą systemd, ale to nie jest przedmiotem laboratoriów)

Instalacja

Instalacja za pomocą mamangera pakietów:
apt install docker.io
Włączanie usługi dockera wraz ze startem systemu:
systemctl enable docker
Aby nie musieć korzystać z sudo za każdym razem warto dodać się też do grupy docker

==Dockerfile==
Aby zbudować obraz niezbędny jest poprawny Dockerfile, który opisuje każdą z warstw abstrakcji oraz metadane, które znajdą się w wyjściowym obrazie.
Typowy Dockerfile dla aplikacji nodejs może wyglądać tak:


FROM node:0.10
MAINTAINER Jan Kowalski
LABEL "ocena"="5 gwiazdek" "klasa"="pierwsza"
USER root
ENV AP /data/app
ENV SCPATH /etc/supervisor/conf.d
RUN apt -y update
RUN apt -y install supervisor
RUN mkdir -p /var/log/supervisor
ADD .supervisor/conf.d/* $SCPATH
ADD *.js* $AP/
WORKDIR $AP
RUN npm install
CMD ["supervisord", "-n"]

Każda z linii nakłada na obraz kolejną warstwę abstrakcji, dobrą praktyką jest zaczynać o najniższego poziomu jako od systemu, gdyż w przypadku zmian, np ścieżki w zmiennej AP, budowa nowego obrazu rozpocznie się od zmienionej linii, wszystkie wcześniejsze zostaną pominięte, co zaoszczędzi czasu przy budowaniu.
Poniżej wyjaśnię anatomię pliku Dockerfile na powyższym przykładzie.

* **FROM node:0.10** – oznacza, że nasz obraz będzie budowany na podstawie obrazu node w wersji 0.10.X, by zablokować do konkretnej wersji trzeba ją uściślić, np.: node:0.10.33.
* **MAINTAINER Jan Kowalski ** – pozwala dodać kontakt do autora, propaguje autora również w metadanych wszystkich tworzonych obrazów.
* **LABEL “ocena”=”5 gwiazdek” “klasa”=”pierwsza”** – ta funkcjonalność istnieje od dockera 1.6, pozwala dodawać metadane w formie klucz=wartość, można na ich podstawie potem wyszukiwać i identyfikować kontenery
* **USER root** – domyślnie docker uruchamia wszystkie procesy w kontenerze jako root, za pomocą USER można to zmienić (ze względóœ bezpieczeństwa nie polecam produkcyjnie uruchamiać kontenerów z procesami roota, przypominam, że pomimo izolacji, nadal korzystamy z jądra gospodarza)
* **ENV AP /data/app \\
ENV SCPATH /etc/supervisor/conf.d** – zmienne, które mogą być użyte podczas budowy obrazu
* **RUN apt -y update\\
RUN apt -y install supervisor\\
RUN mkdir -p /var/log/supervisor** – polecenie RUN uruchamia jakąś instrukcję podczas budowy obrazu, np żeby zainstalować określone oprogramowanie czy zapewnić zależności.
* **ADD .supervisor/conf.d/* $SCPATH\\
ADD *.js* $AP/** – ADD kopiuje pliki z lokalnego systemu do obrazu
* **WORKDIR $AP\\
RUN npm install** – WORKDIR zmienia aktualny katalog w jakim pracuje podczas budowania obrazu dla kolejnych instrukcji
* **CMD [“supervisord”, “-n”]** – CMD definiuje polecenie uruchamiane razem kontenerem (właściwą aplikację)

Każda kolejna linia Dockerfile i każdy krok tworzy nową warstwę, która zależy od poprzedniej!

Budowanie obrazu

Obrazy dockera budujemy za pomocą polecenia uruchamianego w katalogu z Dockerfile:
docker build -t example/docker-node-hello:latest .

Treść laboratorium

**Dockerfile** proszę zakładać w katalogu domowym użytkownika **student** lub jego podkatalogach.

Ćwiczenie 1

* Przygotuj **Dockerfile**, który zainstaluje httpd na oficjalnym obrazie Centos 7
* Dodaj pole **maintainer**
* Zbuduj obraz z o nazwie **laborki**
* Uruchom kontener w trybie interaktywnym
-ti
* Uruchom konener w tle
-d
* Sprawdź czy kontener jest uruchomiony
docker ps
* Sprawdź czy w kontenerze **jest zainstalowany httpd**
* Sprawdź czy obraz ma około **261MB**

Ćwiczenie 2

* Zmodyfikuj wcześniejszy **Dockerfile** tak, aby startował **httpd** (httpd ma być uruchomiony w **FOREGROUNDZIE, nie jako daemon!**)
* przebuduj obraz
* sprawdź czy kontener działa
* sprawdź czy httpd działa

Ćwiczenie 3

* Przygotuj index.html z wiadomością powitalną
* Zmodyfikuj poprzedniego **Dockerfile** i dodaj plik index.html do obrazu w ścieżce: /var/www/html/index.html
* przebuduj obraz
* uruchom kontener z upublicznionym portem 80
* odwiedź stronę powitalną

Ćwiczenie 4

* załóż konto na https://hub.docker.com/
* zaloguj się do docker.io
docker login
* wyeksportuj
docker push
obraz (musi nazywać się jak użytkownik, czyli jeśli konto to **jkowalski**, to obraz powinien nazywać się: **jkowalski/nazwa_obrazu:tag**) – jeśli trzeba, przebuduj obraz do poprawnej nazwy
* Ściągnij obraz grupy po lewej
docker run -d nazwa_uzytkownika/nazwa_obrazu
* uruchom kontener z tego obrazu
* odwiedź stronę powitalną

Ćwiczenie 5

* Proszę stworzyć plik **dockerfile** opisujący maszynę partą o system Centos w wersji 7. System ten ma mieć dodanych 2 użytkowników systemowych **jan** oraz **kinga**, każdy z nich ma mieć ustawione hasło: **DockerLab**
* Użytkownicy dodane przez Państwa mają należeć do grup **users** oraz **sudo**.
* Proszę zainstalować sudo i zmodyfikować plik sudoers tak, aby sudo działało dla grupy sudo.
* Proszę zbudować i uruchomić obraz, zweryfikuj, że wszystko działa poprawnie oraz członkostwo użytkowników.

Ćwiczenie 6

* Proszę uruchomić kontener dockera zawierający **bazę MySQL** w wersji 5.7 z nazwą: **mysql-container**, zostanie ona wykorzystana w późniejszych zadaniach.

Ćwiczenie 7

* Proszę stworzyć i uruchomić kontener w którym zainstalują i uruchomią Państwo forum oparte o skrypt **flarum** (http://flarum.org/ zainstalowany za pomocą **composera**), jako bazę proszę wykorzystać kontener **mysql-container**. System dowolny.
* Proszę przekierować port 8080 na port 80 kontenera z flarum.

Ćwiczenie 8

* Proszę uruchomić kontener z wordpressem (zmapować port 8081), jako bazę wykorzystać kontener **mysql-container**