Docker - podstawowy kontener

W arcie tym postaram się wam szybko pokazać jak przygodować swój pierwszy kontener do pracy z projektem lub projektami. Nie będę się rozpisywał czym jest docker, gdyż w necie znajdziecie całą masę wyjaśnień pisanych przez osoby bardziej doświadczone w temacie niż ja. Ja na szybko powiem tak: Docker to narzędzie, które pozwala stworzyć kontenery, które dostarczają środowisko pracy, ale jednocześnie są odseperowane od systemu głównego oraz od innych kontenerów, dzięki czemu możecie sobie robić z danym kontenerem co wam się żywnie podoba i nie wpłynie to w żaden sposób na wasz główny system, czyli np. możecie zainstalować sobie na próbę php7 w kontenerze i nie martwić się, że szlag wam trafi wasze inne projekty chodzące na php5. Coś podobnego daje wam również Vagrant, ale Vagrant tworzy Virtualne Maszyny i jest przez to wolniejszy oraz zużywa więcej zasobów.

Dokumentacja Dockera jest całkiem przyzwoita nie mniej jednak zajęło mi trochę czasu zanim udało mi się zrobić to co chciałem. A chciałem stworzyć kontener, w którym:

  • zainstaluje sobie apache, mysql, php5
  • pliki projektów będę mógł edytować normalnie w mojej strukturze katalogów hosta, przez co będę mógł używać normalnie edytora na tych plikach
  • dostęp do kontenera będę miał przez stałe z góry określone IP

Rozwiązanie tego, jak już się wie, jest banalnie proste (pamiętajcie wpierw, by zainstalować docker):

docker run --cap-add=NET_ADMIN -it --name=naszanazwa -v /nasz/katalog:/var/www/html ubuntu:14.04  /bin/sh -c "/sbin/ip addr add 172.17.0.88 dev eth0;  bash"

gdzie:

  • naszanazwa - nazwa kontenera, którą sobie sami ustalamy
  • /nasz/katalog - pełna ścieżka do katalogu na naszym głównym systemie. W tym katalogu będą pliki naszego projektu
  • /var/www/html - ścieżka do katalogu w systemie kontenera. Pod tą ścięzkę zostaną zmapowane dane z naszego katalogu i wszystkie zmiany jakie zrobimy u nas, będą od razu widoczne w kontenerze
  • ubuntu:14.04 - nazwa obrazu, na podstawie którego zostanie utworzony kontener. Obrazy dostępne są w publicznym repozytorium dockera.
  • 172.17.0.88 - IP naszego kontenera, pod jakim chcemy mieć dostęp do kontenera. Należy pamiętać by wybrać takie IP, które nie jest aktualnie zajęte i nie bedzię zajęte w przyszłości

Gdy wykonamy powyższą komendę zostanie stworzony kontener a w konsoli będziemy zalogowani w systemie kontenera. Gdy już tam będziemy, to instalujemy normalnie jak to pod linuxem apache, mysql, php5. Gdy wszystkie instalacje odbędą się pomyślnie, to w przeglądarce wpisujemy http://172.17.0.88/ i powinniśmy zobaczyć domyślną stronę apache w naszym kontenerze.

Możemy teraz normalnie pracować w katalogu /nasz/katalog poprzez nasz ulubiony edytor, a wszystkie zmiany tam dokonane będą od razu dostępne w kontenerze i widoczne pod adresem http://172.17.0.88.

Jeśli chcemy wyjść z konsoli kontenera możemy wpisać exit ale wówczas kontener zostanie zatrzymany. By go ponownie uruchomić, należy wpisać komendę docker start naszanazwa - kontener zostanie odpalony w tle. Nie będziemy jednak w jego konsoli. By to zrobić, należy wpisać docker attach naszanazwa - zostaniemy przełączeni do konsoli kontenera i będziemy mogli zrobić coś jeszcze jeśli potrzebujemy. Możemy też wyjść z konsoli kontenera bez zatrzymywania kontenera przez kombinację klawiszy Ctrl+p Ctrl+q.

