TSM - Docker, Build & Ship

Raluca Oanca-Boca - Full Stack Developer @Self-Employed

Toți programatorii doresc uneori ca algoritmul să fie scris o singură dată și să-l poată rula pe diferite sisteme de operare și independente. Soluția Docker pornește de la aceeași premisă exceptând faptul că în loc de a scrie cod, poate configura servere într-un mod personalizat, începând de la alegerea sistemului de operare, configurarea customizată a unor fișiere, instalarea de anumite programe.

Ce este Docker?

Docker te ajută să realizezi un sistem cât mai izolat și standardizat al unei aplicații și a tuturor dependințelor acesteia pentru un mod de lucru independent.

Docker aduce  în plus față de mașini virtuale, faptul că este bazat pe un sistem de containere. Aceste containere te ajută să rulezi cod, tool-uri de sistem, librării de sistem sau orice altceva ce se poate instala pe un server, într-un mod independent de mediul de lucru, garantând că acestea se vor rula în același mod.

Diferența dintre o mașină virtuală și un container Docker este faptul că aceste containere vor avea într-un final același kernel și nu sunt legate de nicio infrastructură sau sistem de operare gazdă. O altă diferență este că nu te obligă la o limitare din punct de vedere al memoriei.

Docker furnizează un set de tool-uri precum: Docker Engine, Docker Compose, Docker Hub, Docker Swarn, Docker Machine, Docker Trusted Registry. Fiecare dintre aceste tool-uri vin cu diferite comenzi.

Docker Engine

Asigură majoritatea funcțiilor de a crea o imagine și de a  rula un container docker. Este core-ul a tuturor celorlalte tool-uri. Să ne asiguram că avem docker instalat pe sistemul gazdă, vom rula comanda

  sudo apt-get install docker-engine

Pornirea clientului daemon:

 sudo service docker start 

Pentru a verifica dacă acesta este instalat :

 docker  --v

Odată ce-l avem pe acesta instalat, putem să începem să ne creăm propria imagine, pentru a realiza acest lucru avem nevoie de a crea un fișier numit Dockerfile.

MAINTAINER Raluca Onaca Boca 
    RUN apt-get update
    RUN apt-get -y upgrade

    # Install apache, PHP, and supplimentary programs. curl and lynx-cur are for debugging the container.
    RUN DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 php5 php5-mysql php5-gd php-pear php5-curl curl
    # Update the PHP.ini file, enable  tags.
    RUN sed -i "s/short_open_tag = Off/short_open_tag = On/" /etc/php5/apache2/php.ini
    # Enable apache mods.
    RUN a2enmod rewrite
    # Manually set up the apache environment variables
    ENV APACHE_RUN_USER www-data
    ENV APACHE_RUN_GROUP www-data
    ENV APACHE_LOG_DIR /var/log/apache2
    ENV APACHE_LOCK_DIR /var/lock/apache2
    ENV APACHE_PID_FILE /var/run/apache2.pid

    VOLUME /var/www/site
    EXPOSE 80
    # Copy site into place.
    # Update the default apache site with the config we created.
    ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
    # By default, simply start apache.
    CMD /usr/sbin/apache2ctl -D FOREGROUND

Comenzile din acest fișier ne creează o imagine docker având ca sistem de operare ubuntu, ca server al aplicației apache, limbajul de programare php și câteva librării, sincronizarea proiectului prin instrucțiunea și adăugarea fișierului pentru un virtual.

Pentru a crea această imagine :

sudo docker build -t ralucaonaca/first-site:v1 .

Rulând comanda anterioară se va verifica în primul rând dacă avem deja imaginea de ubuntu sau nu. În cazul negativ, atunci se va face un download la aceasta, flag-ul -t indentifică această imagine ca fiind una nou creată a utilizatorului ralucaonaca iar pe nume first-site cu tag-ul :v1.

Un container docker se creează prin instanțierea acestei imagini:

      Câteva dintre comenzile mai importante:

docker ps - lista de containere.

docker stop - oprirea containerului care rulează.

docker images - lista de imagini create.

docker search - căutarea în repository a unei imagini.

docker rmi - ștergerea unei imagini.

docker rm - ștergerea unui container docker

Docker Compose

Acest tool ne ajută să ne creăm multiple containere. După crearea mediului de lucru prin fișierul Dockerfile se creează un fișier docker-compose.yml prin care ne definim serviciile  necesare unei aplicații astfel încât acestea să ruleze concomitent și izolat.

web:
image: ralucaonaca/first-site:latest
ports:
  -"5000:5000"
volumes:
\- /var/www/site:/var/www/site
links:
\- redis
\- db
redis:
image: redis
db:
image: mysql:latest

În acest fișier am definit containerul creat din imaginea ralucaonaca/first-site:latest având două link-uri. Pentru a crea containerul se folosește comanda:

sudo docker-compose up

Un avantaj pentru a folosi docker composer este crearea mai multor containere utilizând o singură comandă, toate acestea containere având același host.

Câteva dintre comenzile mai importante sunt:

docker-compose ps - listarea de containere

docker-compose kill - oprirea containerelor

docker-compose rm - stergerea containerelor oprite

Docker Hub

E un serviciu cloud care ne ajută să ținem o evidență a tuturor imaginilor create. Câteva dintre proprietățile principale sunt:

repository a imaginilor : manipularea și găsirea de imagini atât publice cât și private.

automatizarea build-urilor : asigură conectarea la conturile de github cât și de bitbucket cât și realizarea de imagini automate.

webhooks : o proprietate pentru crearea de imagini automate, ne lasă să facem trigger la anumite acțiuni.

O recapitulare.

Putem spune că acest tool se comportă ca și Git deoarece pornește de la aceeași premisă numai că  va face track la schimbările în sistem.

Pentru căutarea de imagini publice se va folosi comanda docker search ubuntu. Pentru a reuși să faci la o imagine, ai nevoie de a te conecta la acest tool docker login, după logare se poate utiliza comanda docker push /:.

Comparație cu Vagrant 

Vagrant se bazează pe provider-ul de mașină virtuală având ca  provisionare mai multe posibilități : shell, puppet, ansible și multe altele pentru a putea crea un mediu de lucru izolat și independent de sistemul gazdă, în schimb ce pentru Docker nu este nevoie de acest provider.

Folosind Vagrant se poate face provisionarea și prin containere docker de unde putem trage concluzia că docker este o parte complementară pentru Vagrant.

Concluzie

Avantajul că orice imagine docker se poate rula pe orice mașină schimbă un pic regulile jocului. Prin comenzile pull/push se creează o conexiune mai ușoară între dezvoltatorii de soft cât și devops. Un alt avantaj este faptul că se pot crea containere ale aplicației cât și containere pentru baza de date sau pentru un sistem de cache ce se poate partaja între devops și developer-i.