{"id":231,"date":"2019-11-14T08:55:25","date_gmt":"2019-11-14T07:55:25","guid":{"rendered":"https:\/\/stachura-terlecka.pl\/?page_id=231"},"modified":"2019-11-20T08:30:02","modified_gmt":"2019-11-20T07:30:02","slug":"docker","status":"publish","type":"page","link":"https:\/\/stachura-terlecka.pl\/?page_id=231","title":{"rendered":"Docker"},"content":{"rendered":"<h3> Informacje<\/h3>\n<h4>Terminologia<\/h4>\n<p>* klient dockera &#8211; polecenie docker u\u017cywane do kontrolowania \u015brodowiska dockera oraz komunikacji ze zdalnymi serwerami dockera<br \/>\n* Serwer dockera &#8211; polecenie docker uruchomione w trybie daemona. Zamienia serwer linuksowy w serwer dokera na kt\u00f3rym mo\u017cna uruchamia\u0107, budowa\u0107 i wy\u0142\u0105cza\u0107 kontenety za pomoc\u0105 zdalnego klienta.<br \/>\n* obrazy dockera &#8211; obrazy zawieraj\u0105ce jedn\u0105 lub wi\u0119cej abstrakcyjnych warstw filesystemu oraz istotne metadane reprezentuj\u0105ce wszystkie pliki niezb\u0119dne do uruchmienia aplikacji w kontenerze. Pojedynczy obraz mo\u017ce by\u0107 kopiowany na inne hosty. Obraz z regu\u0142y posiada nazw\u0119 i tag, tag jest u\u017cywany g\u0142\u00f3wnie do identyfikacji wydania obrazu.<br \/>\n* kontener dockera &#8211; jest to linuksowy kontener zainicjowany z konkretnego obrazu. Konkretny kontener mo\u017ce istnie\u0107 tylko raz, jednak mo\u017cna \u0142atwo stworzy\u0107 wiele kontener\u00f3w z tego samego obrazu.<\/p>\n<h4>Wymagania<\/h4>\n<p>* Linux kernel w wersji nowszej ni\u017c 3.8<br \/>\n* Aplikacja musi dzia\u0142\u0105\u0107 a FOREGROUNDZIE, nie mo\u017ce by\u0107 demonizowana (mo\u017cna uruchamia\u0107 aplikacje jako daemony za pomoc\u0105 systemd, ale to nie jest przedmiotem laboratori\u00f3w)<\/p>\n<h4>Instalacja<\/h4>\n<p>Instalacja za pomoc\u0105 mamangera pakiet\u00f3w:<br \/>\n<code bash=\"\">apt install docker.io<\/code><br \/>\nW\u0142\u0105czanie us\u0142ugi dockera wraz ze startem systemu:<br \/>\n<code bash=\"\">systemctl enable docker<\/code><br \/>\nAby nie musie\u0107 korzysta\u0107 z sudo za ka\u017cdym razem warto doda\u0107 si\u0119 te\u017c do grupy docker<\/p>\n<p>==Dockerfile==<br \/>\nAby zbudowa\u0107 obraz niezb\u0119dny jest poprawny Dockerfile, kt\u00f3ry opisuje ka\u017cd\u0105 z warstw abstrakcji oraz metadane, kt\u00f3re znajd\u0105 si\u0119 w wyj\u015bciowym obrazie.<br \/>\nTypowy Dockerfile dla aplikacji nodejs mo\u017ce wygl\u0105da\u0107 tak:<\/p>\n<p><code bash=\"\"><br \/>\nFROM node:0.10<br \/>\nMAINTAINER Jan Kowalski <jkowalski@fajnymail.com><br \/>\nLABEL \"ocena\"=\"5 gwiazdek\" \"klasa\"=\"pierwsza\"<br \/>\nUSER root<br \/>\nENV AP \/data\/app<br \/>\nENV SCPATH \/etc\/supervisor\/conf.d<br \/>\nRUN apt -y update<br \/>\nRUN apt -y install supervisor<br \/>\nRUN mkdir -p \/var\/log\/supervisor<br \/>\nADD .supervisor\/conf.d\/* $SCPATH<br \/>\nADD *.js* $AP\/<br \/>\nWORKDIR $AP<br \/>\nRUN npm install<br \/>\nCMD [\"supervisord\", \"-n\"]<br \/>\n<\/jkowalski@fajnymail.com><\/code><br \/>\nKa\u017cda z linii nak\u0142ada na obraz kolejn\u0105 warstw\u0119 abstrakcji, dobr\u0105 praktyk\u0105 jest zaczyna\u0107 o najni\u017cszego poziomu jako od systemu, gdy\u017c w przypadku zmian, np \u015bcie\u017cki w zmiennej AP, budowa nowego obrazu rozpocznie si\u0119 od zmienionej linii, wszystkie wcze\u015bniejsze zostan\u0105 pomini\u0119te, co zaoszcz\u0119dzi czasu przy budowaniu.<br \/>\nPoni\u017cej wyja\u015bni\u0119 anatomi\u0119 pliku Dockerfile na powy\u017cszym przyk\u0142adzie.<\/p>\n<p>* **FROM node:0.10** &#8211; oznacza, \u017ce nasz obraz b\u0119dzie budowany na podstawie obrazu node w wersji 0.10.X, by zablokowa\u0107 do konkretnej wersji trzeba j\u0105 u\u015bci\u015bli\u0107, np.: node:0.10.33.<br \/>\n* **MAINTAINER Jan Kowalski <jkowalski@fajnymail.com>** &#8211; pozwala doda\u0107 kontakt do autora, propaguje autora r\u00f3wnie\u017c w metadanych wszystkich tworzonych obraz\u00f3w.<br \/>\n* **LABEL &#8220;ocena&#8221;=&#8221;5 gwiazdek&#8221; &#8220;klasa&#8221;=&#8221;pierwsza&#8221;** &#8211; ta funkcjonalno\u015b\u0107 istnieje od dockera 1.6, pozwala dodawa\u0107 metadane w formie klucz=warto\u015b\u0107, mo\u017cna na ich podstawie potem wyszukiwa\u0107 i identyfikowa\u0107 kontenery<br \/>\n* **USER root** &#8211; domy\u015blnie docker uruchamia wszystkie procesy w kontenerze jako root, za pomoc\u0105 USER mo\u017cna to zmieni\u0107 (ze wzgl\u0119d\u00f3\u0153 bezpiecze\u0144stwa nie polecam produkcyjnie uruchamia\u0107 kontener\u00f3w z procesami roota, przypominam, \u017ce pomimo izolacji, nadal korzystamy z j\u0105dra gospodarza)<br \/>\n* **ENV AP \/data\/app \\\\<br \/>\nENV SCPATH \/etc\/supervisor\/conf.d** &#8211; zmienne, kt\u00f3re mog\u0105 by\u0107 u\u017cyte podczas budowy obrazu<br \/>\n* **RUN apt -y update\\\\<br \/>\nRUN apt -y install supervisor\\\\<br \/>\nRUN mkdir -p \/var\/log\/supervisor** &#8211; polecenie RUN uruchamia jak\u0105\u015b instrukcj\u0119 podczas budowy obrazu, np \u017ceby zainstalowa\u0107 okre\u015blone oprogramowanie czy zapewni\u0107 zale\u017cno\u015bci.<br \/>\n* **ADD .supervisor\/conf.d\/* $SCPATH\\\\<br \/>\nADD *.js* $AP\/** &#8211; ADD kopiuje pliki z lokalnego systemu do obrazu<br \/>\n* **WORKDIR $AP\\\\<br \/>\nRUN npm install** &#8211; WORKDIR zmienia aktualny katalog w jakim pracuje podczas budowania obrazu dla kolejnych instrukcji<br \/>\n* **CMD [&#8220;supervisord&#8221;, &#8220;-n&#8221;]** &#8211; CMD definiuje polecenie uruchamiane razem  kontenerem (w\u0142a\u015bciw\u0105 aplikacj\u0119)<\/jkowalski@fajnymail.com><\/p>\n<p>Ka\u017cda kolejna linia Dockerfile i ka\u017cdy krok tworzy now\u0105 warstw\u0119, kt\u00f3ra zale\u017cy od poprzedniej!<\/p>\n<h3>Budowanie obrazu<\/h3>\n<p>Obrazy dockera budujemy za pomoc\u0105 polecenia uruchamianego w katalogu z Dockerfile:<br \/>\n<code bash=\"\">docker build -t example\/docker-node-hello:latest .<\/code><\/p>\n<h4> Tre\u015b\u0107 laboratorium<\/h4>\n<p>**Dockerfile** prosz\u0119 zak\u0142ada\u0107 w katalogu domowym u\u017cytkownika **student** lub jego podkatalogach.<\/p>\n<h5> \u0106wiczenie 1<\/h5>\n<p>* Przygotuj **Dockerfile**, kt\u00f3ry zainstaluje httpd na oficjalnym obrazie Centos 7<br \/>\n* Dodaj pole **maintainer**<br \/>\n* Zbuduj obraz z o nazwie **laborki**<br \/>\n* Uruchom kontener w trybie interaktywnym<br \/>\n<code bash=\"\">-ti <\/code><br \/>\n* Uruchom konener w tle<br \/>\n<code bash=\"\">-d<\/code><br \/>\n* Sprawd\u017a czy kontener jest uruchomiony<br \/>\n<code bash=\"\">docker ps<\/code><br \/>\n* Sprawd\u017a czy w kontenerze **jest zainstalowany httpd**<br \/>\n* Sprawd\u017a czy obraz ma oko\u0142o **261MB**<\/p>\n<h5> \u0106wiczenie 2<\/h5>\n<p>* Zmodyfikuj wcze\u015bniejszy **Dockerfile** tak, aby startowa\u0142 **httpd** (httpd ma by\u0107 uruchomiony w **FOREGROUNDZIE, nie jako daemon!**)<br \/>\n* przebuduj obraz<br \/>\n* sprawd\u017a czy kontener dzia\u0142a<br \/>\n* sprawd\u017a czy httpd dzia\u0142a<\/p>\n<h5> \u0106wiczenie 3<\/h5>\n<p>* Przygotuj index.html z wiadomo\u015bci\u0105 powitaln\u0105<br \/>\n* Zmodyfikuj poprzedniego **Dockerfile** i dodaj plik index.html do obrazu w \u015bcie\u017cce: \/var\/www\/html\/index.html<br \/>\n* przebuduj obraz<br \/>\n* uruchom kontener z upublicznionym portem 80<br \/>\n* odwied\u017a stron\u0119 powitaln\u0105<\/p>\n<h5> \u0106wiczenie 4<\/h5>\n<p>* za\u0142\u00f3\u017c konto na <strong>https:\/\/hub.docker.com\/<\/strong><br \/>\n* zaloguj si\u0119 do docker.io<br \/>\n<code bash=\"\">docker login<\/code><br \/>\n* wyeksportuj<br \/>\n<code bash=\"\">docker push<\/code><br \/>\nobraz (musi nazywa\u0107 si\u0119 jak u\u017cytkownik, czyli je\u015bli konto to **jkowalski**, to obraz powinien nazywa\u0107 si\u0119: **jkowalski\/nazwa_obrazu:tag**) &#8211; je\u015bli trzeba, przebuduj obraz do poprawnej nazwy<br \/>\n* \u015aci\u0105gnij obraz grupy po lewej<br \/>\n<code bash=\"\">docker run -d nazwa_uzytkownika\/nazwa_obrazu<\/code><br \/>\n* uruchom kontener z tego obrazu<br \/>\n* odwied\u017a stron\u0119 powitaln\u0105<\/p>\n<h5> \u0106wiczenie 5<\/h5>\n<p>* Prosz\u0119 stworzy\u0107 plik **dockerfile** opisuj\u0105cy maszyn\u0119 part\u0105 o system Centos w wersji 7. System ten ma mie\u0107 dodanych 2 u\u017cytkownik\u00f3w systemowych **jan** oraz **kinga**, ka\u017cdy z nich ma mie\u0107 ustawione has\u0142o: **DockerLab**<br \/>\n* U\u017cytkownicy dodane przez Pa\u0144stwa maj\u0105 nale\u017ce\u0107 do grup **users** oraz **sudo**.<br \/>\n* Prosz\u0119 zainstalowa\u0107 sudo i zmodyfikowa\u0107 plik sudoers tak, aby sudo dzia\u0142a\u0142o dla grupy sudo.<br \/>\n* Prosz\u0119 zbudowa\u0107 i uruchomi\u0107 obraz, zweryfikuj, \u017ce wszystko dzia\u0142a poprawnie oraz cz\u0142onkostwo u\u017cytkownik\u00f3w.<\/p>\n<h5> \u0106wiczenie 6<\/h5>\n<p>* Prosz\u0119 uruchomi\u0107 kontener dockera zawieraj\u0105cy **baz\u0119 MySQL** w wersji 5.7 z nazw\u0105: **mysql-container**, zostanie ona wykorzystana w p\u00f3\u017aniejszych zadaniach.<\/p>\n<h5> \u0106wiczenie 7<\/h5>\n<p>* Prosz\u0119 stworzy\u0107 i uruchomi\u0107 kontener w kt\u00f3rym zainstaluj\u0105 i uruchomi\u0105 Pa\u0144stwo forum oparte o skrypt **flarum** (http:\/\/flarum.org\/ zainstalowany za pomoc\u0105 **composera**), jako baz\u0119 prosz\u0119 wykorzysta\u0107 kontener **mysql-container**. System dowolny.<br \/>\n* Prosz\u0119 przekierowa\u0107 port 8080 na port 80 kontenera z flarum.<\/p>\n<h5> \u0106wiczenie 8<\/h5>\n<p>* Prosz\u0119 uruchomi\u0107 kontener z wordpressem (zmapowa\u0107 port 8081), jako  baz\u0119 wykorzysta\u0107 kontener **mysql-container**<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Informacje Terminologia * klient dockera &#8211; polecenie docker u\u017cywane do kontrolowania \u015brodowiska dockera oraz komunikacji ze zdalnymi serwerami dockera * Serwer dockera &#8211; polecenie docker uruchomione w trybie daemona. Zamienia serwer linuksowy w serwer dokera na kt\u00f3rym mo\u017cna uruchamia\u0107, budowa\u0107 i wy\u0142\u0105cza\u0107 kontenety za pomoc\u0105 zdalnego klienta. * obrazy dockera &#8211; obrazy zawieraj\u0105ce jedn\u0105 lub [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/231"}],"collection":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=231"}],"version-history":[{"count":6,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/231\/revisions"}],"predecessor-version":[{"id":243,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/231\/revisions\/243"}],"wp:attachment":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}