Clase 4: Docker - Creando contenedores demonios
En esta ocasión usamos la opción -d (detach) del comando run, para que la ejecución del comando en el contenedor se haga en segundo plano.
Ejemplo 1: Creando un contenedor con un servidor web
Tenemos muchas imágenes en el registro público docker hub, por ejemplo podemos crear un servidor web con apache 2.4:
$ docker run -d --name my-apache-app -p 8080:80 httpd:2.4
Vemos que el contenedor se está ejecutando, además con la opción -p mapeamos un puerto del equipo donde tenemos instalado el docker, con un puerto del contenedor: Si accedemos a la ip del ordenador que tiene instalado docker al primer puerto indicado, se redigirá la petición a la ip del contenedor al segundo puerto indicado. Nunca utilizamos directamente la ip del contenedor para acceder a él. Para probarlo accede desde un navegador a la ip del servidor con docker.
Para acceder al log del contenedor podemos ejecutar: docker logs my-apache-app o para visualizarlo en tiempo real la opción logs -f.
Podemos parar el contenedor y borrarlo con las siguientes instrucciones:
$ docker stop my-apache-app`
$ docker rm my-apache-app`
O ejecutando: docker rm -f my-apache-app.
Modificación del contenido servidor por el servidor web
Si consultamos la documentación de la imagen httpd en el registro docker Hub, podemos determinar que le servidor web que se ejecuta en el contenedor guardar sus ficheros (directorio DocumentRoot) en /usr/local/apache2/htdocs/. Vamos a crear un nu nuevo fichero index.html en ese directorio.
Lo podemos hacer de varias formas:
-
Accediendo de forma interactiva al contenedor y haciendo la modificación:
$ docker exec -it my-apache-app bash root@cf3cd01a4993:/usr/local/apache2# cd /usr/local/apache2/htdocs/ root@cf3cd01a4993:/usr/local/apache2/htdocs# echo "<h1>Curso Docker</h1>" > index.html root@cf3cd01a4993:/usr/local/apache2/htdocs# exit -
Ejecutando directamente el comando de creación del fichero
index.htmlen el contenedor:$ docker exec my-apache-app bash -c 'echo "<h1>Curso Docker</h1>" > /usr/local/apache2/htdocs/index.html' -
Copiando un fichero
index.htmldento del contenedor:$ echo "<h1>Curso Docker</h1>" > index.html $ docker cp index.html my-apache-app:/usr/local/apache2/htdocs/
Independientemente de cómo hayamos creado el fichero, podemos volver a acceder al servidor web y comprobar que efectivamente hemos cambiado el contenido del index.html.
Ejemplo 2: Configuración de un contenedor con la imagen mariadb
En ocasiones es obligatorio el inicializar alguna variable de entorno para que el contenedor pueda ser ejecutado. Si miramos la documentación en Docker Hub de la imagen mariadb, observamos que podemos definir algunas variables de entorno para la creación y configuración del contenedor (por ejemplo: MARIADB_DATABASE,MARIADB_USER, MARIADB_PASSWORD,…). Pero hay una que la tenemos que indicar de forma obligatoria, la contraseña del usuario root (MARIADB_ROOT_PASSWORD), por lo tanto:
$ docker run -d --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw mariadb
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c3effd891e3 mariadb "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 3306/tcp some-mariadb
Podemos ver que se ha creado una variable de entorno:
$ docker exec -it some-mariadb env
...
MARIADB_ROOT_PASSWORD=my-secret-pw
...
Y para acceder podemos ejecutar:
$ docker exec -it some-mariadb bash
root@9c3effd891e3:/# mariadb -u root -p"$MARIADB_ROOT_PASSWORD"
...
MariaDB [(none)]>
Otra forma de hacerlo sería:
$ docker exec -it some-mariadb mariadb -u root -p
Enter password:
...
MariaDB [(none)]>
No hemos usado el parámetro -p para mapear los puertos de MariaDB, porque norlmanete no accedemos a las bases de datos desde el exterior.
Ejercicio
- Realiza el ejemplo 1 y el ejemplo 2 que acabamos de ver.
Configuración de contenedores con variables de entorno
Más adelante veremos que al crear un contenedor que necesita alguna configuración específica, lo que vamos a hacer es crear variables de entorno en el contenedor, para que el proceso que inicializa el contenedor pueda realizar dicha configuración.
Para crear una variable de entorno al crear un contenedor usamos el flag -e o --env:
$ docker run -it --name contenedor5 -e USUARIO=prueba ubuntu bash
root@91e81200c633:/# echo $USUARIO
prueba
Ejercicio
- Crea un contenedor con la aplicación Nextcloud, mirando la documentación en docker Hub. Utiliza una variable de entorno para personalizar el nombre de la base de datos sqlite que va a utilizar.