|
|
pl:dydaktyka:sitw:2016:docker:lab1 [2017/10/14 22:50] bstachura |
pl:dydaktyka:sitw:2016:docker:lab1 [2019/06/27 15:50] |
===== Docker - wprowadzenie ===== | |
==== 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 install docker.io | |
</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ó©a 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 .''' | |
| |
=LABY= | |
| |
==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) | |