W publicznym repozytorium dostępna jest cała masa różnych obrazów, z różnymi konfiguracjami, więc każdy może sobie wybrać co mu pasuje. Może stworzyć dowolną ilość kontenerów, każdy z różnego obrazu lub z tego samego. Należy jednak pamiętać, że jak robimy zmiany w kontenerze, np. coś instalujemy, to zmiany te nie są widoczne w obrazie, na podstawie którego stworzono kontener. Tak więc gdy odpalimy kolejny kontener na podstawie tego samego obrazu, to kontener ten nie będzie zawierał zmian z pierwszego kontenera. Jeśli chcemy, by zmiany z kontenera trafiły do obrazu, musimy wykonać komendę docker commit nazwa_kontenera - zostanie stworzony wówczas nowy obraz, który jest kopią obrazu oryginalnego i zawierającego zmiany z kontenera. Teraz gdy stworzymy kontener z naszego nowego obrazu, to będzie on zawierał wszystkie nasze zmiany. Jest to przydatne, gdy chcemy stworzyć swój własny obraz bazowy, który zawiera wszystko co potrzebujemy dla naszych kolejnych kontenerów.

I jeszcze mały drobiazg na koniec: docker wszystkie swoje pliki (obrazy, kontenery, inne) tworzy w katalogu /var/lib/docker. Ja osobiście lubię trzymać takie rzeczy na oddzielnej partycji, na wypadek gdyby system mi padł lub ktokolwiek wie co tam innego może się stać. W tym więc celu, przenosimy poprostu katalog dockera do naszej własnej lokalizacji a następnie tworzymy link do standardowego katalogu dockera:

service docker stop
mv /var/lib/docker /nasza/lokalizacja
ln -s /nasza/lokalizacja /var/lib/docker
service docker start

I już, docker powinien leżeć teraz w naszej bezpiecznej lokalizacji.

Podsumowanie

Zdaję sobie sprawę, że to co tutaj napisałem jest bardzo ogólnikowe i zawiera opis tylko części możliwości dockera. Zrobiłem ten wpis po to, by pokazać jak szybko przygotować podstawowy kontener i móc na nim pracować jak byśmy pracowali normalnie bez kontenera. Przedstawiłem tu wam mój sposób pracy, każdy z was może mieć inny. Można np. z kontenerem łączyć się przez port a nie przez ip, można tworzyć całą masę kontenerów na jeden projekt itp. Wszystko to do wygooglowania lub znalezienia w dokumentacji dockera. Ja jednak musiałem spędzić pare godzin, by znaleźć wszystko co potrzebowałem do mojego wersji pracy, temu też publikuje to co znalazłem, by ktoś, kto ma podobny styl pracy, nie musiał na nowo tego wszystkiego szukać.

Komentarze

 

2016-01-25 08:39 gość_by_ikar

Cieszy mnie że przebrnąłeś przez dokumentacje i coś kombinujesz w swoim zakresie. Nie mniej, źle się za to zabrałeś z powodu kilku rzeczy:

- każdy kontener powinien mieć jeden proces (np tylko mysql);
- nie powinieneś się logować do kontenera i cokolwiek w nim instalować, stwórz Dockerfile i w nim umieść instalacje rzeczy których potrzebujesz, w przeciwnym wypadku każdorazowe postawienie kontenera, czy przeniesienie go, będzie wymagało reinstalacji tego wszystkiego na nowo, jak i wszystko będzie w różnych wersjach;
- jeżeli nie chcesz żeby kontener się zatrzymał po wystartowaniu, musi mieć ustawiony CMD lub ENTRYPOINT;

