EN VIVO Francia 0-4 Inglaterra Descanso entra a la charla →

¿Sirve Docker para migrar mi webAPP antigua de PHP 5?

  • Autor Autor coreio
  • Fecha de inicio Fecha de inicio
C

coreio

Alfa
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola, tengo una webAPP realmente antigua (PHP 5) con cientos de "hacks", configuraciones, librerias, permisos... corriendo actualmente en un servidor que voy a dar de baja.

Tengo otros tantos servers y quiero migrarla a alguno de ellos, la opción "facil" sería virtualizar una maquina, y empezar a instalar y trastear hasta dar con la tecla. Sin embargo esto supone un "overhead" de recursos y espacio para la extrema sencillez de la aplicación.

Me pregunto si puedo utilizar docker para hacer esto mismo, es decir, crear un contenedor virgen y acceder a ese contenedor como si una maquina se tratase para empezar a a instalar, trastear etc.. y una vez funcionando guardar esa "imagen" ?

¿Es posible hacer esto o hay alguna alternativa mejor?
 
Hola, tengo una webAPP realmente antigua (PHP 5) con cientos de "hacks", configuraciones, librerias, permisos... corriendo actualmente en un servidor que voy a dar de baja.

Tengo otros tantos servers y quiero migrarla a alguno de ellos, la opción "facil" sería virtualizar una maquina, y empezar a instalar y trastear hasta dar con la tecla. Sin embargo esto supone un "overhead" de recursos y espacio para la extrema sencillez de la aplicación.

Me pregunto si puedo utilizar docker para hacer esto mismo, es decir, crear un contenedor virgen y acceder a ese contenedor como si una maquina se tratase para empezar a a instalar, trastear etc.. y una vez funcionando guardar esa "imagen" ?

¿Es posible hacer esto o hay alguna alternativa mejor?
Claro que si y es la mejor manera de hacerlo. ya existen imagenes con PHP 5 listas para ser usadas , eso por que los Repositorios de PHP o enlaces que apuntaban a los branches originales de linux, ya estan deprecadas . aunque tambien seria que busques cual se te adapta mejor. si tienes PHP-APACHE, PHP-NGINX. seria que vayas buscando en el HUB de docker

y si ninguno te satisface. tendras que hacer todo de 0. para ello ya existen contenedores casi virgenes 5MB para que les vayas metiendo todo como se debe. eso si ahi tendras que en el contenedor DEscargar el CODIGO FUENTE y Compilar. crearte tus Scripts. y asi quedaria a medida tu contenedor y lo mejor seria q una vez que lo tengas lo SUBAS a algun HUB para futuro. como GITLAB .

recuerda asistirte por IA. pero tambien hacer la busqueda en foros sobre los temas. y un consejo por que cuando inicie en docker el problema con el que casi siempre me encontre es cuando se quieren usar VOLUMENES compartidos. y es un problema por el tema de los Permisos. algunos contenedores, tiene usuarios o grupos de usuarios ya predefinidos. y en el cual te tocara jugar como uninifcarlos.

en mi caso. yo monte por 1 lado yo cree 3 contenedores. 1 para NGINX y 1 para PHP7 y otro para php8 , asi un mismo sitio podia correr tanto con php7 y php8. pero la imagen que use de php8 ya manejaba que el usuario estaba en un grupo con id 1001 y los demas manejaban el id 1000. mi solucion fue al inicio fue darles permisos 0777. pero luego ya lo cambie para que coincidiera al id de grupo a 1000. armando mi docker de 0 con alpine(compilando, creando usuario y grupo de usuarios).

lo arme asi por q tenia proyectos legacy en php 7 y se tenian q migrar al 8. pero sin ponerlos OFFLINE. ya que la parte de pruebas se la delegue a los clientes
 
Se puede, yo lo hice hace tiempo, aunque el objetivo era levantar un proyecto viejo y ponerlo a funcionar para poder comenzarlo a migrar.

Es relativamente sencillo y hasta puedes hacer que sólo sean 2 archivos extra a los del código lo único realmente necesario para levantarlo al final.

No recomendaría tenerlo corriendo online sin actualizarlo por mucho tiempo, siempre existe el peligro de que te pasen un viejo CVE alguno de los muchos bots que están todo el día buscando justamente sistemas con vulnerabilidades conocidas. Igual y me dices que nada ha pasado hasta ahora, pero si hay un riesgo tan obvio, mejor es prevenir.

kj
 
Gracias por las respuestas, totalmente de acuerdo @kj2 , la app está en un directorio "raro" no indexeable y es la única barrera de seguridad

@tudmin una pregunta que para mi es fundamental, ya sea descargando un contenedor casi virgen o algun lamp con php5, ¿Es posible acceder a ese contenedor como si de un servidor nuevo se tratase? Quiero decir, puedo crear un contenedor, correrlo y empezar con sudo apt install php... etc.. como si de un servidor virtualizado se tratara?
 
  • Me gusta
