Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:dydaktyka:sitw:2016:docker:lab1 [2017/10/15 11:32] bstachura |
pl:dydaktyka:sitw:2016:docker:lab1 [2017/10/24 09:01] bstachura |
===== Docker - wprowadzenie ===== | ===== Docker - wprowadzenie ===== |
| |
| ==== Ważne informacje ==== |
| |
| **//Nie wolno restartować maszyn//**\\ |
| \\ |
| Tematy ćwiczeń napisane //KURSYWĄ// są zrealizowane i proszę ich nie realizować. |
==== Terminologia ==== | ==== Terminologia ==== |
| |
| |
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. | * **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. |
* **CMD ["supervisord", "-n"]** - CMD definiuje polecenie uruchamiane razem kontenerem (właściwą aplikację) | * **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! | 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ą |
| |
==Budowanie obrazu== | === Ćwiczenie 4 === |
Obrazy dockera budujemy za pomocą polecenia uruchamianego w katalogu z Dockerfile: | |
'''docker build -t example/docker-node-hello:latest .''' | |
| |
=LABY= | * 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ą |
| |
==lab 1 (Instalacja i przygotowanie dockera)== | |
* 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) | |