Dlaczego się nie trzyma więcej niż jednego procesu per kontener? Dlatego że docker sam w sobie działa jak upstart z ubuntu (eg sudo service php5-fpm restart), jak postawisz więcej usług, nie będziesz w łatwy sposób wiedział co działa, a co nie, musisz się zalogować do kontenera (docker exec -it nazwa_kontenera bash) i wykonywać komendy wewnątrz niego. A gdyby to wszystko było rozdzielone wystarczyło by zrobić docker ps -a i już byś wiedział co ci działa a co nie i jaki jest exit code. Dodatkowo docker do tego jednego procesu przekazuje odpowiedni exit code, podczas zatrzymywania, dzięki czemu nasze usługi zatrzymują się w sposób kontrolowany, a nie poprzez ubicie procesu. Docker czeka 10 sekund na odpowiedź procesu z kontenera, a potem wszystko wewnątrz killuje. Dlatego można "łączyć" kontenery między sobą, między sieciami, między hostami (via ostatnie zmiany w wersji RC). Kontenery możesz zbindować pod ip/port lokalnie, eg 127.0.0.1:80:80 w rezultacie da ci dostęp poprzez localhost do twojego kontenera, jakiekolwiek będzie miał IP po restarcie.

Są to bardzo ważne rzeczy, które na początku nie wydają się ważne, ale trzeba się do nich przyzwyczaić, a po tym jak już się człowiek przyzwyczai jest z górki, a nasza konfiguracja staje się super przenośna. Jak masz wszystko rozdzielone na osobne kontenery, możesz sobie takie usługi łatwiej skalować samym api dockera (docker scale). Na dniach powinienem zabrać się za php/apache/nginx i ich połączenie, dlatego jak skończę podeśle przykładową konfiguracje która powinna wyjaśnić kilka rzeczy.

PS. polecam zainteresować się docker-compose do zarządzania więcej niż jednym kontenerem, bo konfiguracja jest super łatwa.

2016-01-25 11:12 nospor

@by_ikar dzieki za wpis Tak, wzialem sie za dockera po lekturze twoich postow na forum i cieszy mnie to.
Zdaje tez sobie sprawe z tego wszystkiego co tu napisales. Nie mniej jednak to dopiero moj poczatek i chcialem na szybko cos postawic i to przecwiczyc - udalo sie. Zanim jednak znalazlem jak ma wygladac ta moja jedna linijka, troche czasu sie zeszlo
W oddzielne kontenery pobawie sie w innej wolnej chwili. O ile jeszcze rozumiem, ze mysql moze chodzic na oddzielnym kontenerze, to juz idei kontenera na samo php nie rozumiem. Przegladal na szybko kontenery z samym php i sposoby ich uzycia, ale jakos nie przemawia to do mnie. Moze za krotko sie temu przyjrzalem, nie wiem...

Co do dockerfile to go nie uzylem z bardzo prostego powodu: potrzebuje podmonotowac moj lokalny katalog do katalogu dockera. dockerfile niestety na to nie pozwala. Przez dockerfile moge tylko okreslic ze w dockerze chce miec zewnetrzny katalog ale to docker tworzy go w swojej lokalizacji i nadaje mu swoja nazwe - srednio mi to pasuje. Chyba, ze masz na to jakies wlasne rozwiazanie?

2016-01-25 11:42 nospor

jeżeli nie chcesz żeby kontener się zatrzymał po wystartowaniu, musi mieć ustawiony CMD lub ENTRYPOINT;
No mam przeciez ustawiona komende BASH. Dzieki niej kontener sie nie zatrzymuje

2016-01-25 11:44 gość_melkorm

@nospor - https://docs.docker.com/engine/reference/builder/#volume , Raczej Dockerfile ma wszystko co ma commandline

Czekam na następne artykuły z tego tematu.

2016-01-25 11:44 nospor

