Pierwsza przygoda z Dockerem

Docker. Kontenery. Wirtualizacja. Środowisko programistyczne. Jeśli zastanawialiście się jak rozpocząć zabawę z konteneryzacją to jest wpis dla Was :) Krok po kroczku postawicie swojego pierwszego dockera.

Dzisiejszy przykład będzie bardzo prosty, postawimy serwer node.js w kontenerze, który będzie zwracał miłą wiadomość. Proszę nie robić tak na produkcji :)

Stop. Co to są te kontenery?

Jeśli takie pytanie przeszło ci przez głowę to najlepsza odpowiedź brzmi mniej tak: to taki wirtualny komputer na twoim fizycznym: kompletnie odseparowany i niezależny (oczywiście oprócz zasobów fizycznych). Można go postawić na dowolnym, innym komputerze i wszędzie będzie działał tak samo. Dlatego developerzy używają go do stawiania środowisk programistycznych/produkcyjnych.

To jak? Gotowi na pierwszą przygodę z Dockerem?

Rozpoczęcie

Pierwsze co musicie zrobić to zainstalować Dockera, najbezpieczniej pobrać go z oficjalnej strony.

Stwórzmy folder kreda w którym będziemy trzymali nasz projekt, a w środku:

  • plik server.js w którym będzie kod aplikacji opartej na express.js
  • plik package.json w którym dodamy zależności aplikacji
  • plik Dockerfile w którym będą polecenia do zbudowania środowiska i aplikacji
  • plik .dockerignore w którym dodamy ścieżki które chcemy w dockerze ignorować

Zacznijmy od serwera:

// server.js
const express = require('express');
const app = express();

app.get('/', function (req, res) {
  res.send('Hello guys! Kamila is here');
});

// 8080 to przykładowy port
app.listen(8080, function () {
  console.log('Example app listening on port 8080!');
});

A teraz package.json:

// package.json
{
    "name": "solutionchaser",
    "version": "1.0.0",
    "description": "Blog post",
    "main": "index.js",
    "scripts": {
      "start": "node server.js"
    },
    "author": "Kamila",
    "license": "OhPlease",
    "dependencies": {
      "express": "^4.15.3"
    }
  }

Testowo odpalmy server.js w konsoli (będąc oczywiście w folderze kreda):

// w konsoli
npm i
node sever.js

Jeśli nie pojawił się żaden błąd, to spróbujmy otworzyć stronę w przeglądarce pod adresem http://127.0.0.1:8080. Jeśli wyświetli się ekran powitalny to odnieśliśmy pierwszy sukces. Niezwiązany z dockerem, ale jednak!

Teraz zabijmy proces i zamknijmy konsolę, jest to szczególnie ważne bowiem czasem system nie zwalnia portu.

Definicje dockerowe

Korzystając z Dockera najczęściej korzysta się z gotowych obrazów zawierających system z zainstalowanymi komponentami. Jako, że chcemy postawić prostą aplikację node.js przydałby się nam node.

Pod tym linkiem DockerHub można zobaczyć listę oficjalnie dostępnych obrazów do uruchomienia w dockerze i chyba jest to najprostszy sposób na start :) Wybrałam node'a w wersji 10.

W pliku Dockerfile wykonujemy kroki służące do zbudowania kontenera. Robimy to za pomocą krótkich (zwykle pisanych wielkimi literami) komend takich jak COPY albo CMD.

// wykorzystanie obrazu zawierającego node w wersji 10
FROM node:10

// skopiowanie wszystkich plików z obecnego katalogu do kontenera
COPY . .

// wykonanie komendy: npm install która pobierze paczkę express.js
CMD npm install

// wystaw na zewnątrz port 8080, żeby można było się z nim połączyć
EXPOSE 8080

// wykonanie komendy node server.js
CMD node server.js

A teraz .dockerignore, bowiem nie chcemy, żeby z naszego lokalnego środowiska kopiowały się niepotrzebne pliki:

node_modules
npm-debug.log

Ty, ja i Docker - let's run it!

Po pierwsze musimy zbudować środowisko:

docker build -t twoja-nazwa-kontenera .

Nie ma żadnych błędów? Mam nadzieję :)

To teraz uruchomimy go, żebyśmy mogli korzystać z aplikacji. W parametrze p podajemy mapowanie portu (tego samego co w EXPOSE do tego który chcemy wpisywać w przeglądarce). Tutaj oczywiście mapowanie jest trochę bez sensu, ale gdy macie port 8080 zajęty na fizycznej maszynie to oto trick :)

docker run -p 8080:8080 -d twoja-nazwa-kontenera

Mam nadzieje, że zwrócił długi ciąg znaków w konsoli, teraz skopiujmy go i wklejmy:

docker logs dhdbahjdbahjdbadjhabdbdahdbahwid

Tutaj powinniśmy dostać informację: Example app listening on port 8080!

Ostatni etap to odpalenie serwera w przeglądarce: http://127.0.0.1:8080.

SUKCES :)

Niestety nie jest to perfekcyjne rozwiązanie ze względu na mnogość środowisk fizycznych, gdzie najbardziej ograniczają nas systemy operacyjne. Prawda jest taka, że większość serwerów na świecie stoi na Linuxach i jest to najlepsze środowisko programistyczne również pod względem wirtualizacji.


Apple nie wspiera natywnie wirtualizacji, więc większe środowiska mogą chodzić dużo wolniej bez paru tricków i hasków. Na Windowsie w wersji Home (brak obsługi wirtualizacji Hyper-V) podobno trudno uruchomić Dockera bez dodatkowego oprogramowania. Są jeszcze rozważania na temat ogólnej wydajności, ale to zdecydowanie nie jest wpis aby się w to zagłębiać.

Podsumowanie

Mam nadzieje, że się podobało i udało się Wam w 30 minut zbudować swój pierwszy kontener. To oczywiście jest tylko zalążek możliwości dockera i jeden serwis wiosny nie czyni, ale mam nadzieje, że przekonałam jak łatwa i przyjemna jest konteneryzacja :)

Kamila

Dziękuję za poświęcony czas, będzie mi bardzo miło jak zostawisz komentarz :)