Estoy experimentando con Docker y soy muy nuevo en esto. Me llamó la atención un punto durante mucho tiempo y no estoy encontrando un camino y, por lo tanto, se me ocurrió esta pregunta aquí ...
Declaración del problema: Estoy tratando de crear una imagen desde un archivo docker que contiene la instalación de Apache y Lynx. Una vez hecho esto, intento acceder a Tomcat en 8080 del contenedor, que a su vez se reenvía al 8082 del host. Pero cuando ejecuto la imagen, nunca hago que Tomcat se inicie en el contenedor.
El archivo Docker
FROM ubuntu:16.10 #Install Lynx Run apt-get update Run apt-get install -y lynx #Install Curl Run apt-get install -y curl #Install tools: jdk Run apt-get update Run apt-get install -y openjdk-8-jdk wget #Install apache tomcat Run groupadd tomcat Run useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat Run cd /tmp Run curl -O http://apache.mirrors.ionfish.org/tomcat/tomcat- 8/v8.5.12/bin/apache-tomcat-8.5.12.tar.gz Run mkdir /opt/tomcat Run tar xzvf apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1 Run cd /opt/tomcat Run chgrp -R tomcat /opt/tomcat Run chmod -R g+r /opt/tomcat/conf Run chmod g+x /opt/tomcat/conf Run chown -R tomcat /opt/tomcat/webapps /opt/tomcat/work /opt/tomcat/temp opt/tomcat/logs Run cd /opt/tomcat/bin Expose 8080 CMD /opt/tomcat/bin/catalina.sh run && tail -f /opt/tomcat/logs/catalina.outCuando se creó la imagen, intenté ejecutar el contenedor con los dos métodos siguientes
docker run -d -p 8082:8080 imageid tail -f /dev/null Mientras usa lo anterior, el contenedor se ejecuta pero Tomcat no se inicia dentro del contenedor y, por lo tanto, no se puede acceder a él desde localhost: 8082. Además, no veo nada si realizo registros acoplables longcontainerid
docker run -d -p 8082:8080 imageid /path/to/catalina.sh start tail -f /dev/null Veo que Tomcat se inició cuando docker logs longconatainrid Mientras uso lo anterior, el contenedor se inicia y se detiene inmediatamente y no ejecutándose como puedo ver desde docker ps y, por lo tanto, nuevamente no accesible desde localhost: 8082.
¿Alguien puede decirme dónde me estoy equivocando?
PD: busqué mucho en Internet pero no pude acertar. Puede ser que haya algún concepto que no estoy entendiendo claramente.
Mirando la documentación del comando de docker run , el documento establece que cualquier comando pasado a la run anulará el CMD original en su Dockerfile :
Como operador (la persona que ejecuta un contenedor desde la imagen), puede anular esa instrucción CMD simplemente especificando un nuevo
COMMAND
1/ Luego cuando corres:
docker run -d -p 8082:8080 imageid tail -f /dev/null El contenedor se ejecuta con COMMAND tail -f /dev/null , el comando original que inicia tomcat se anula .
Para resolver su problema, intente ejecutar:
docker run -d -p 8082:8080 imageidy
docker log -f containerIdPara ver si Tomcat se inició correctamente.
2/ No debe usar el argumento de start con catalina.sh . Eche un vistazo a este Dokerfile oficial de tomcat , el equipo usa:
CMD ["catalina.sh", "run"] para iniciar tomcat (cuando usa start , la ventana acoplable finaliza el contenedor al final del script de shell y tomcat se iniciará pero no mantendrá un proceso en ejecución).
3/ Finalmente, ¿por qué no usa la imagen oficial de Tomcat para construir su contenedor? Podrías simplemente usar el:
FROM tomcat:latestdirectiva al comienzo de su Dockerfile, y agregue los elementos necesarios (archivos nuevos, guerra de aplicaciones web, configuraciones) a la imagen de la ventana acoplable.