DOCKER - CREAZIONE IMMAGINE ----------------------------------- Creazione immagine da terminale Linux (dopo aver installato Docker) sysadmin@pbmint:~/my-flask-mongodb$ sudo docker build -t my-flask-mongodb:1.0.0 . Esecuzione Container: $ sudo docker run -p 5000:5000 my-flask-mongodb:1.0.0 Oppure (occorre avviare pero' mongodb e app.py a mano): $ docker run -it my-flask-mongodb:1.0.0 /bin/sh Per controllare eventuali errori: $ docker logs In un'altra finestra di shell: sysadmin@pbmint:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fbdb498b2814 my-flask-mongodb:1.0.0 "/bin/sh -c 'mongod …" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp focused_grothendieck Per fermare uncontainer: sysadmin@pbmint:~$ sudo docker stop 5e852ecc5b61 5e852ecc5b61 sysadmin@pbmint:~$ sudo docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES sysadmin@pbmint:~$ Aggangiamo una shell al container tramite ID: sysadmin@pbmint:~$ sudo docker exec -it fbdb498b2814 /bin/sh /app # ls Dockerfile app.py requirements.txt Controllo che Flask e mongodb siano pronti: /app # netstat -tlpn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 1/python tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 9/mongod processi: /app # ps PID USER TIME COMMAND 1 root 0:02 python app.py 8 root 0:16 mongod --fork --logpath /var/log/mongod.log 46 root 0:00 /bin/sh 52 root 0:00 ps IP address: /app # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0 ... Contattiamo flask con curl: /app # curl http://localhost:5000 { "message": "Welcome to Products app!" } chiedo la collection products (vuota): /app # curl http://localhost:5000/products { "data": [] } Inseriamo alcuni record: /app # curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_1T","prize":100}' http://127.0.0.1:5000/products { "message": "Item saved successfully!" } /app # curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_2T","prize":120}' http://127.0.0.1:5000/products { "message": "Item saved successfully!" } /app # curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_3T","prize":150}' http://127.0.0.1:5000/products { "message": "Item saved successfully!" } /app # curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK 4T","prize":170}' http://127.0.0.1:5000/products { "message": "Item saved successfully!" } /app # curl http://localhost:5000/products { "data": [ { "id": "6643680c7905b806f1c1af9f", "name": "DISK_1T", "prize": 100 }, { "id": "6643681a7905b806f1c1afa0", "name": "DISK_2T", "prize": 120 }, { "id": "664368277905b806f1c1afa1", "name": "DISK_3T", "prize": 150 }, { "id": "664368387905b806f1c1afa2", "name": "DISK 4T", "prize": 170 } ] } /app # Modifichiamo un record: /app # curl -X PUT -H 'Content-Type: application/json' -d'{"name":"DISK_4T","prize":553}' http://127.0.0.1:5000/products /664368387905b806f1c1afa2 { "message": "Item updated successfully!" } /app # curl http://localhost:5000/products { "data": [ { "id": "6643680c7905b806f1c1af9f", "name": "DISK_1T", "prize": 100 }, { "id": "6643681a7905b806f1c1afa0", "name": "DISK_2T", "prize": 120 }, { "id": "664368277905b806f1c1afa1", "name": "DISK_3T", "prize": 150 }, { "id": "664368387905b806f1c1afa2", "name": "DISK_4T", "prize": 553 } ] } /app # Oppure si puo' creare un semplice script per inserire dei records: curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_1T","prize":100}' http://127.0.0.1:5000/products curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_2T","prize":120}' http://127.0.0.1:5000/products curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK_3T","prize":150}' http://127.0.0.1:5000/products curl -X POST -H 'Content-Type application/json' -d'{"name":"DISK 4T","prize":170}' http://127.0.0.1:5000/products ora si puo'chiamare da browser: http://:5000 oppure: http://:5000/products Per modificare l'applicazione flask in app.py occorre stoppare il processo in ascolto sulla porta impostata 5000. Ora questo l'elenco dei processi nel container e' il seguente: /app # ps PID USER TIME COMMAND 1 root 0:02 python app.py 8 root 0:16 mongod --fork --logpath /var/log/mongod.log 46 root 0:00 /bin/sh 52 root 0:00 ps Il processo con PID 1 nel container non puo' essere fermato senza uscire dal container. Cioe' se: /app # kill -9 1 non succede nulla. Si potrebbe usare le trap: /app # trap "exit" SIGINT SIGTERM /app # kill -s SIGINT 1 Ma il container muore. Avviamo quindi un nuovo container pero' in questo modo sysadmin@pbmint:~$ sudo docker run -it /bin/sh in questo caso: /app # ps PID USER TIME COMMAND 1 root 0:00 /bin/sh 9 root 0:06 mongod 34 root 0:01 python app.py 37 root 0:00 ps Il PID 1 non e' piu' su python app.py quindi posso modificare app.py Lo fermo con: /app # kill -9 34 faccio le mie modifiche e poi lo riavvio: /app # python app.py Ai puo' avviare una shell con il exec exec: $ docker exec -it my-flask-mongodb:1.0.0 /bin/sh o con l'opzione attach, se si e' avviato in modalita' detach un container (cioe' in Background): $ docker attach ma attenzione ci si aggancia al processo con PID 1 del container