Docker

Tarea 1: Ejecutando un servicio en un contenedor Docker

Elige una imagen docker como base para crear un contenedor interactivo. Accede a él y realiza la instalación de un servicio nginx.
Crea una nueva imagen a partir del contenedor anterior.
A partir de la nueva imagen crea un contenedor y comprueba que el servidor web esté funcionando.
Suponiendo que has instalado docker en tu entorno de desarrollo/prueba, realiza un despliegue del contenedor a un entorno de producción (otra máquina con docker instalado). Para ello guarda la imagen generada en docker hub y bájala en el entorno de producción, para crear un nuevo contenedor. Este ejercicio lo podeís hacer entre compañeros.
A continaución queremos cambiar la página web que sirve el servidor web, describe los pasos que deberíamos realizar para realizarlo. A coninuación realiza el cambio.

Entrega una breve documentación de los pasos que has dado para realizar el ejercicio. Entrega una captura de pantalla donde se vea el acceso al servidor web. (2 puntos).

1. Elige una imagen docker como base para crear un contenedor interactivo. Accede a él y realiza la instalación de un servicio ngninx.

debian@happpy:~$ sudo docker run -i -t --name intro ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
1be7f2b886e8: Pull complete 
6fbc4a21b806: Pull complete 
c71a6f8e1378: Pull complete 
4be3072e5a37: Pull complete 
06c6d2f59700: Pull complete 
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
Status: Downloaded newer image for ubuntu:latest
root@8cb4cb2f7945:/# apt update
root@8cb4cb2f7945:/# apt install nginx

 

2. Crea una nueva imagen a partir del contenedor anterior.

root@happy:/home/debian# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cb4cb2f7945 ubuntu "/bin/bash" 16 minutes ago Exited (0) 2 minutes ago
root@happy:/home/debian# docker commit -m nginx -a "Maria" 8cb4cb2f7945 marromang/nginx
sha256:b376c6666c7ebe38149755f585cb3d65f67d1e33c08726101413d4e0c6c78c0d
root@happy:/home/debian# docker push marromang/nginx
The push refers to a repository [docker.io/marromang/nginx]
9fe382325364: Pushed 
8600ee70176b: Mounted from library/ubuntu 
2bbb3cec611d: Mounted from library/ubuntu 
d2bb1fc88136: Mounted from library/ubuntu 
a6a01ad8b53f: Mounted from library/ubuntu 
833649a3e04c: Mounted from library/ubuntu 
latest: digest: sha256:6027f84dc221864b13f2e6e34026121257b9030e50659e51a26037ee48bd70f7 size: 1569

1.png

3. A partir de la nueva imagen crea un contenedor y comprueba que el servidor web esté funcionando.

debian@happy:~$ sudo docker run -i -t --name prueba marromang/nginx /bin/bash
root@9eb9636ba4a9:/# service nginx status
 * nginx is running

4. Suponiendo que has instalado docker en tu entorno de desarrollo/prueba, realiza un despliegue del contenedor a un entorno de producción (otra máquina con docker instalado). Para ello guarda la imagen generada en docker hub y bájala en el entorno de producción, para crear un nuevo contenedor. Este ejercicio lo podeís hacer entre compañeros.

debian@bob:~$ sudo docker run -i -t --name prueba2 -p 80:80 marromang/nginx /bin/bash
Unable to find image 'marromang/nginx:latest' locally
latest: Pulling from marromang/nginx
8f7c85c2269a: Pull complete 
9e72e494a6dd: Pull complete 
3009ec50c887: Pull complete 
9d5ffccbec91: Pull complete 
e872a2642ce1: Pull complete 
0697a2e2f3c6: Pull complete 
Digest: sha256:6027f84dc221864b13f2e6e34026121257b9030e50659e51a26037ee48bd70f7
Status: Downloaded newer image for marromang/nginx:latest
root@a2b7a1a2b196:/# service nginx restart
 * Restarting nginx nginx [ OK ] 
root@a2b7a1a2b196:/# service nginx status 
 * nginx is running
root@a2b7a1a2b196:/#

5. A continuación queremos cambiar la página web que sirve el servidor web, describe los pasos que deberíamos realizar para realizarlo. A continuación realiza el cambio.

debian@bob:~$ nano index.php

Indice maria romero
debian@bob:~$ sudo docker run -i -t --name prueba2 -p 8080:80 -v ~/:/var/www/html marromang/nginx

1.png

 

Repite el ejercicio con un servidor mysql (no es necesario hacer el último punto). Demuestra que puedes acceder al servidor mysql. (2 puntos)

 