Reacciones: kj2
¿Es posible acceder a ese contenedor como si de un servidor nuevo se tratase? Quiero decir, puedo crear un contenedor, correrlo y empezar con sudo apt install php... etc.. como si de un servidor virtualizado se tratara?
Siempre que los repositorios que uses estén vivos para que puedas descargar (para php5 tienes los de sury), se puede, solo tienes que meterte dentro del contenedor, así:

Insertar CODE, HTML o PHP:
docker exec -it [nombre del contenedor] bash

Si el contenedor es de alpine o alguno que no tenga bash, en su lugar puedes poner "sh".

Por otro lado, lo que @tudmin creo que se refería era a correr PHP, mariadb y nginx en contenedores separados y que la cosas de PHP la instalas dentro del contenedor PHP, que es la manera moderna en la que se hace este tipo de cosas para separarlas unas de otras. Pero de todos modos no es que no se pueda poner todo junto, yo por ej. tengo este que hice en un principio para otras personas, pero acabé usándolo yo mismo:

https://git.kj2.me/kj/nginx-dev

El proceso para hacerlo fue que la primera vez me metí dentro, lo dejé como quería y luego solo agarré el historial y con eso monté el código que terminé dejando en los archivos Dockerfile y docker-compose.yml que son los que lo construyen.

kj
 
Última edición:
Gracias por las respuestas, totalmente de acuerdo @kj2 , la app está en un directorio "raro" no indexeable y es la única barrera de seguridad

@tudmin una pregunta que para mi es fundamental, ya sea descargando un contenedor casi virgen o algun lamp con php5, ¿Es posible acceder a ese contenedor como si de un servidor nuevo se tratase? Quiero decir, puedo crear un contenedor, correrlo y empezar con sudo apt install php... etc.. como si de un servidor virtualizado se tratara?
en resumido si, recuerda los contenedores son "maquinas virtuales"(no es correcto pero para asimilar mejor la idea), donde se ejecuta un sistema operativo, en el cual accedes por BASH con comandos docker. existen distros base como ALPINE que pesa casi 5 mb. en el cual tiene su propia forma de agregar paquetes o repositorios donde tiene ya precompilado PHP8 por ejemplo Node, pero si prefieres usar algo mas robusto hay contendores/distros base con UBUNTU , dependiendo de con cual estes familiarizado , los comandos puden cambiar, usar APT, o usar APK , etc depende del contenedor BASE. solo recuerda cuando se tabaja con proyectos antiguos. los repositorios que dependa de enlaces o dependencias externas podria haber problemas por q a veces ya no se da soporte de almacenamiento, y te tocara compilar desde codigos fuentes.
Usar contenedores que se ajusten a tus necesidades demorarias un poco en encontrarlos, pero te recomendaria hacer uso de un contenedor BASE y empezar a compilar todo. eso por que te da para aprender sobre la marcha.
 
@kj2 @tudmin Gracias!! Creo que lo voy pillando pero me parece que no es lo que busco a no ser que lo esté entendiendo mal. Si para crear la imagen final debo de enumerar los comandos ejecutados, librerias instaladas, etc.. para que al instalarla de nuevo replique dichos pasos, entonces muy seguramente, para dentro de X años si se requiere migrar (o reinstalar) otra vez, no existan ni la mitad de repositorios 🤣 Creo que me voy a plantear hacer una imagen completa virtualizada con todo lo malo que eso conlleva....

Respecto a separar contenedores, creo que lo entiendo. Se crea un contenedor sólo de BD y así por muchas apps / contenedores que tengas, sólo estás corriendo 1 servidor de bd (o http) pero en mi caso, como mysql es tambíen del año catapum y utiliza apache con cientos de directrices y reglas, al final me obligaría a montar servidores exclusivos para esta app que no puedo aprovechar para otras apps...
 
@kj2 @tudmin Gracias!! Creo que lo voy pillando pero me parece que no es lo que busco a no ser que lo esté entendiendo mal. Si para crear la imagen final debo de enumerar los comandos ejecutados, librerias instaladas, etc.. para que al instalarla de nuevo replique dichos pasos, entonces muy seguramente, para dentro de X años si se requiere migrar (o reinstalar) otra vez, no existan ni la mitad de repositorios 🤣 Creo que me voy a plantear hacer una imagen completa virtualizada con todo lo malo que eso conlleva....

