Ebben a rövid cikkben megpróbálom bemutatni a dockert és a compose modulját, mivel a jövőbeni cikkeimben tárgyalt alkalmazásokat nagy eséllyel dockerben fogom futtatni.
Mi is az a docker?
A Docker egy olyan spéci program, amely operációs rendszer szintű virtualizációt végez. A Docker konténerek futtatására szolgál. A konténerek egymástól elkülönülnek, és saját alkalmazást, eszközöket, könyvtárakat és konfigurációs fájlokat kötnek össze, jól meghatározott csatornákon keresztül kommunikálva egymással. Minden konténert egyetlen operációs rendszer kernel működtet, így kevesebb a rendszerigényük, mint a virtuális gépeknek. Forrás: wikipedia
Ettől nem lettem okosabb, gyakorlatilag mire is jó a docker?
Képzelj el egy szervert, ami valamilyen virtualizációs technológiát használ (például a nemrég mutatott Virtualboxot). Ezen a szerveren futtatsz mondjuk 5 db virtuális szervert (VM), mindegyikben valamilyen Linux Operációs rendszert. Mindegyik szerveren fut 1-1 alkalmazás. Tehát van 5 alkalmazásod, amihez 5 oprendszert is fent kell tartani szőröstül-bőröstül. Magyarán, elpocsékoltál egy csomó diszket és memóriát. Nem beszélve az idődről, amit az 5 szerver frissen tartásával töltesz.
Erre jött válaszul a konténer technológia. Direkt nem a dockert írtam, mert az csak az egyik képviselője a technológiának.
Szóval vegyük alapul az iménti 5 alkalmazást, ám most ezt dockerrel valósítsuk meg.
Tételezzük fel, hogy ennek az 5 alkalmazásnak van hivatalos docker támogatása (le tudod tölteni a konténert a netről), mert ha nincs, akkor neked kell csinálni, erről majd egy másik cikkben beszélek.
Azaz van egy dockert futtató szervered, és elindítod az 5 alkalmazást konténerben. Most megspóroltál 5 oprendszernyi diszket, és memóriát, mivel minden konténer a futtató szerver kernelét használja, és csak annyi memóriát eszik, ami az alkalmazásnak kell. És nincs is mit frissíteni, na jó, a konténereket néha nem árt. Tiszta haszon!
Vágom, akkor telepítsük fel a dockert
Nem írom le minden oprendszerhez, csak a szokásos Fedora Linuxomhoz, a hivatalos weboldalon megtalálható kb az összes támogatott OS-hez a leírás.
$ sudo dnf install docker docker-compose -y
$ sudo systemctl start docker
Futtassuk az első konténerünket
$ sudo docker run hello-world
És a kimenet:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:926fac19d22aa2d60f1a276b66a20eb765fbeea2db5dbdaafeb456ad8ce81598
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Az 1. sorban közli, hogy a választott képfájl nincs még letöltve (Unable to find image 'hello-world:latest' locally
).
A következő 4 sorban szépen letölti, majd kicsomagolja a konténert (latest: Pulling from library/hello-world
).
A 6. sortól pedig már a konténer kimenetét láthatjuk (Hello from Docker! ...
).
Ez persze csak egy amolyan „kamu” konténer, nézzünk valami hasznosabbat, pl töltsünk le egy apache webszervert:
$ sudo docker pull httpd:2.4.57-alpine
Van egy új paraméter, a pull
, ez csak letölti a konténert, de nem futtatja. Mögötte pedig a konténer verzióját láthatjuk az alábbi formában:
httpd
– ez a webszerver neve (ismertebb nevén: apache)
:
– ez választja el az image nevet a verziótól
2.4.57
– ez pedig a konténer image veriója
-alpine
– a végén látható alpine arra utal, hogy alpine alapú a konténer.
Az Alpine Linux alap biztosítja a legkisebb konténer méretet, mindössze 7,3 MB.
Futtassuk a webszervert
$ sudo docker run -d --name apache -p 8080:80 httpd:2.4.57-alpine
Vegyük elő a böngészőnket, és gépeljük be ezt (rá is kattinthatsz, új ablakban fog megnyílni): http://localhost:8080/
Mik ezek az új kapcsolók a parancsunkban?
-d
> háttérben futtatjuk a konténert
--name apache
> apache néven futtatjuk a konténert
-p 8080:80
> a konténer belül a 80-as porton figyeli a kéréseket, mi viszont a saját gépünkön a 8080-as porton szeretnénk látni
Nézzünk pár egyszerű docker parancsot
$ sudo docker images
Megmutatja a letöltött konténereket, azok azonosítóit, létrehozásának idejét, és a diszken elfoglalt méretét:
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd 2.4.57-alpine 352fdc2b5b26 4 weeks ago 59.1MB
hello-world latest 9c7a54a9a43c 2 months ago 13.3kB
$ sudo docker ps -a
Megmutatja az összes konténert, a már döglötteket is (a „-a
” nélkül futtatva csak a futó konténereket listázza), mutatja az azonosítójukat, az image nevét, a futtatott parancsot, a létrehozás idejét, a státuszát, a portjait, és a végén a konténer nevét:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9856a47c79e httpd:2.4.57-alpine "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp apache
a8428a0fe72c hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago cranky_banzai
Ha nem adunk nevet a konténernek, akkor ad neki egyet a docker, pl a hello-world
-nek a cranky_banzai
-t.
Hogyan kell parancsokat futtatni egy futó konténeren belül?
Maradjunk a webszerverünknél, és nézzük meg a konténer alapjául szolgáló OS verzióját:
$ sudo docker exec apache cat /etc/os-release
A cikk írásakor ezt láttam, ha később futtatjátok, akkor is ezt fogjátok látni, mert direkt egy adott verziójú konténert töltettem le a dockerrel:
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.18.2
PRETTY_NAME="Alpine Linux v3.18"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
A másik módszer, hogy belépünk a konténerbe, és ott adjuk ki a parancsokat:
$ sudo docker exec -it apache sh
Az új kapcsoló a „-it
„, azaz az interaktív terminál, a sor végén pedig a shell látható (sh), az fog nekünk parancs sort adni a konténeren belül. Ha végeztünk, az exit
paranccsal tudunk kilépni a konténerből.
Tök jó, van egy webszerverem, de nincs benne weboldal…
Mi sem egyszerűbb, töröljük le a konténert (ha csak leállítjuk (docker stop apache
), attól még létezik, és ugyanezen a néven nem tudunk másikat létrehozni), és hozzunk létre egy olyat, ami már a weboldalunkat futtatja:
$ sudo docker rm -f apache
$ sudo docker run -d --name apache -p 8080:80 -v /srv/www:/usr/local/apache2/htdocs httpd:2.4.57-alpine
Ehhez szükség van egy új kapcsolóra „-
v”, aminek a paramétere a gépemen lévő mappa (/srv/www
), illetve a konténerben található documentroot, ebben a példában: /usr/local/apache2/htdocs
.
Ha elhelyezzük a weboldalunkat a /srv/www
mappába, akkor kész is vagyunk. Ne feledjük, ez csak html fájlokkal működik, ebben a konténerben nincs php (ahogy más sem).
Kezdésnek elég is ennyi, mivel tud többet a docker-compose?
Megjegyzés: a kötőjellel írt docker-compose az 1.x-es verziót jelenti, míg a szóközzel írt docker compose már a 2.x-es verziót jelenti.
Tehát, vagy a dockerünk, amit általában jó hosszú paranccsal használunk, nem túl előnyös, ha sok konténerünk van, pláne, ha nem csak egyedül visszük az üzemeltetést.
A docker-compose erre kínál megoldást, futtassuk a korábbi konténerünket most már a docker-compose-al, erre létre kell hoznunk egy docker-compose.yml nevű fájlt ezzel a tartalommal:
version: '3'
services:
webszerver:
container_name: apache
image: httpd:2.4.57-alpine
ports:
- 8080:80
volumes:
- /var/www/html:/usr/local/apache2/htdocs
- /etc/localtime:/etc/localtime:ro
Az utolsó sor beállítja a konténerben az időzónát, így a konténer logjainak időbélyege meg fog egyezni a saját gépünk időbélyegével.
Így kell elindítani: $ sudo docker-compose up -d
Így pedig leállítani: $ sudo docker-compose down
Ha már emlegettem a logokat, így tudjuk megnézni: $ sudo docker logs -f apache
Amíg meg nem szakítjuk CTRL+C-vel, addig fogja a képernyőre kiírni a logokat valós időben, próbáljuk ki, a böngészőben néha frissítsük a weboldalunkat.
Pár tipp, megjegyzés a végére
- a docker nagyon jó, ha ki akarunk próbálni egy programot, sokkal egyszerűbb kiadni egy
docker run image:version
parancsot, mint feltelepíteni - nagyon jó, ha egy szoftverből egyszerre több verziót szeretnénk használni, mert nem fognak összeütközni
- nagyon könnyű a frissítése, sőt a visszalépés, ha hibás a frissítés, csak a verzió számot kell módosítanunk
- némi munkával el lehet vele érni magas rendelkezésre állást is (docker-swarm / kubernetes)
Csak a felszínt kapargattuk, de ezzel már el lehet indulni, és használat közben rá fogunk jönni, hogy mire van még szükségünk. Én is fogok még pár új dolgot emlegetni a következő cikkeimben.
Nem is tudtam, hogy kötőjel nélkül magasabb a verziója a compose-nak… Köszönöm.