Docker este un runtime de containerizare modern, care aduce în componența sa uneltele necesare împachetării unei aplicații, și a dependințelor acesteia, într-un obiect numit container. Asemănător LXC, Docker utilizează mecanismele native din Kernel-ul sistemului de operare care permit rularea izolată a unei aplicații, fără ca aceasta să interacționeze sau să influențeze procesele sistemului gazdă sau procesele aflate în execuție în alte containere. Dintr-o perspectivă mai pragmatică, putem considera un container ca fiind o multiplicare a user-space-ului (terminologia utilizată în sistemelor de operare monolitice)
Ca în orice început din IT, vom porni cu Hello, world!
student@aldebaran:~$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff 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/
Să verificăm ce se întâmplă. Pentru a vedea containerele care sunt în running state:
student@aldebaran:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Lista este goală. Pentru a vedea toate containerele, atât cele în running state cât și cele oprite:
student@aldebaran:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4bedb1ae0304 hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago vibrant_wu
Voila!
Să încercăm să rulăm un container de Alpine Linux, una din distribuțiile lightweight de Linux existente.
student@aldebaran:~$ docker run alpine Unable to find image 'alpine:latest' locally latest: Pulling from library/alpine 89d9c30c1d48: Pull complete Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a Status: Downloaded newer image for alpine:latest student@aldebaran:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES student@aldebaran:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e1f217f73d4 alpine "/bin/sh" 38 seconds ago Exited (0) 35 seconds ago cool_cray 4bedb1ae0304 hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago vibrant_wu
Container-ul este oprit. Motivul pentru care se întâmplă acest lucru se datorează faptului că ciclul de viață al unui container este 1 la 1 cu ciclul de viață al aplicației care rulează în acel container. Astfel, în cazul în care aplicația își finalizează execuția, container-ul aferent își va încheia și el rularea. Pentru a vedea ce proces rulează în mod implicit în container putem folosi docker inspect: docker inspect <nume sau id container>
Pentru simplitate, putem obține informația căutată utilizând filtre (--format):
docker inspect <nume sau id container> --format='{{.Config.Cmd}}
'
student@aldebaran:~$ docker run -dit --name infinite-alpine alpine b3bbcf9fcd8c265cf96e50c885c10ff68b597e4ba987f7e78630c094432f14bc
Putem schimba, totodată, comanda care rulează în container:
docker run -dit --name sleep-alpine alpine sleep 10000
Și putem atașa sesiunea curentă de shell unui container aflat în execuție:
student@aldebaran:~$ docker exec -it infinite-alpine /bin/sh / # ls bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
id
ip a
ps -ef
sau ps aux
hostname
env
exit
În continuare vom vorbi despre conceptul de Docker Images.