Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:sitw:2016:docker:lab1 [2017/10/14 22:50] bstachura |
pl:dydaktyka:sitw:2016:docker:lab1 [2019/06/27 15:50] (aktualna) |
===== Docker - wprowadzenie ===== | ===== Docker - wprowadzenie ===== |
| |
| ==== Ważne informacje ==== |
| |
| **//Nie wolno restartować maszyn//**\\ |
| \\ |
| Tematy ćwiczeń napisane //KURSYWĄ// są zrealizowane i proszę ich nie realizować. |
==== Terminologia ==== | ==== Terminologia ==== |
| |
**Klient dockera** - polecenie docker używane do kontrolowania środowiska dockera oraz komunikacji ze zdalnymi serwerami dockera.\\ | **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ć kontenery za pomocą zdalnego klienta.\\ | **Serwer dockera** - polecenie docker uruchomione w trybie daemona. Zamienia serwer linuksowy w serwer dokera na którym można uruchamiać, budować i wyłączać kontenery 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 uruchomienia 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.\\ | **Obrazy dockera** - obrazy zawierające jedną lub więcej abstrakcyjnych warstw filesystemu oraz istotne metadane reprezentujące wszystkie pliki niezbędne do uruchomienia 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. | **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 ==== | ==== Wymagania ==== |
| |
Instalacja za pomocą mamangera pakietów: | Instalacja za pomocą mamangera pakietów: |
<code bash> | <code bash>apt-get install apt-transport-https ca-certificates curl iptables</code> |
apt install docker.io | następnie: |
</code> | <code bash>curl -sSL https://get.docker.com/ | sh</code> |
Włączanie usługi dockera wraz ze startem systemu: | Włączanie usługi dockera wraz ze startem systemu: |
<code bash> | <code bash> |
systemctl enable docker | systemctl enable docker |
</code> | </code> |
Aby nie musieć korzystać z *sudo* za każdym razem warto dodać się też do grupy *docker* | Aby nie musieć korzystać z **sudo** za każdym razem warto dodać się też do grupy **docker** |
| |
==== Dockerfile ==== | ==== 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.\\ | 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: | Typowy **Dockerfile** dla aplikacji **nodejs** może wyglądać tak: |
| |
<code bash> | <code bash> |
</code> | </code> |
Każda z linii nakłada na obraz kolejną warstwę abstrakcji, dobrą praktyką jest zaczynać od 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.\\ | Każda z linii nakłada na obraz kolejną warstwę abstrakcji, dobrą praktyką jest zaczynać od 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.\\ | 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 <jkowalski@fajnymail.com>** - 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óœ z procesami roota, przypominam, że pomimo izolacji, nadal korzystamy z jądra gospodarza) |
| * **ENV AP /data/app** - zmienna, które mogą być użyte podczas budowy obrazu |
| * **ENV SCPATH /etc/supervisor/conf.d** - zmienna, które mogą być użyte podczas budowy obrazu |
| * **RUN apt -y update** - polecenie RUN uruchamia jakąś instrukcję podczas budowy obrazu, np żeby zainstalować określone oprogramowanie czy zapewnić zależności. |
| * **RUN apt -y install supervisor** - polecenie RUN uruchamia jakąś instrukcję podczas budowy obrazu, np żeby zainstalować określone oprogramowanie czy zapewnić zależności. |
| * **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**: |
| <code bash> |
| docker build -t example/docker-node-hello:latest . |
| </code> |
| ====Przykład==== |
| |
| ==== Ćwiczenia do wykonania na localhost ==== |
| |
| * //Zrób update systemu// |
| <code bash>apt update && apt upgrade</code> |
| * //Zainstaluj docker-engine// |
| Obecnie |
| <code bash>apt-get install apt-transport-https ca-certificates curl iptables</code> |
| następnie: |
| <code bash>curl -sSL https://get.docker.com/ | sh</code> |
| Dawniej |
| <code bash>apt install docker.io</code> |
| * //Ustaw MTU na wartość 1454, aby tego dokonać należy dodać// |
| <code bash>--mtu=1454</code> |
| //do obecnych// |
| <code bash>OPTIONS</code> |
| //w pliku// |
| <code bash>/etc/default/docker</code> |
| * //Ustaw autostart usługi docker// |
| <code bash>systemctl enable docker</code> |
| * //Uruchom usługę docker// |
| <code bash>systemctl start docker</code> |
| * **Zweryfikuj instalację dockera przez uruchomienie kontenera hello-world** |
| <code bash>docker run hello_world</code> |
| * //Zrestartuj hosta gospodarza// |
| * //Zweryfikuj status usługi docker przez uruchomienie kontenera hello-world jeszcze raz// |
| * //Zweryfikuj wartość MTU na interfejsie **docker0**// |
| <code bash>ip address show dev docker0</code> |
| |
| \\ |
| \\ |
| **Proszę odinstalować dockera na końcu laboratoriów** |
| |
| ==== Treść laboratorium ==== |
| \\ |
| \\ |
| **Dockerfile** proszę zakładać w katalogu domowym użytkownika **student** lub jego podkatalogach\\ |
| \\ |
| \\ |
| **Ćwiczenia proszę wykonywać dalej na localhost**\\ |
| \\ |
| === Ćwiczenie 1 === |
| |
| * Przygotuj **Dockerfile**, który zainstaluje httpd na oficjalnym obrazie Centos 6 |
| * Dodaj pole **maintainer** |
| * Zbuduj obraz z o nazwie **laborki** |
| * Uruchom kontener w trybie interaktywnym |
| <code bash>-ti </code> |
| * Uruchom konener w tle |
| <code bash>-d</code> |
| * Sprawdź czy kontener jest uruchomiony |
| <code bash>docker ps</code> |
| * 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 **docker.io** |
| * zaloguj się do docker.io |
| <code bash>docker login</code> |
| * wyeksportuj |
| <code bash>docker push</code> |
| 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 |
| <code bash>docker run -d nazwa_uzytkownika/nazwa_obrazu</code> |
| * 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 === |
| |
* *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. | * Proszę uruchomić kontener dockera zawierający **bazę MySQL** w wersji 5.7 z nazwą: **mysql-container**, zostanie ona wykorzystana w późniejszych zadaniach. |
* *MAINTAINER Jan Kowalski <jkowalski@fajnymail.com>* - 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óœ z procesami roota, przypominam, że pomimo izolacji, nadal korzystamy z jądra gospodarza) | |
* *ENV AP /data/app* - zmienna, które mogą być użyte podczas budowy obrazu | |
* *ENV SCPATH /etc/supervisor/conf.d* - zmienna, które mogą być użyte podczas budowy obrazu | |
* *RUN apt -y update* - polecenie RUN uruchamia jakąś instrukcję podczas budowy obrazu, np żeby zainstalować określone oprogramowanie czy zapewnić zależności. | |
* *RUN apt -y install supervisor* - polecenie RUN uruchamia jakąś instrukcję podczas budowy obrazu, np żeby zainstalować określone oprogramowanie czy zapewnić zależności. | |
* *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ó©a zależy od poprzedniej! | === Ćwiczenie 7 === |
| |
==Budowanie obrazu== | * 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. |
Obrazy dockera budujemy za pomocą polecenia uruchamianego w katalogu z Dockerfile: | * Proszę przekierować port 8080 na port 80 kontenera z flarum. |
'''docker build -t example/docker-node-hello:latest .''' | |
| |
=LABY= | === Ćwiczenie 8 === |
| |
==lab 1 (Instalacja i przygotowanie dockera)== | * Proszę uruchomić kontener z wordpressem (zmapować port 8081), jako bazę wykorzystać kontener **mysql-container** |
* Zrób update systemu (apt update && apt upgrade) | |
* Zainstaluj docker-engine (apt install docker.io) | |
* Ustaw MTU na wartość 1454 (dodać --mtu=1454 do obecnych OPTIONS w pliku /etc/default/docker) | |
* Ustaw autostart usługi docker (systemctl enable docker) | |
* Uruchom usługę docker (systemctl start docker) | |
* Zweryfikuj instalację dockera przez uruchomienie kontenera hello-world (docker run hello world) | |
* Zrestartuj hosta gospodarza | |
* Zweryfikuj status usługi docker przez uruchomienie kontenera hello-world jeszcze raz | |
* Zweryfikuj wartość MTU na interfejsie docker0 (ip address show dev docker0) | |