01. [20p] Hello Docker

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)

Dacă nu înțelegeți încă această ultimă sintagmă… SO is coming!

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}}'

Pentru a forța execuția continuă a containerului, putem utiliza argumentele -dit (referințe suplimentare în pagina de manual docker-run)

  • -d detach
  • -i interactive
  • -t pseudo-tty

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

Afișați pe rând:

  • pid-ul utilizatorului curent: id
  • adresa ip a containerului: ip a
  • toate procesele care rulează pe sistem: ps -ef sau ps aux
  • hostname-ul: hostname
  • variabilele de mediu: env
  • și ieșiți: exit

În continuare vom vorbi despre conceptul de Docker Images.