joi, 5 septembrie 2019

joi, 29 august 2019

2.4 Impachetarea unei aplicatii Flask intr-un Container


Problema

Ai o aplicatie web facuta cu frameworkul Flask de Python, ce ruleaza in Ubuntu 14.04. Vrei sa rulezi aceasta aplicatie intr-un container.

 Solutie

Ca si exemplu, vei folosi aplicatia simpla Hello World definite de urmatorul script Python:
#!/usr/bin/env python
from flask import Flask
app = Flask(__name__)
@app.route('/hi')
def hello_world():   
return 'Hello World!'
if __name__ == '__main__':   
app.run(host='0.0.0.0', port=5000)
Pentru a rula aceasta aplicatie intr-un container Docker, trebuie sa scrii un fisier Docker care instaleaza cerintele preliminare(software necesar sa ruleze aplicatia respectiva) pentru rularea aplicatiei folosind cheia RUN si expune portul pe care ruleaza aplicatia folosind cheia EXPOSE. De asemenea ai nevoie sa muti aplicatia intr-un container de tip filesystem folosind cheia ADD. Aces fisier Docker va arata cam asa:
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y python
RUN apt-get install -y python-pip
RUN apt-get clean all
RUN pip install flask
ADD hello.py /tmp/hello.py
EXPOSE 5000
CMD ["python","/tmp/hello.py"]
Acest fisier  Docker nu este optimizat intentionat; cand intelegi principiile de baza, vezi Reteta 2.5 sa builduiesti imagini urmand cele mai bune practice de a scrie fisiere docker. Comanda RUN iti permite sa executi comenzi shell specific de-a lungul buildului imaginii container. Aici updatezi cache-ul repositoriului, instalezi Python, de asemenea si Pip, si instalezi micro-frameworkul de Flask.
Pentru a copia aplicatia intr-o imagine container, folosesti comanda ADD. Aceasta copiaza fisierul hello.py in folderol /tmp/ .
Aplicatia foloseste portul 5000, si vei expune acest port in hostul Dockerului.
In cele din urma, comanda CMD specifica faptul ca acel container va rula pythonul /tmp/ hello.py la timpul executiei. Ce a mai ramas de facut este sa builduim imaginea:
$ docker build -t flask .
Asta creeaza o imagine flask Docker:
$ docker images
REPOSITORY          TAG         IMAGE ID            CREATED         VIRTUAL SIZE
flask               latest      d381310506ed        4 days ago      354.6 MB
 cookbook            echo        e778362ca7cf        4 days ago      192.7 MB
 ubuntu              14.04       9bd07e480c5b        10 days ago     192.7 MB
Pentru a rula aplicatia, foloseste optiunea –d a docker runului, care dezarhiveaza containerul, si foloseste de asemenea optiunea –P a docker runului pentru a lasa Dockerul sa aleaga un port pe un host Docker care va fi mapat la portul expus specificat in fisierul Docker (de ex: 5000):
$ docker run -d -P flask
5ac72ed12a72f0e2bec0001b3e78f11660905d20f40e670d42aee292263cb890
$ docker ps
CONTAINER ID    IMAGE         COMMAND               ... PORTS
 5ac72ed12a72    flask:latest  "python /tmp/hello.p  ... 0.0.0.0:49153->5000/tcp
Containerul este returnat, este dezarhivat, si nu mai esti logat in shellul interactive. PORTS iti arata maparea dintre portul 5000 al containerului si portul 49453 al hostului Docker. O comanda curl la adresa http://localhost:49153/hi returneaza Hello World, sau poti deschide browserul la acelasi URL.
Daca folosesti Boot2Docker, va fi nevoie sa folosesti adresa IP a bridgeului de retea, in loc de localhost. Daca nu vrei sa folosesti localhost, adauga retransmiterea regulilor de port in VirtualBox.
Discutie
Din moment ce fisierul tau Docker a specificat o comanda sa ruleze prin CMD, nu mai trebuie sa specifici o comanda dupa numele imaginii pe care o folosesti. Totusi, poti suprascrie aceasta comanda sis a pornesti containerul in modul interactive prin pornirea shellului bash ca mai departe:
$ docker run -t -i -P flask /bin/bash
 root@fc1514ced93e:/# ls -l /tmp
 total 4
-rw-r--r-- 1 root root 194 Dec  8 13:41 hello.py
root@fc1514ced93e:/#

joi, 22 august 2019

2.3 Scrierea primului Dockerfile

Problema

Ruland un container in modul interactiv, facand schimbari si dupa salvand aceste schimbari pentru a creea o noua imagine mergea bine (vezi Reteta 2.1). Dar, chiar si asa, iti doresti sa automatizezi procesul builduind imaginea ta si impartasindu-ti pasii creati cu ceilalti.