lunes, 30 de septiembre de 2019

Docker en Windows parte 3: comandos básicos y bajando imágenes Tomcat y WildFly

Seguimos con el tutorial básico. Esta vez comandos simples y bajamos una imagen más complicada como es de Tomcat para aplicaciones JAVA.

Ir a parte 2: https://naldog.blogspot.com/2019/09/docker-en-windows-parte-2-instalacion.html
Ir a parte 4: https://naldog.blogspot.com/2019/10/docker-en-windows-parte-4-administrando.html
_______________________

Comandos básicos

Lo último que hicimos fue un hola-mundo.

Ahora escribe:
docker images

y verás todas las imágenes que tienes bajadas.


-Una imagen es la representación de un sistema ya sea PHP solo, Apache con PHP, Java, Fuse, Net Core, MySql solo, PHP con Apache con MySql, etc...
-Una imagen tiene N Pods o contenedores. Cada contenedor es una mini máquina virtual con su CPU, RAM y Disco asignado.
-Puedes crear tus propias Imágenes en base a una ya existente.

Como dato con clear limpias la pantalla de PowerShell.

Bajemos una imagen.
Ve a https://hub.docker.com/_/ubuntu
y verá a la derecha la instrucción para bajar.

Escribe
docker pull ubuntu

Se bajará la imagen. La puedes chequear con docker images.

Ahora creamos un contenedor
docker run -it -d ubuntu

Te dará un hash de contenedor indicando que se creó ok.

ahora escribe
docker ps -a

verás los contenedores como el de recién, corriendo y también el hello-word.

Es graciosa la columna NAMES ya que el mismo Docker le coloca nombres a tus contenedores, por ejemplo:
vigilant_goldberg
jovial_aryabhata
Esto ayuda a que puedas manipularlos ya sea por su ID o por su nombre:

Se puede ejecutar cosas adentro de un contenedor en si al entrar como Root, para esto escribe
docker exec -it <id dado en primera columna de comando anterior> bash

ejemplo:
docker exec -it 92c9b5f15f44 bash

Escribe algo adentro del docker (eres root) como por ejemplo, en Ubuntu un echo:
# echo hola
hola
# exit   para salir

Podemos detener el contenedor con el ID:
docker stop 92c9b5f15f44

Si ejecutas docker ps -a dirá por ejemplo:
   "Exited (0) 5 segundos" -> Terminado hace 5 segundos.

Subiendo una imagen por comando a cuenta personal de Docker Hub

Puedes crear una imagen local para luego subir a tus repositorios privados de Docker Hub:
docker commit 92c9b5f15f44 hernaldo/ubuntu

ahora con docker images se verá un tercer docker

Por linea de comandos puedes hacer:
docker login

dirá logeando con las credenciales actuales (las que pusiste cuando hiciste clic en "Sign in" en el tutorial en paso 2)

docker push hernaldo/ubuntu

Si vas a https://cloud.docker.com/repository/list verás que en tu cuenta hay un repositorio nuevo con el sistema Ubuntu.

En mi caso se ve hernaldo/ubuntu

Quedará en sitio público: https://hub.docker.com/r/hernaldo/ubuntu
Ahora, si tienes money, por 7 usd al mes tienes derecho a 5 repositorios privados...

Más Comandos

Para eliminar un contenedor usa 
docker rm <id de contenedor>

Ejemplo:
docker rm 00b8b9ac7c53

Para eliminar las imágenes locales (no las cloud que subiste a tu cuenta):
docker rmi <id de imagen>

Ejemplo:
docker rmi 2ca708c1c9cc

Nota: No te dejará si contenedores corriendo asociadas a esa imagen.


Comprueba que en verdad se eliminaron con:
docker images

Listar todos los contenedores que están en STOP:
docker container ls -a --filter status=exited --filter status=created

Eliminar todos los contenedores en STOP:
docker container prune


Te preguntará confirmación, coloca Y. Si no quieres conformación usa -f (force)
docker container prune -f

Bajando imagen de Tomcat