nie powinieneś się logować do kontenera i cokolwiek w nim instalować, stwórz Dockerfile i w nim umieść instalacje rzeczy których potrzebujesz, w przeciwnym wypadku każdorazowe postawienie kontenera, czy przeniesienie go, będzie wymagało reinstalacji tego wszystkiego na nowo, jak i wszystko będzie w różnych wersjach;
To tez nie do konca tak. Jesli bede potrzebowal przeniesc kontener na inny komp, to robie poprostu commit do nowego obrazu, przenosze obraz ze wszystkim co mam i nie martwie sie ze czegos mi brakuje na nowym kompie.

2016-01-25 11:48 gość_by_ikar

@nospor dockerfile jest tylko po to aby zbudować obraz, który później wykorzystasz. Swego rodzaju szablon, a taki obraz później wykorzystujesz wielokrotnie. Komitowania zmian w kontenerze też odradzam, bo taki kontener zajmuje później kosmiczne ilości miejsca.

Czy jest sens wrzucania php jako osobny kontener ? Jak najbardziej, jeżeli chcesz mieć produkcyjne środowisko lokalnie odwzorowane, a powiedzmy twoja aplikacja obsługuje spory ruch, możesz sobie śmiało oddzielić serwer http od serwera z php. Może się to wydawać zbędne, ale jak najbardziej nie jest. Nie ma co się martwić o zasoby, bo o ile wszystko postawimy na tym samym obrazie bazowym (powiedzmy ubuntu:14.04) to tak na prawdę odpali się tylko jeden obraz, a do reszty kontenerów docker wykorzysta to co zostało wykorzystane w pierwszym obrazie. Dodatkowo jeżeli masz php wystawionego jako IP/port, możesz się podłączyć phpstormem i debugować swój kod, względem wersji php/jego ustawień jakie masz wewnątrz kontenera.

Mój początek z dokerem wyglądał podobnie, też instalowałem wszystko w środku, bo do tego przyzwyczaił mnie vagrant. Ale kiedy zrozumiałem bardziej zasadę działania dockera jak i jego filozofię, dużo się zmieniło w sposobie w jaki używam dockera teraz, w porównaniu do tego co używałem jeszcze kilka miesięcy temu.

W weekend postaram się zrobić konfigurację php/mysql/apache/nginx oraz zrobić jakiś większy opis tego (krok po kroku) i wrzucę to na forum. Odnośnie tego co piszę na forum o dockerze - wiem jakie problemy niesie ze sobą vagrant, wiem jakie problemy niesie ze sobą lokalna instalacja wszystkiego, jakie problemy niesie testowanie produkcyjnej konfiguracji - większość z tych rzeczy rozwiązał dla mnie docker, dlatego chętnie dziele się tą wiedzą. Jest sporo nowych rzeczy do zrozumienia, ale na prawdę warto.

2016-01-25 11:49 nospor

Kontenery możesz zbindować pod ip/port lokalnie, eg 127.0.0.1:80:80 w rezultacie da ci dostęp poprzez localhost do twojego kontenera, jakiekolwiek będzie miał IP po restarcie.
Wiem, ale ja nie chce dobierac sie do kontenera przez port tylko przez IP. Pod IP moge podpiac hosta, pod port juz nie.

2016-01-25 11:50 nospor

Na dniach powinienem zabrać się za php/apache/nginx i ich połączenie, dlatego jak skończę podeśle przykładową konfiguracje która powinna wyjaśnić kilka rzeczy.
Czekam z niecierpliwoscia

2016-01-25 11:52 nospor

@nospor - https://docs.docker.com/engine/reference/builder/#volume , Raczej Dockerfile ma wszystko co ma commandline

@Malkorm no wlanie nie. VOLUME nie pozwala na podpiecie katalogu dockera pod twoj okreslony lokalny katalog.

2016-01-25 12:04 gość_melkorm

@nospor - używam i montuję rzeczy z hosta, zresztą:
For more information/examples and mounting instructions via the Docker client, refer to Share Directories via Volumes documentation.

2016-01-25 12:07 nospor

