Avui investigarem i provarem algunes de les imatges que disposa DockerHub per muntar un contenidor amb un entorn de desenvolupament (Python, PHP...)
⚠Les carpetes que pengen (configs,pathlib,flask) les utilitzem a la última part d'aquesta sessió.⚠
Al final de la sessió 1 vam muntar un HelloWorld. Repassem:
- Imatge: Fitxers i directoris comprimits que contenen tot el necessari.
- Contenidor: Procés aïllat
- Virtualitzador: Compartim el Hardware i el Sistema Operatiu del Host.
⚠ De cara a muntar un projecte de final de grau, us pot anar molt bé trobar un DockerHub que contingui el sistema operatiu Ubuntu o similar i el programari necessari (Python,SQL,...)
DockerHub: https://hub.docker.com
Important mirar la informació de les imatges.
- Tag: La versió. Si surt lastest és que és la última versió.
Ho hem de fer amb aquesta comanda, per mostrar tots els contenidors arrencats: docker container ls -a
(base) mamorosal@pop-os:~$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebb885dcb2bf rapidfort/flaskapp "/bin/sh -c 'uwsgi -…" 2 days ago Exited (30) 2 days ago practical_wu
b251529948c0 hello-world "/hello" 2 days ago Exited (0) 2 days ago bold_meitner
Els NAMES que assigan Docker són aleatoris. El COMMAND és important:
Podem veure més opcions:
(base) mamorosal@pop-os:~$ docker container ls --help
Usage: docker container ls [OPTIONS]
List containers
Aliases:
ls, ps, list
Options:
-a, --all Show all containers (default shows just running)
Podem posar el nostre nom de contenidor:
docker container run hello-world -name green-donatello
Prune -> Els elimina tots. Però guarda l'estat dels contenidors per si volem tornar-lo a aixecar en una altre sessió.
(base) mamorosal@pop-os:~$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
b96422344b6e5906ef57b7a0b068d17f4ba1d655cc9d1b9610136333fa2804cb
ebb885dcb2bf33c6776a84458f4e30cc1260c2f2d1d7dc17bf4e8909366b2ef0
b251529948c031f93955d6c7e3e00f14814dae561768f8834e63420b92e2e5d5
Total reclaimed space: 148.4kB
(base) mamorosal@pop-os:~$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Fedora, Ubuntu, Alpine (muy ligera, ideal per a deployment)
Però com a developers, triem Ubuntu, ens la descarreguem:
(base) mamorosal@pop-os:~$ docker image pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6e3729cf69e0: Already exists
Digest: sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Si volem, podem eliminar la imatge de hello-world:
(base) mamorosal@pop-os:~$ docker image rm hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
Ja no podrem crear més contenidors amb aquesta imatge :( ens la hauriem de tornar a baixar.
Abans, mirem quina versió de PopOS tenim:
(base) mamorosal@pop-os:~$ uname -a
Linux pop-os 5.17.5-76051705-generic #202204271406~1653440576~22.04~6277a18 SMP PREEMPT Wed May 25 01 x86_64 x86_64 x86_64 GNU/Linux
Ara, arrenquem un contenidor d'Ubuntu amb la imatge descarregada. Ocupa molt menys que una ISO.
Què vol dir -it --> 2 paràmetres: -i Interactive - t terminal
(base) mamorosal@pop-os:~$ docker container run -it ubuntu bash
root@c8c6f009ed71:/#
Enhorabona, hem entrat com root :D
Fixeu-vos que el nostre container utilitza el Kernel del Host:
root@c8c6f009ed71:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@c8c6f009ed71:/# uname -a
Linux c8c6f009ed71 5.17.5-76051705-generic #202204271406~1653440576~22.04~6277a18 SMP PREEMPT Wed May 25 01 x86_64 x86_64 x86_64 GNU/Linux
root@c8c6f009ed71:/#
Hem de fer un update abans que res.
root@c8c6f009ed71:/# nano
bash: nano: command not found
root@c8c6f009ed71:/# sudo apt install nano
bash: sudo: command not found
root@c8c6f009ed71:/# apt update
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114
.....
```sh
Ara ja podem instal·lar i usar programes amb l'apt
```sh
apt install nano
.....
nano
Recordeu que per sortir de nano es Ctrl+X, Ctrl+O guardar.
Instal·lem més coses:
apt install tree
nano
Parem contenidor amb una de les 2 opcions:
Ctrl + D o Exit + INTRO
Veiem l'historial:
(base) mamorosal@pop-os:~$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8c6f009ed71 ubuntu "bash" 38 minutes ago Exited (0) About a minute ago modest_yalow
872b974adb0d ubuntu "bash -name ubuntu22…" 38 minutes ago Exited (1) 38 minutes ago peaceful_elion
18eb0948f45e ubuntu "-name ubuntu22amoros" 42 minutes ago Created quirky_antonelli
Amb aquestes comandes el reanudem, però esta corrent en segon pla (background)
(base) mamorosal@pop-os:~$ docker container start modest_yalow
modest_yalow
(base) mamorosal@pop-os:~$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8c6f009ed71 ubuntu "bash" 41 minutes ago Up 31 seconds modest_yalow
872b974adb0d ubuntu "bash -name ubuntu22…" 41 minutes ago Exited (1) 41 minutes ago peaceful_elion
18eb0948f45e ubuntu "-name ubuntu22amoros" 46 minutes ago Created quirky_antonelli
Faltaria la commanda per posar-lo en primer pla, attach:
(base) mamorosal@pop-os:~$ docker container attach modest_yalow
root@c8c6f009ed71:/#
Les 2 anteriors comandes les podem resumir en aquesta:
(base) mamorosal@pop-os:~$ docker container start -a modest_yalow
És molt important, si tanquem accidentalment el terminal o per tancar bé la sessió de Linux.
(base) mamorosal@pop-os:~$ docker container stop -t 1 modest_yalow
-t ==> Número de segons abans de tancar.
Només podem eliminar contenidors parats.
(base) mamorosal@pop-os:~$ docker container rm modest_yalow
Ctrl+R al terminal -> cerquem la comanda a l'historial.
docker container run -it ubuntu bash
Penseu que s'ha eliminat tot el contingut que teníem abans; torna a l'estat que tenia a l'iamtge.
Amb el commit, com github.
(base) mamorosal@pop-os:~$ docker container commit tender_austin bio:v1
sha256:36959837ed46a3303977ab65af744bd9a8b7495b6036402a1ebc8c42c536386b
Ens surt un hash, l'id de la imatge.
Provem que ha funcionat :)
docker container run -it bio:v1 bash
Ara, podriem instal·lar els programes que necessitem: Python, Jupyter, Pandas....
Fins i tot ho podriem automatitzar amb un fitxer .sh
Però molt millor usar imatges amb tot el programari configurat.
Podem utilitzar un fitxer dockerfile que contingui tots els passos que volem automatitzar. Us donem un fitxer ja fet.
Mirem el fitxer:
[./0-configs/1-docker/dev.Dockerfile]
On tenim comandes no interactives que ens permeten instal·lar automàticament tot el necessari.
-y -> No ens cal confirmar res.
Fixeu-vos com automatitzem la instal·lació de tot el necessari per programar amb Python 3:
# Basic system utilities
RUN apt-get install -y dialog nano tree zip git sqlite3 curl lynx
# Python packages. python3 is already installed but write it for completeness.
RUN apt-get install -y python3 python3-venv python3-pip python-is-python3
Amb Docker, no necessitem Conda, perquè ja tenim l'entorn aïllat (que és el que fa Conda en en nostre entorn de Pandas, Seaborn...)
La altra funció de Conda és instal·lar llibreries, però tenim altres alternatives famoses com pip i/o venv per aquest propòsit.
Amb tot, per garanitzar la seguretat, creem un entorn virtual dins el contenidor:
ENV VIRTUAL_ENV=/opt/bio-venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
Curiositats:
/opt/ ---> Carpeta on instal·lar els nostres propis paquets
La tercera línia és l'equivalent al "conda activate bio"
Usem la comanda: docker image build --tag bio --file dev.Dockerfile .
(base) mamorosal@pop-os:~/Documents/0-configs$ docker image build --tag bio --file dev.Dockerfile .
Sending build context to Docker daemon 7.68kB
Step 1/15 : FROM ubuntu
---> 6b7dfa7e8fdb
Step 2/15 : ENV DEBIAN_FRONTEND noninteractive
---> Running in 29501aac4011
Removing intermediate container 29501aac4011
....
---> a947c077c180
Successfully built a947c077c180
Successfully tagged bio:latest
--file dev.Dockerfile
Punts importants:
- image build
- --tag bio
- --file dev.Dockerfile
- . (és important, indica que volem usar els fitxers de la mateixa carpeta)
Al cap de 2-3 minuts (amb una bona connexió) ja ho tenim tot instal·lat.
Ja podriem començar.
Funciona:
root@6251c0c6584d:/# python
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> list1=[5,6,2,7]
>>> list1
[5, 6, 2, 7]
Si voleu instal·lar llibreries, usem la pàgina de pip:
Solen ser comandes del tipus: pip install
Una altra comprovació:
echo $PATH
Tindreu les variables d'entorn necessaries.
Les tenim dins del fitxer:
./0-configs/1-docker/requirements.txt
Primer, heu de crear una carpeta del vostre disc que sigui localitzable. Heu de copiar la ruta absoluta.
docker container run -it --name bio --mount=src='/home/mamorosal/Documents/docker-code',target='/bio',type='bind', bio bash
Comentaris: Nom imatge == Nom Contenidor El mount és super important que sigui exacte, és el que crea la carpeta compartida, l'src és la ruta de la carpeta del disc, i el target de la carpeta compartida dins de Docker.
Comprovem-ho:
- Apliquem la comanda.
- Posem un fitxer .txt dins de la carpeta del host
- Fem un ls dins del contenidor de docker, dins la carpeta /bio
- Fixem-nos que funciona.
Tingueu en compte que heu d'estar com a root dins de docker.
(base) mamorosal@pop-os:~/Documents/0-configs$ docker container run -it --name bio --mount=src='/home/mamorosal/Documents/docker-code',target='/bio',type='bind' bio bash
root@6251c0c6584d:/# ls
bin bio boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@6251c0c6584d:/# cd bio
root@6251c0c6584d:/bio# ls
Instalar-Sessio1m14.txt
Es deu a un problema de permisos. Dins del docker, canvieu els permisos d'usuari:
sudo chown -R <usuari>:<usuari> .
A alguns equips no reconeix una carpeta que hauria de reconèixer a VSCode, la que hi ha l'entorn virtual: /opt/bio-venv/bin/python
El que farem és crear un entorn nou igual a l'anterior, per a què el VSCode el reconegui,
root@39afbdb94c74:/bio# which -a python
/opt/bio-venv/bin/python
/usr/bin/python
/bin/python
root@39afbdb94c74:/bio# /bin/python -m venv bio-env2
root@39afbdb94c74:/bio# ls
2023-01-09-code bio-env2
root@39afbdb94c74:/bio# cd bio-env2/
root@39afbdb94c74:/bio/bio-env2# ls
bin include lib lib64 pyvenv.cfg
root@39afbdb94c74:/bio/bio-env2# cd ..
root@39afbdb94c74:/bio# cd bio-env2/bin/
root@39afbdb94c74:/bio/bio-env2/bin# ls
Activate.ps1 activate activate.csh activate.fish pip pip3 pip3.10 python python3 python3.10
root@39afbdb94c74:/bio/bio-env2/bin# source activate.
activate.csh activate.fish
root@39afbdb94c74:/bio/bio-env2/bin# source activate
(bio-venv) root@39afbdb94c74:/bio/bio-env2/bin# source activate
(bio-venv) root@39afbdb94c74:/bio/bio-env2/bin# which -a python
/opt/bio-venv/bin/python
/opt/bio-venv/bin/python
/usr/bin/python
/bin/python
Un cop seguides aquestes instruccions ja ens deix seleccionar l'entorn virtual.
És especialment important:
source activate
Un cop ha reconegut l'entorn; necessitarem instal·lar-hi les llibreries.
La forma més fàcil és usar el fitxer requirements.txt que tenim a la carpeta de docker:
pip install -U requirements.txt
Extensions a instal·lar a VSCode:
- Docker
- Dev Containers
Us sortiran noves icona a sota:
- Docker -> forma de balena.
- Dev Containers > Forma pantalla.
Arrencant aquests plugins aconseguim arrencar/parar i accedir a la carpeta compartida on tenim el contenidor amb el VSCode.
Hem repassat tot el que vam fer:
- Teoria de Docker: imatges i contenidors
- Crear un contenidor d'Ubuntu a partir d'una imatge de DockerHub
- Crear un contenidor d'Ubuntu i totes les eines de Python preparades mitjançant
- Crear una carpeta compartida entre el contenidor docker i el nostre SO Host.
- Gestionar el contenidor i la carpeta compartida des de VSCode.
Els projectes de VSCode tenen una carpeta oculta amb la configuració de debug (entre d'altres) del projecte. Podeu consultar-la amb ls -la des del terminal o amb Ctrl+F8 des del explorador gràfic
Es troba a: .vscode launch.json
Esborreu aquesta carpeta i podreu crear una configuració de debug personalitzada.
La podeu generar amb VSCode, que és el més recomanable.
Aneu al botó de Debug i us sortirà el següent; pitgeu a crear Launch.JSON
La teniu en aquests apunts, per a què recordeu com es fa ?
Recurs opcional:
https://towardsdatascience.com/how-to-debug-flask-applications-in-vs-code-c65c9bdbef21
Usarem el fitxer no_interpreter.py
Aquest fitxer serveix per a fer que no sigui obligatori trobar-nos a la mateixa carpeta on està el fitxer Python per a poder executar el fitxer. Compleix la mateixa funció del launch.json per si no useu VSCode.