Respecto a separar contenedores, creo que lo entiendo. Se crea un contenedor sólo de BD y así por muchas apps / contenedores que tengas, sólo estás corriendo 1 servidor de bd (o http) pero en mi caso, como mysql es tambíen del año catapum y utiliza apache con cientos de directrices y reglas, al final me obligaría a montar servidores exclusivos para esta app que no puedo aprovechar para otras apps...
de eso se trata los contenedores tratan de tener exactamente el BUILD/COMPILADO de ese instante. ojo, una vez que hace todo ese BUILD, docker lo almacena o crea una imagen DE uso , el cual es el usado es como agarrar tu maquina virtual, hacerle un SNAPSHOT y usarlo cada vez que se inicie / reinicie tu server. pero si tu server es formateado y tienes solo el archivo docker, entonces toda tu receta se creara de nuevo desde 0, para tener ese "SNAPSHOT" ojo que la gracia de esto es que lo puedes subir a algun repositorio. gratuito como Gitlab, o en el mismo "docker hub" (solo te permite 1 por cuenta de forma gratuita) . el tema de esto de las Imagenes/snapshot es que si de aqui a 20 años, todos los LINKS de librerias, que usaste originalmente mueren, y ya no se puede replicar esa instalacion en ningun server nuevo, pero cuentas con esa "imagen" entonces no necesitas instalar nada, solo es iniciar donde estaba ,

recuerda que las imagenes solo deben contener los ejecutables no la DATA, como tus sitios php, eso para evitar que cresca exageradamente.


ahora otro punto lo de separar en varios contenedores, el fragmentar los contenedores te da cierta libertad de mejora progresiva. imagina que ya tienes todo sistema con php5 y mysql. pero quiers migrar a php 7.

pues como tienes en un contenedor tu mysql 5, creas otro contenedor solo con php7, pero que apunte a la DATA de tu proyecto actual. y asi puedes ver si algun proyecto no se rompe o no hay cambios significativos que hacer. una vez llegues a ese punto ya empiezas a mover.

ahora con mysql mas o menos es lo mismo, preparar un contendor mysql-8 , y subes la DATA , para ver si se rompe. y si se rompe la copatiblidad puedes probar hacer un UPGRADE, te haces una copia de tu contenedor con mysql5 entrars a esa copia-mysql5, y usas tus archivos de upgrade que suelen brindar los de mysql y listo como resultado la DATA-copia esta lista para mysql8, ya en produccion significaria que detengas todos tus contenedores por unas horas y hagas ese proceso para que tu informacion mas actual no se vea afectada.

en resumen el tema de contenedores es mucho msa llevadero que hacer replicas con vmware o virtualbox. sin contar que el tamaños de las imagenes/snapshot resultantes son cientos de megas en coparacion a snapshot de vmware que son gigas
 
@kj2 @tudmin Gracias!! Creo que lo voy pillando pero me parece que no es lo que busco a no ser que lo esté entendiendo mal. Si para crear la imagen final debo de enumerar los comandos ejecutados, librerias instaladas, etc.. para que al instalarla de nuevo replique dichos pasos, entonces muy seguramente, para dentro de X años si se requiere migrar (o reinstalar) otra vez, no existan ni la mitad de repositorios 🤣 Creo que me voy a plantear hacer una imagen completa virtualizada con todo lo malo que eso conlleva....

Respecto a separar contenedores, creo que lo entiendo. Se crea un contenedor sólo de BD y así por muchas apps / contenedores que tengas, sólo estás corriendo 1 servidor de bd (o http) pero en mi caso, como mysql es tambíen del año catapum y utiliza apache con cientos de directrices y reglas, al final me obligaría a montar servidores exclusivos para esta app que no puedo aprovechar para otras apps...
Bueno, si lo que quieres tener es algo congelado, siempre puedes crear una imagen a partir de ese contenedor y listo... ahora esa imagen bien la puedes subir a un repo tipo dockerhub o uno selfhost (como este) desde el cual hacerle pull o simplemente tenerla guardada como un fichero ".tar" que puedes guardar en cualquier lado y exportarla desde ahí.

Por si te sirve, los comandos serían para hacer el tar:

Insertar CODE, HTML o PHP:
docker export [nombredelcontenedor] imagen-de-mi-contenedor.tar

Y luego para importarlo en otros lados:

Insertar CODE, HTML o PHP:
docker import imagen-de-mi-contenedor.tar  nombre-local-de-mi-imagen:latest

Eso dejaría una imagen local (puedes verla con docker image) que puedes levantarla como contenedor otra vez así (puedes añadirle más argumentos, yo solo pongo los mínimos):

Insertar CODE, HTML o PHP:
docker run nombre-local-de-mi-imagen:latest bash

Y eso sería un equivalente a tener una imagen de máquina virtual, pero con la ventaja de que docker lo puedes correr en cualquier VPS y gasta menos recursos.

El único lío que te debería golpear a corto plazo haciendo esto, es que el archivo ".tar" probablemente pese 1 o 2 GBs y comprimiéndole quizá le bajes el peso a la mitad, mientras que el Dockerfile y el docker-compose pesan unos pocos KB apenas (lo cual es más sencillo de respaldar también).

No es necesario tener el Dockerfile y el docker-compose, sólo es algo bueno a tener en cuenta de cara a cuando toque volver a hacer un contenedor igual.

kj
 
Última edición:
Muchisimas gracias, ahora si todo aclarado!! Retomo la idea docker, deseadme suerte!

Saludos
 
Atrás
Arriba