|
|
pl:dydaktyka:sitw:2016:docker:lab1 [2017/10/24 09:01] bstachura |
pl:dydaktyka:sitw:2016:docker:lab1 [2019/06/27 15:50] |
===== Docker - wprowadzenie ===== | |
| |
==== Ważne informacje ==== | |
| |
**//Nie wolno restartować maszyn//**\\ | |
\\ | |
Tematy ćwiczeń napisane //KURSYWĄ// są zrealizowane i proszę ich nie realizować. | |
==== 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ć 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.\\ | |
**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: | |
<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> | |
Włączanie usługi dockera wraz ze startem systemu: | |
<code bash> | |
systemctl enable docker | |
</code> | |
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: | |
| |
<code bash> | |
FROM node:0.10 | |
MAINTAINER Jan Kowalski <jkowalski@fajnymail.com> | |
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"] | |
</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.\\ | |
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ą | |
| |