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:/#
Niciun comentariu:
Trimiteți un comentariu