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 :)