Tarea 2: Creación de una imagen docker con Dockerfile

Realiza un Dockerfile que nos permita crear una imagen desde la que se puedan crear contenedores que sirvan una página web en un servidor web nginx. La página web que se sirve debe ser una plantilla html5.

 

Entrega el fichero Dockerfile.
Documenta los pasos que has dado para crear un contenedor que sirva la página web.
¿Qué pasos tienes que dar para modificar el contenido dela página? Documenta brevemente los pasos que has dado.
(2 puntos)

Para este apartado he creado un directorio llamado nginx para trabajar

debian@bob:~$ mkdir nginx
debian@bob:~$ cd nginx/

El Dockerfile quedaría:

FROM debian
MAINTAINER Maria Romero Angulo "m.romeroangulo@gmail.com"

COPY css/ /var/www/html/css
COPY index.html /var/www/html/index.html
COPY init.sh /init.sh

RUN apt-get update && apt-get install -y nginx && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN chmod 700 /init.sh

EXPOSE 80

CMD ["/init.sh"]

He descargado una plantilla y la estructura de directorios sería:

debian@bob:~/nginx$ ls 
css Dockerfile index.html init.sh

El init.sh contiene:

#!/bin/bash

echo "server { \
 listen 80 default_server; \
 listen [::]:80 default_server; \
 root /var/www/html; \
 }" > /etc/nginx/sites-available/default
 
/usr/sbin/nginx -g "daemon off;"

Para probar que funciona:

debian@bob:~/nginx$ sudo docker build -t marromang/nginx:1.14 .
debian@bob:~/nginx$ sudo docker run -t -p 8080:80 --name nginx marromang/nginx:1.14

1.png

Los pasos para modificarlo:

Destruir el contenedor:

debian@bob:~/nginx$ sudo docker stop nginx

debian@bob:~/nginx$ sudo docker rm nginx

Crear una nueva versión de la imagen:

debian@bob:~/nginx$ sudo docker build -t marromang/nginx:1.15 .

Lanzar el contenedor con la nueva imagen:

debian@bob:~/nginx$ sudo docker run -t -p 8080:80 --name nginx marromang/nginx:1.16

2.png

 

Tarea 3: Configuración de contenedores por medio de variables de entorno

Queremos configurar el servidor nginx por medio del uso de variables de entorno, para ello:

Crea en el fichero Dockerfile las variables de entorno siguiente:
DOCUMENTROOT: Indica el directorio raiz del servidor, por defecto será /var/www/html.
SERVER_NAME: Indica el nombre del servidor, (directiva server_name), por defect es _.
Tendrás que crear un script run.sh que será el encargado de configurar nginx antes de ejectura el proceso, y será el proceso que ejecuta el contenedor.
Recuerda que los ficheros tendrán que ser copiados al directorio donde se indica en la variable de entorno DOCUMENTROOT.

Crea un contenedor sin modificar ninguna variable de entorno.
A continuación crea otro contenedor pero modificando las dos variables de entorno.
(3 puntos)

El Dockerfile queda:

debian@bob:~/nginx$ cat Dockerfile 
FROM debian
MAINTAINER Maria Romero Angulo "m.romeroangulo@gmail.com"

ARG DOCUMENTROOT=/var/www/html
ARG SERVER_NAME=_

ENV DOCUMENTROOT=$DOCUMENTROOT
ENV SERVER_NAME=$SERVER_NAME

COPY css/ $DOCUMENTROOT/css
COPY index.html $DOCUMENTROOT/index.html
COPY init.sh /init.sh

RUN apt-get update && apt-get install -y nginx && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN chmod 700 /init.sh

EXPOSE 80

CMD ["/init.sh"]

El init.sh:

#!/bin/bash

echo "server { \
 listen 80 default_server; \
 listen [::]:80 default_server; \
 root $DOCUMENTROOT; \
 server_name $SERVER_NAME; \
 }" > /etc/nginx/sites-available/default

/usr/sbin/nginx -g "daemon off;"

Para probar, hay que hacer un build y lanzar el contenedor con la nueva versión:

debian@bob:~/nginx$ sudo docker build -t marromang/nginx:1.16 .

debian@bob:~/nginx$ sudo docker run -t -p 8080:80 --name nginx marromang/nginx:1.16

2.png

Dockerfile modificado:

FROM debian
MAINTAINER Maria Romero Angulo "m.romeroangulo@gmail.com"

ARG DOCUMENTROOT=/srv/
ARG SERVER_NAME=_