Mój początek z dokerem wyglądał podobnie, też instalowałem wszystko w środku, bo do tego przyzwyczaił mnie vagrant.
Tak, masz racje. Moj pierwszy kontener chcialem zrobic jako dokladna kopie tego co mialem w vagrant - do tego jestem przyzwyczajony. Jestem tez jednak otwarty na nowe opcje, temu tez czekam na twoj wpis z rozdzieleniem wszystkiego na oddzielne kontenery. Tak wiec nie len sie i do roboty

2016-01-25 12:09 nospor

@melkorm ok, moze cos zle doczytalem. Czy mozesz w takim razie pokazac mi jak podpiac moj katalog hostowy: /home/nospor/test pod katalog dockera /var/www/html ?

2016-01-25 13:00 gość_by_ikar

@nospor dobrze spinasz te katalogi dopiero poprzez docker run; w dockerfile możesz do tych katalogów ustawić sobie tylko punkt montowania, bo dockerfile wykorzystywany jest tylko do budowania obrazu.

Dla ułatwienia tym co mniej więcej znają vagranta - docker image jest odpowiednikiem vagrant box; uruchamiając jakąś instancje w vagrancie, duplikując ją, ciągle korzystamy z tego samego boxa; podobnie jest w dockerze.

Więc obraz sam w sobie nie może wskazywać na jakikolwiek zasób lokalny, dlatego że jest niezależny od lokalnego zasobu. Dopiero kontener który został utworzony z wskazanego obrazu ma możliwość wskazywania na lokalne zasoby (katalog, porty, urządzenia etc).

2016-01-25 13:05 nospor

Aaa.... zle zrozumialem dockerfile - tak to jest jak sie ma malo czasu i czyta na szybko. Czyli dockerfile sluzy do zbudowania obrazu a nie wystartowania kontenera. Tak wiec potem tak czy siak startujac kontener korzystac bede z opcji -v.

2016-01-25 22:05 gość_diwi

Manualne uruchamianie każdego kontenera też jest bez sensu. Polecam zapoznać się z:
https://docs.docker.com/compose/

To jest w dużym skrócie dodatkowy plik konfiguracyjny definiujący jak mają być skonfigurowane i startować powiązane ze sobą kontenery.

Dzięki temu wywołujesz "docker-compose up" i wstają Ci wszystkie zdefiniowane kontenery.

2016-01-26 11:33 nospor

@diwi gdy masz x dziesias contenerow i kazdy ze soba powiazany, to fakt, reczne odpalanie kazdego z nich moze byc upierdliwe.
Ale gdy masz raptem dwa kontenery, kazdy z nich to w pelni funkcjonalna paczka, to reczne odpalanie czegos takiego niczym nie rozni sie od vagrant up wiec nie jest uciazliwe i sens ma
Ale tak, jak juz przejde przez kontenery zalezne, wtedy zapewne zainteresuje sie tez compose. Dzieki

2016-11-28 19:49 gość_Leelum

Dzięki za zainteresowanie tematem. Ciekawi mnie Wasze zdanie na temat postawienia z wykorzystaniem dockera dema systemu (i klonowania go w zależności od zainteresowania użytkowników). Problem w tym, że jedna instancja systemu musi zawierać asteriska, postgresa i parę innych rzeczy - jest sens to rozdzielać jedna usługa - jeden docker? Czy lepiej pogrupować? Z założenia system ma być homogeniczny - jedna baza, jedna konfiguracja PBX.

2016-12-02 10:03 nospor

Co masz na mysli piszac "klonowanie" ? Oraz ta jedna baza to ma byc dla wszystkich klientow?

Dodaj komentarz

 

Dostępne bbcode: b, u, i, url, code, php, css, html, sql, js

Ostatnio komentowane

  1. ShoutBox nospor
  2. ShoutBox Rafał
  3. ShoutBox nospor
  4. ShoutBox Rafał
  5. ShoutBox nospor
  6. ShoutBox Artur
  7. PHP South Coast conf... nospor

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer