Proyecto Docker Php-Apache
Proyecto Docker Php-Apache
1. - En una primera fase crearemos la aplicación y la probaremos sobre una plataforma php-
apache.
2. - Crearemos una imagen/Dockerfile que contenga Apache, PHP, la librería Smarty , otras
librerias y el código fuente de la aplicación.
3. - Crearemos una imagen/Dockerfile con mysql y un volumen asignado con los datos.
1 CREAR APLICACION
1 CREAMOS LA APLICACION EN UN ENTORNO DE DESARROLLO
CON PHP 7, APACHE 2, MYSQL, Y LIBRERIAS: SMARTY,
PHPEXCEL, PHP_MAILER, ETC
Sobre Apache con PHP7, Mysql y las librerias: Smarty, Phpmailer, Phpexcel, Dompdf, y redist
para pasarelas de pago.
La probamos sobre una base de datos Mysql en un Cloud (AWS) datos de prueba.
FROM josedefrias/php-apache:v0.5
Creamos las carpetas que usaremos para guardar todos los ficheros necesarios.
Es muy importante crear estas carpetas con el usuario con el que vayamos a
trabajar o nos dará problemas de permisos posteriormente.
$ mkdir php-apache
$ mkdir php-apache/src
Iniciamos el contenedor
Ya tenemos el contenedor iniciado pero la aplicación aun no funcionará ya que debemos copiar
las librerias al directorio var/www/ dentro del contenedor y configurar los ficheros php.ini,
httpd.conf y sendmail.ini:
usr/local/etc/php/php.ini
usr/local/etc/httpd.conf
Tenre siempre estos ficheros de otro proyecto para ver los cmabios que hay que hacer en cdaa
fichero.
Permisos de escritura en la carpeta de trabajo: Al crear el directorio dentro del proyecto donde
vamos a ir modificando nuestro código en nuestra máquina (por ejemplo www o apdd) hay que
entrar y dar permisos de lectura y escritura a esa carpeta y todas las que tenga dentro y tdos los
ficheros.
Esto es para que cuando se cree la imagen con el Dockerfile, en el nuevo contenedor, el usuario
pueda escribir en ellos. Muy importante por ejemplo para smarty.
Dependiendo de la imagen de php: Si es la oficial vienen con unos comandos de docker para
instalarlas.
Docker-php-ext-install mysqli
Inicialmente usamos una conexión a una base de datos en la nube de AWS pero crearemos una
una imagen de mysql con la base de datos y un volumen con los datos para completar los
procesos de aprendizaje de docker. De momento y para que funcione le damos la conexión a una
base de tados que tengamos disponible en la nube.
Es importante que nos aseguramos que podemos iniciar la imagen sin -it y con -d para que
dockercompose pueda iniciarla posteriormente. docker run d--name phpmysql -p 80:80
josedefrias/php-apache:v0.1 (por esto tuve que cambiar de un proyecto con xampp a empezar
de nuevo con php y apache).
En php7 los cientes de MySQL no tan modernos, más antiguos que la versión de MySQL no
pueden usar el plugin de autenticación activo. Como es algo bastante común, MySQL ya deja la
siguiente información comentada en el archivo de configuración /etc/mysql/my.cnf:
[mysqld]
[...]
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-
variables.html#sysvar_default_authentication_plugin
#default-authentication-plugin=mysql_native_password
Tras reiniciar MySQL, el funcionamiento debería ser correcto. Eso sí, tened en cuenta que si los
usuarios los habéis creado antes de cambiar el plugin de autenticación, probablemente
siga fallando, simplemente volved a regenerar los usuarios.
con docker volumen inspect vemos la información del volumen. Ubicacion, etc
Despues iniciamos el contenedor especificando este volumen
Ahora es el momento de crear nuestro usuario too (con los privilegios necesarios) y de crear la
base de datos too e importarla de alguna copia nuestra.
Yo hice esto en accediendo con heidi desde otro equipo, ya que no encontre heidi para linux e
importe la base de datos limpia para toogethere. Esto es muy importante para que no hay
aarchivos grandes o nos fallara la subida al repositorio de GitHub.
Una vez tengamos la base de datos configurada y con los usuarios, privilegios y el esquema que
necesitemos creamos la imagen definitiva.
1 - No es necesario indicar el puerto en el servicio mysql ya que docker creara una red con ambos
servicios conectados. Yo lo hago para poder acceder con heidi desde fuera a la base de datos.
En produccion nunca se debe hacer ya que estaremos exponiendo la base de datos. Una ventaja
de docker compose es que aisla del exterior los servicios que queramos incrementando así la
seguridad con redes propias que crea en el momento de inicar los contenedores.
O bien podemos indicar una ruta para que docker cree un nuevo volumen con los datos dentro de
nuestra carpeta de proyecto d ella siguiente manera:
- ./mysql_too:/var/lib/mysql
Si hacemos esto último habra que volver a cargar los usuarios y esquemas y además dar
permisos de escritura a la nueva carpeta que se creará y todo su contenido.
Despues ejecutamos la orden docker-compose up -d crear e iniciar los contenedores con las
dependencias entre ellos dentro de la red, los puertos indicados
docker-compose up -d
Se iniciaran ambos contenedores y nuesttra aplicación debe funcionar. Podemos acceder desde
el navegador con : localhost/
Si da error de permisos los solucionamos dando permisos sobre la carpeta o fichero que
nos indicque el mensaje de error en la consola
sudo chown -R oracle /home/oracle/php-apache/mysql_too/
Todos los contenedores en una red Bridge estan conectados entre si y se pueden conectar a
internet a traves de la red Bridge.
docker network ls
Veremos que hay creada una red de docker llamada bridge creda por docker al iniciar el ic.
...
No hemos puesto –network bridge porque es el tipo de red que se asigna automáticamente al
contenedor si no especificamos ninguna. Para oytra serís –network none o --network hots, ...
Una interfaz loopback (que es una red None para aplicaciones internas)
Una interfaz de red privada privada (para conectarse al exterior con rango de ip) Con la ip
172.17.0.2
Los contenedores dentro de la red estarán dentro del mismo rango de ip’s.
Yo usare el proyecto php-web (reduciendo el peso de la base de datos para que github no de
error al no permitir ficheros de más de 100 MB)
Tansolo dejare que Circle CL revise el código y poco más. (ya habrá tiempo de complicarse…)
En negrita los pasos en los que entra docker, resto es el proceso normal de integración
continua.
5 - El proceso de compilación puede variar de una aplicación a otra pero normalmemte implicaria.
- Compilar la aplicación.
8 – Despues el servidor de IC podrá extraer la imagen del registro para ejecutarla en otro
host ya sea para desarrollo , puesta en marcha o producción.
GitHub – Agregar key SSH a cuenta GitHub
Seguir las instrucciones del video 5.35 (al final) del curso Udemy de Docker ó estas:
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
- En jobs: Cada archivo de configuración debe tener un trabajo de compilación. Este es el trabajo
que es ejecutado automáticamente pot circleci
- Despues la imagenes docker primario. Aqui definimos el entorno de circle ci que es donde
se ejecutarán nuestros pasos. En circleci todas las pruebas se ejecutarán en contenedores
y este contenedor creará nuestros contenedores dockerapp y redis y tambien ejecutará
nuestras pruebas. Así es que básicamente son contenedores dentro de un contendor
primario.
- En resumen, lo que queremos es una imagen que instale dockery tenga git. Estos r
equisitos se satisfacen usando la imagen: docker:17.05.0-ce-git Usando esta
imagen te aseguras de usar el úlrtimo cliente docker y con git preinstalado.
2 Creamos una nueva rama desde nuestro repositorio local llamandola test-ci
touch dummy.txt
git commit -m "add dummy file to test circle build" (puede darnos un error al haber
puesto el correo real cuando generamos la key de SSH. Si ocurre con ejecutar los dos
comandos que nos da el error se arregla).
Necesitamos configurar la rama superior para la rama local que acabamos de crear
git push --set-upstream origin test-ci (Una vez configurada nos bastará con git push)
niciando sesion en github se iniciará sesion automáticamente en circleci (Menos la primera vez
que te preguntará un par de cosas)
Nos preocuparemos de esto más adelante, ya que el proyecto es grande y hay que revisar bien .
Ahora creamos una nueva rama llamada circle_ci_publish (usando la opcion -b con git)
Descomentamos las lineas del config.yml de .circleci para que despues de la compilación se
publique la imagen en docker file pero solo si el resultado es exitoso.
Ahora hacemos un commit en nuestros cambios y enviarlos al repositorio central de Github
git push
Y entonces ejecutamos:
Y si todo va bien ademas se habrá añadido una nueva imagen a Docker Hub.
Con dos etiquetas.
DOCKER MACHINE
La forma más sencilla de configurar nueva máquinas virtuales y ejecutar contendores en ellas es
mediante DOCKER MACHINE. Docker Machine puede configurar nuevas másuinas virtuales
instalar las herramientas docker en ellas y vincular el cliente Docker con las máquinas docker
remotas .
Para acceder a la cuenta de digital Ocean a traves de su api y gestionar una máquina
virtual necesitamos generar un token de acceso personal.
Los token de acceso personal funcionan como los token ordinarios de acceso que pueden
usarse para permitirnos acceder a los recursos de nuestra cuenta en DO sin necesidad de
alguna contraseña.
Ahora veras el token. Haz click en el portapapeles y copialo a un archivo y guardalo en otro lugar
donde puedas acceder a el ya que lo usaremos posteriormente.
docker-machine ls
Con docker machine podemos crear una máquina virtual en Digital Ocen con el comando docker
create con los siguiente argumentos:
Y empezará el proceso de solicitud a digital ocean, instalación del docker engine en la máquina
virtual y generar los certificados:
Cuando termine nos sugiere un comando para configurar las variables de entorno que deben
configurar nuestro cliente docker y este logreconectarse a la máquina virtual que acabamos de
provisionar.
Lo ejecutamos:
Con esto establecemos la maquina como activa para trabajar con ella. Ejecutamos docker-
machine ls y veremos que es la que tiene el asterisco.
ahora con.
docker info
docker-compose -f prod.yml up -d
docker-compose up -d
docker info
https://picodotdev.github.io/blog-bitix/2015/07/usar-docker-con-docker-machine-en-linux-windows-
o-mac/
Para usar Docker Machine debemos descargar el binario, darle permisos de ejecución y si
queremos añadirlo a la variable PATH del sistema.
1 $ docker-machine --version
Con los siguientes comandos podemos crear una máquina virtual para los contenedores docker,
listar las máquinas virtuales creadas, hacer SSH a ella, ejecutar un contenedor en ella, parala y
eliminar una máquina virtual además de obtener la IP asignada.
1 $ docker-machine create --driver virtualbox dev
2 $ docker-machine ls
Estableciendo las variables de entorno de la máquina virtual podemos usar el comando docker
como si de la máquina anfitrión fuera, todos los comandos de docker que lancemos se ejecutarán
contra el contenedor docker de la máquina virtual. En el siguiente caso se ejecuta el contenedor
de busybox en la máquina virtual dev. Con --unset podemos reiniciar la configuración a la
máquina anfitrión.
1 $ docker-machine env dev
2 $ eval "$(docker-machine env dev)"
3 $ docker run busybox echo "hello world"
4 $ eval "$(docker-machine env --unset)"
Podemos detener, volver a iniciar, hacer SSH y eliminar la máquina virtual con:
1 $ docker-machine start dev
2 $ docker-machine ssh dev
3 $ docker-machine stop dev
4 $ docker-machine rm dev
El directorio por defecto donde se guardarán los archivos de las máquinas virtuales es
~/.docker/machine, si queremos cambiarlo podemos utilizar el parámetro --storage-path en cada
uno de los comandos anteriores de la siguiente forma, el orden de los parámetros es importante:
1 $ docker-machine --storage-path "/run/media/picodotdev/BMOVE_ROJO/docker/machine" create --
Cuando quieres ejecutar un servicio sera el administrador Swarm quien decida donde ejecutar
ese servicio.
Solo tienes que direccionar tu cliente docker al administrador Swarm en lugar de hacerlo en todos
y cada uno de los dockers daemonds.
Básicamente Docker Swarm puede agrupar varios Host en un cluster y distribuir contenedores
docker en estos Hosts.
CONFIGURACION
Debemos permitir que nuestro cleinte se conecte a la máquina virtual swarm-manager con:
Luego copiamos el comando que se nos muestra en pantalla para configurar nuestro shell. Con
esto activamos la máquina.
NODO DE TRABAJO
docker-machine create --driver digitalocean --digitalocean-access-token
69492d79cf0cba6d3f96804ecb0895130f86da0f2a6a49ac08be782f7a4db9ac php-apache-node
Antes de ejecutar el comando asegurémonos que el entorno apunta ala máquina virtual del
administrador swarm
Da un error porque dice que esta máquina tiene múltiples interfaces de red y docker swarm no
sabe cual usar para comunicarse.
[oracle@ServidorLinux7 dockerapp]$ docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses
on interface eth0 (64.225.56.180 and 10.17.0.6) - specify one with –advertise-addr
Por defecto, la máquina virtual viene con dos ip’s una es una ip pública y la otra una ip privada.
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[oracle@ServidorLinux7 dockerapp]$
Es importante tener en cuenta que este comando debe ejecutarse en el nodo de trabajo.
Asi que aquí en lugar de cambiar la máquina virtual activa podemos ejecutar. Docker-machine ssh
en la máquinavirtual del nodo de trabajo
root@swarm-node:~#
Cuando creamos el nodo administrador nos informo de la orden que debemos dar para crear
nodos de trabajo.
La definición del servicio incluye que imagenes de docker se ejecutarán, la asignacion de puertos
y la dependencia entre servicios. Tambien surge una nueva llave: deploy que se puede usar para
equilibrar la carga y optimizar el rendimiento de cada servicio.
Un ejemplo:
el valor de réplicas a 3, lo que significa que docker ejecutará 3 instancias (contenedores) de la
imagen nginx como un servicio llamado nginx.
Con restar_policy podemos pedirle a docker que reinicie los contenedore sen caso de que uno de
ellos falle.
Todo esto esta hecho para garantizar excalabilidad de ompilación y alta disponibilidad para los
servicios desplegados en un cluster Swarm.
DOCKER STACK
ahora docker swarm a creado una red overlay por nosotros llamada apache-php_stack_default
para la comunicación cruzada de nodos. Esta red se crea automaticamente cuando ejecutamos
docker stack deploy.
Deberiamos poder acceder a phpapche desde cualquiera de los host debido a la funcionalidad de
equilibrio de carga de swarm. Usemos la ip de cualquiera de las dos máquinas del swarm en el
navegador
165.227.109.90:80
159.89.47.60
REALIZAR CAMBIOS
Tan simple como volver a ejecutar el docker stack deploy con los cambios realizados n el .yml
Agregar un contenedor, por ejemplo, a mysql: Con poner deploy en el servicio y replica: 2 bastará
Agregar un contenedor por ejemplo a mysql: Con poner deploy en el servicio y replica: 2 bastará
Todos los contenedores Docker se envían con una herramienta de monitoreo preconfigurada que
es Docker Stat.
El siguiente comando proporciona estadísticas de la utilización de la CPU docker, el uso de
memoria, el límite de memoria y las métricas de E / S de la red.
$ docker stats [CONTENEDOR …]
El primer comando "docker" es un comando base para la CLI de docker. Puede especificar uno o
más contenedores separados por espacios para obtener información sobre cada uno.
El siguiente comando mostrará detalles de todos los contenedores que se ejecutan en Linux
daemon
$ docker stats