lunes, agosto 28, 2017

Experimentos con Docker y TensorFlow

En este primer post, explico una receta de como instalar Docker en un linux que corre en un VPS con un cuadcore x86 (64 bits). Como toda receta puede haber métodos mejores, pero para lo que necesito es suficiente. En este caso en la puesta a punto de un servidor LAMP en un contenedor.

Lo primero es instalar el Docker, en su versión mas moderna de mantenimiento. Para ello ejecutamos:

  1. sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
  2. sudo apt-get update
  3. sudo apt-get install docker-engine

Para saber si Docker está corriendo como servicio, basta con usar:

sudo systemctl status docker

Que nos devolverá algo parecido a esto si el servicio está funcionando

docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e
   Active: active (running) since vie 2017-08-25 16:12:09 ART; 2 days ago


Por otro lado al hacer un ifconfig debe aparecer el bridge

docker0   Link encap:Ethernet  direcciónHW 02:42:04:ec:36:db 
          Direc. inet:172.17.0.1  Difus.:0.0.0.0  Másc:255.255.0.0
          Dirección inet6: fe80::42:4ff:feec:36db/64 Alcance:Enlace
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:50356 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:58643 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:0
          Bytes RX:3011512 (3.0 MB)  TX bytes:401585916 (401.5 MB)


Luego para evitar usar el comando sudo de manera seguida asociamos el usuario administrador al grupo docker con:

sudo usermod -aG docker $(whoami)

para saber si no necesitamos usar mas el sudo, probamos ejecutar la imagen Hola Mundo con:

docker run hello-world

Lo que nos devolverá algo parecido a esto:

Hello from Docker!
This message shows that your installation appears to be working correctly.


con

docker pull ubuntu

descargamos la imagen (en realidad es una plantilla) de un sistema base en la última versión de Ubuntu. Para ver la imagen basta con ingresar:

 docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc7a11d65b1        2 weeks ago         120MB
hello-world         latest              1815c82652c0        2 months ago        1.84kB

Luego con:

docker run -it ubuntu bash

creamos el conteiner si no existe y entramos por una terminal vt220 de manera interactiva usando bash como shell o interprete. lo que vamos a ver es esto:

root@035244c70483:~#

Siempre ingresamos como root, y el hostname del sistema es el ID del contenedor es decir 035244c70483 para instalar apache2, mysql y phpmyadmin; primero hay que hacer un apt update!! pues como dije es una plantilla y está desprovisto de cosa superfluas. Tampoco tiene nano, ni VIM. Entonces los pasos dentro del container son, en resumidas cuentas:
 
  1. apt update
  2. apt install nano, vim, apache2, mysql-server, etc, etc.
  3. apt clean
  4. service apache2 start
    service mysql start

ahora con exit salimos del container. El cual lo podemos ver con:

docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS                  NAMES
72f37c543cff        hello-world         "/hello"            27 minutes ago      Exited (0) 27 minutes ago                          jolly_goldstine
035244c70483       ubuntu        "bash"              1 minutes ago        Exited(0) hours                   amazing_euler
a160ebf0c908        tensorflow_2017_8   "bash"              24 hours ago        Exited (0) 24 hours ago                            quirky_almeida


con docker ps vemos los conteriner activos.

Ahora bien vamos a crear una plantilla con dicho container, para eso basta con hacer, usando el ID del container:

docker commit 35244c70483 miweb_ubuntu

Se puede verificar su creación con docker images. Ahora vamos a guardar dicha imagen para luego transportala a otro VPS que ya tiene docker corriendo. Para ello la guardamos como:

  1. docker save -o miweb_ubuntu.tar miweb_ubuntu
  2. gzip miweb_ubuntu.tar
  3. scp  miweb_ubuntu.tar.gz pepito@cosita:tmp
Luego en el VPS nuevo hacemos:

  1. gunzip miweb_ubuntu.tar.gz
  2. docker load --input miweb_ubuntu.tar 

de nuevo con docker images verificamos que esté la imagen. Para que arranque de manera interactiva, para ajustar cosas,,,

docker run -ti -p 9080:80 miweb_ubuntu bash

cuando ingresemos los servicios no arrancan automáticamente, ya que no fue creado a partir de un dockerfile! Entonces iniciamos los servicios apache2 y mysql como antes, y salimos NO CON EXIT, sino con CTRL+P+Q. Para que podamos salir y el contenedor no se detenga. Para verificar que está andando basta con hacer:

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
035244c70483        miweb_ubuntu        "bash"              19 hours ago        Up 19 hours         0.0.0.0:9080->80/tcp   amazing_euler


con la opción -p 9080:80 estoy redirigiendo el puerto de salida al 9080, aunque el interno sea el 80. Esto es para evitar el conflicto de puertos con mi servidor apache que corre en el VPS.

Cabe observar que se crea un dispositivo bridge para el contenedor donde serán redirigidas las solicitudes.

veth2bc2871 Link encap:Ethernet  direcciónHW 46:c8:80:bf:fb:ae 
          Dirección inet6: fe80::44c8:80ff:febf:fbae/64 Alcance:Enlace
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:260 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:348 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:0
          Bytes RX:61744 (61.7 KB)  TX bytes:4052635 (4.0 MB)


Con :

docker cp index.html 035244c70483:/var/www/html/index.html

copio el index.html de mi VPS al directorio dentro del contenedor.

Listo para saber que funciona todo, en un navegador fuera del VPS colocamos:

http://pepito:9080

Y debemos ver la página web que hemos creado en el contenedor.

Para volver a ingresar al contendor basta con usar el ID del contendor que corre:

docker attach 035244c70483

con:

docker start ID_contenedor, se lo activa si estaba detenido
docker stop ID_contenedor, se lo suspende si estaba activo.

 Saludos.