Creando imágenes con Docker Container

El presente instructivo tiene como finalidad crear a través de Dockerfile una imágen «personalizada» de docker, con el servicio Apache2 y PHP7, para luego «subirla» a una cuenta en Docker Hub.

Además con dicha imagén se creará un contenedor donde se ejecutará un código de ejemplo, el cual estará almacenado en una «carpeta compartida» (bind mounts), entre el servidor y el contenedor

Requisitos:

  • Se debe contar con suficiente privilegios para la configuración de aplicativos
  • Se debe tener docker instalado. Docker Primeros Pasos
  • Tener una cuenta creada en Docker Hub

Configuraciones Relacionados:

Plataforma:

  • Equipos de arquitectura 64 bits
  • Sistema operativo ‘GNU/Linux’ Debian versión 8.0 (actualmente estable)
  • Sistema operativo ‘GNU/Linux’ Debian versión 9.0 (actualmente estable)

Crear Imagen

Existen básicamente dos formas de crear una imágen:

  • 1.- Utilizando el comando de construcción de Docker Dockerfile (recomendado)
  • 2.- Utilizando el comando de Docker commit

Para la creación de imágenes «personalizadas» es recomendeble utilizar Dockerfile, ya que utiliza un mecanismo más flexible, potente, transparente y repetible

CREANDO IMAGEN
Las imagenes creadas en los siguientes ejemplo será una imagen docker a partir de debian 8 y contedrá la instalación de apache2, el modulo de soporte de apache para php5, php5 y el módulo de conexión de postgreSQL para php5. Al final estará expuesto el puerto 80 con el servicio apache instalado

1.- CREANDO IMAGEN CON DOCKER FILE

1. Crear directorio de trabajo

root@server:/# mkdir -p /opt/apache2

2. Crear archivo Dockerfile

root@server:/opt/apache2# vim /opt/apache2/Dockerfile

Nota: Se utiliza vim para editar el archivo, pero puede usar cualquier editor de textos

3. Agregar el siguiente contenido:

# Version: 1
FROM debian:8
MAINTAINER Juan Trucupei "rodriguezmjuan@gmail.com"
RUN apt-get update && apt-get install -y apache2 libapache2-mod-php5 php5 php5-pgsql php5-curl php5-cli php5-gd php5-json php5-mcrypt php5-pgsql php5-soap php5-xml php5-xmlrpc php5-zip net-tools vim
RUN apt-get clean
WORKDIR /var/www/html/
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_DOCUMENTROOT /var/www/html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Donde:
FROM -> Imagen Base
MAINTAINER -> datos del mantenedor
RUN -> comando que se desea ejecutar
EXPOSE -> puerto a escuchar cuando los contenedores se ejecuten
WORKDIR -> directorio de trabajo
ENV -> definir o declarar variables de entorno
ENTRYPOINT -> le permite la configuración de un contenedor, que se iniciará como un ejecutable

Nota: Las instrucciones (FROM, MAINTAINER, RUN, …) pueden ser escritos en mayusculas o minisculas, sin embargo, es recomendable escribirlas en mayúsculas para distinguirlos más fácilmente de los argumentos

4. Crear imagen:

root@server:/opt/apache2# docker build -t="juantrucupei/apache2:v1" .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:8
 ---> ddf73f48a05d
Step 2 : MAINTAINER Juan Trucupei "rodriguezmjuan@gmail.com"
 ---> Using cache
 ---> e1083b2434b4
Step 3 : RUN apt-get update && apt-get install -y apache2 php5 php5-mysql
 ---> Running in 94c287be9194
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Ign http://httpredir.debian.org jessie InRelease
Get:2 http://httpredir.debian.org jessie-updates InRelease [142 kB]
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [391 kB]
........
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
Setting up xml-core (0.13+nmu2) ...
Processing triggers for libc-bin (2.19-18+deb8u6) ...
Processing triggers for systemd (215-17+deb8u5) ...
Processing triggers for libapache2-mod-php5 (5.6.26+dfsg-0+deb8u1) ...
Processing triggers for sgml-base (1.26+nmu4) ...
 ---> f4847ae03638
Removing intermediate container 94c287be9194
Step 4 : EXPOSE 80
 ---> Running in 76a94e19b003
 ---> 384c9c0ad1f9
Removing intermediate container 76a94e19b003
Successfully built 384c9c0ad1f9

5. Verificar la creación de la imágen:

root@server:/# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
juantrucupei/apache2   v1                  384c9c0ad1f9        3 minutes ago       222.9 MB
ubuntu                 latest              c73a085dc378        10 days ago         127.1 MB
debian                 8                   ddf73f48a05d        2 weeks ago         123 MB

6. Creando contenedor a partir de la imagen creada:

root@server:/# docker create --name serverweb1 -h serverweb1 -p 192.168.1.100:80:80 -it juantrucupei/apache2:v1
2768142c9cb5a11c314baa94079ccd05bbe61dbe79f5b34c9d021f2b9b26ce12

7. Arrancar contenedor:

root@server:/# docker start serverweb1

serverweb1

8. Verificar la ejecución del contenedor:

root@server:# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
4b2adb05c270        juantrucupei/apache2:v1     "/usr/sbin/apache2..."   41 minutes ago      Up 39 minutes       192.168.1.100:80->80/tcp   serverweb1

9. Verificar el acceso al servicio:

root@server:# curl http://192.168.1.100:80

10. Tener acceso al contenedor:

root@server:# docker exec -it serverweb1 bash

SUBIR LA IMAGEN A DOCKER HUB

Para subir la imágen a Docker Hub, se hace necesario crear una cuenta en Docker Hub, en nuestro caso se ya tenemos la de «juanctrucupei»

1. Logearse en el portal desde el equipo:

root@server:/# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: juantrucupei
Password: 
Login Succeeded

2.- Revisar las credenciales creadas por Docker Hub para la autenticación:

root@server:/# cat ~/.docker/config.json
{
	"auths": {
		"https://index.docker.io/v1/": {
			"auth": "anVhbnRydWN1cGVpOkozc3VjcjEydDQ="
		}
	}

3.- Crear tag proyecto local

root@server:# docker tag apache2:v1 juantrucupei/apache2:v1

4. Subir la imagen creada al repositorio Hub Docker

root@server:# docker push juantrucupei/apache2:v1
The push refers to a repository [docker.io/juantrucupei/apache2]
13103c363e13: Pushing [=========================================>         ] 113.4 MB/138.2 MB
f215f043863e: Mounted from juantrucupei/apache 
0c291dc95357: Mounted from juantrucupei/apache 
a9ee34f9e4e2: Mounted from juantrucupei/apache 
e15f8eeda399: Mounted from juantrucupei/apache 
040ba7b9591c: Mounted from juantrucupei/apache 
1: digest: sha256:6a01e3cb8989444110da5c497da320b15bdd44a60fba33d1221359aeca005d27 size: 1569

5. Verificando en el repositorio de Hub docker:

docker_juan_trucupei_1

Nota: Ya en éste punto la imágen creada puede ser utilizada por cualquier persona que tenga acceso a la internet.

6. Salir de la sesión Docker Hub

root@server:/# docker logout
Remove login credentials for https://index.docker.io/v1/

Enlaces:

understanding-docker
Taller Docker – Juanda
James Turnbull – TheDocker Book Containerization is the new virtualization
Dockerfile reference
Best practices for writing Dockerfiles
Docker
Docker: comandos básicos y como crear una imagen personalizada usando Dockerfile
Dockerfile reference

Deja un comentario