ENV DOCUMENTROOT=$DOCUMENTROOT
ENV SERVER_NAME=$SERVER_NAME

COPY css/ $DOCUMENTROOT/css
COPY index.html $DOCUMENTROOT/index.html
COPY init.sh /init.sh

RUN apt-get update && apt-get install -y nginx && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN chmod 700 /init.sh

EXPOSE 80

CMD ["/init.sh"]

Prueba:

debian@bob:~/nginx$ sudo docker build -t marromang/nginx:1.17 .
debian@bob:~/nginx$ sudo docker run -t -p 8080:80 --name nginx marromang/nginx:1.17

3

Tarea 4: Creación automática de una imagen docker en Docker Hub

Realiza los siguientes pasos:

Crea un repositorio en GitHub, y sube desde una máuina donde no tengas docker instalado el contexto (Dockerfile y ficheros necesarios) del ejercicio anterior.
Crea desde Docker Hub un «Automated build» y da permisos a Docker Hub para que acceda a tu respositorio GitHub.
Comprueba que se ha creado la nueva imagen.
Descarga la nueva imagen en tu servidor Docker y crea un nuevo contenedor.

Documenta los pasos que has dado para realizar la tarea.
¿Qué pasos tienes que dar para modificar el contenido de la página? Documenta brevemente los pasos que has dado. Y muestra la nueva página con los cambios que has introducido.
(3 puntos)

Copiamos los datos al equipo desde el que se va a subir a GitHub

debian@bob:~$ scp -r nginx/ maria@172.22.8.70:/home/maria

maria@holmes:~$ ls
ansible Descargas Downloads examples.desktop go Música nginx Programas Vídeos
cont1.log Documentos Escritorio firefox Imágenes network.conf Plantillas Público

Copiamos los datos al directorio que se va asubir

maria@holmes:/media/maria/sherlock/Documentos/github/docker$ cp -r /home/maria/nginx/* .
maria@holmes:/media/maria/sherlock/Documentos/github/docker$ ls
css Dockerfile index.html init.sh LICENSE portal README.md

Se sube a GItHub

maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git add *

maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git commit -m 'add nginx data'

maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git push

Para crear un Automated-Build, nos vamos a Create > Create Automated Build y veremos esto:

5

Seleccionamos el repositorio que contiene la imagen (docker)6

Creamos el repositorio:7

Lo siguiente es descargar la imagen, levantar un contenedor y comprobar que funciona correctamente.

debian@bob:~$ sudo docker pull marromang/docker

Using default tag: latest
latest: Pulling from marromang/docker
723254a2c089: Already exists 
3e6d30b49942: Pull complete 
83b661444c4c: Pull complete 
6743b7772ebe: Pull complete 
0c4cd39ec51b: Pull complete 
0ec7387f5318: Pull complete 
Digest: sha256:724aa1659b8c6e08f743bc2ee44319cdc0c421ee9fb3674d5eaa050e285fc30c
Status: Downloaded newer image for marromang/docker:latest

debian@bob:~$ sudo docker run -t -p 8080:80 --name docker marromang/docker

8.png

Para modificar, en el equipo en el que tenemos el repositorio de gitHub y no tenemos docker instalado, modificamos el fichero (index.html), se sube a GitHub, se vuelve a descargar la imagen en el servidor docker y se levanta un nuevo contenedor.

Subida a GitHub

maria@holmes:/media/maria/sherlock/Documentos/github/docker$ nano index.html 
maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git add *
maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git commit -m 'change index.html'
[master 25eefe9] change index.html
 1 file changed, 1 insertion(+), 1 deletion(-)
maria@holmes:/media/maria/sherlock/Documentos/github/docker$ git push

Descarga en servidor docker

Para que se actualice el cambio en docker hub, podemos forzarlo dando a trigger

9

Para actualizar la imgaen , simplemente hay que hacer un pull de nuevo

debian@bob:~$ sudo docker pull marromang/docker
Using default tag: latest
latest: Pulling from marromang/docker
723254a2c089: Already exists 
ed9533c2f7a5: Pull complete 
149a42ae0d1a: Pull complete 
f9fc4c77f77f: Pull complete 
ea0d6c8931e6: Pull complete 
0070bc3abd51: Pull complete 
Digest: sha256:f06f93c4fe6b6df477aa619dc8daa072139d36253ce64ad91fce647e1c144cef
Status: Downloaded newer image for marromang/docker:latest

Crear el contenedor

debian@bob:~$ sudo docker run -t -p 8080:80 --name docker marromang/docker

Comprobar

10.png

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *