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:
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