Vamos a bajar un servidor Tomcat que es un Application Server para Java EE. Corre en el puerto 8080 y es muy liviano.
Página oficial en Docker Hub: https://hub.docker.com/_/tomcat

La base del comando es
docker run -it -p <puerto publico>:<puerto dentro del docker> imagen

Por lo tanto, es tan simple como escribir:
docker run -it -p 8080:8080 tomcat

Con esto lo bajará de Docker Hub, puede demorar un poco.

Al terminar de bajar, de forma automática quedará corriendo el servicio de Tomcat (dice Server startup in...)

Si vas al navegador viene la magia ya que escribes:

http://localhost:8080/

y verás el servidor Tomcat corriendo. Oh yes.
Puedes tener el servicio en la línea de comandos con Control + C.

Si ves cuando pesó la imagen Tomcat fue de 508 MB.

Si te fijas es mucho más pesado que solo el Tomcat, ya que el Tomcat 9 bajado del sitio oficial
https://tomcat.apache.org/download-90.cgi
pesa 14 MB. Lo que pasa es que la imagen trae todo un Linux adentro y otras cosas que es mejor no saber XD.

Si ejecutas docker ps -a verás que la creó con nombre random:

Para colocar un nombre personalizado usa --name ejemplo:
docker run -it --name ejemplo -p 8080:8080 tomcat

Diferencia entre Run y Start

Si haces control + C cuando esté Tomcat Corriendo lo cerrarás. Luego si haces
docker ps -a

verás que dice Exited es decir cerrado. Si quieres nuevamente iniciarlo NO puedes hacer de nuevo 

docker run -it --name ejemplo -p 8080:8080 tomcat

Te dará el error:
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Conflict. The container name "/ejemplo" is already in use by container "17a2751d13f44e2175bf35483ed8135c055ece0568fb2883b6fcb0d08454ba89". You have to remove (or rename) that container to be able to reuse that name.

No puedes Docker Run ya que ese comando es solo la primera vez, para meterle parámetros.
Ahora que ya existe, solo hay que iniciarlo con docker start.

docker start -i <id de contenedor o nombre>

Ejemplo:

docker start -i ejemplo

Con se iniciará el contenedor y Tomcat estará de nuevo disponible.

Fíjate que en la imagen dice en la columna Port:

0.0.0.0:8080->8080/tcp

Esto es que nosotros lo iniciamos con -p de puerto.
Si no lo inicias así, y lo inicias sin -p, así:

docker run -it --name ejemplo2 tomcat

Verás que se inicia correctamente, si abres una segunda ventana de PowerShell verás usando docker ps -a:

PORTS
8080/tcp

Pero si vas en el navegador a http://localhost:8080 no verás nada, ya que falta el mapeo de ports.


Bajando imagen de Wild Fly
Ahora el turno de otro servidor Java, Wild Fly.
Página oficial en Docker Hub: https://hub.docker.com/r/jboss/wildfly

Escribe:
docker run -it -p 8080:8080 jboss/wildfly

Se ve magnífico en le navegador:
http://localhost:8080/


Fíjate que tenemos dos imágenes, una de Tomcat y otra de Wild Fly.


Y revisas los contenedores son dos, ambos detenidos.

Para volver a correr un Tomcat, debe primero eliminar el contenedor anterior:
docker ps -a

ver nombre (columna NAMES)
docker rm -f <nombre de contenedor>

Ejemplo:
docker rm -f vigilant_goldberg

Luego volver a correr
docker run -it -p 8080:8080 tomcat

Si ejecutas directo el contenedor, dirá un mensaje de error de puerto ya usado:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint exciting_minsky (0b9e8e3935b8c65c7f9749b7d01c3a332de1872ed2c026436198a2d163f8102b): Bind for 0.0.0.0:8080 failed: port is already allocated.

Pero si abres http://localhost:8080/ se verá ok nuevamente.

Comando docker-machine

Al usar Docker on Windows (y no Docker Toolbox) no existe el comando:
docker-machine stop default   para parar la máquina Virtual.
Ni
docker-machine start default   para iniciar la máquina Virtual.

Por si acaso ya que NO usamos máquina Virtual. A esta altura me imagino está claro.
_______________________