Apache Tomcat 8未在docker容器中启动

Apache Tomcat 8未在docker容器中启动,apache,ubuntu,tomcat,docker,dockerfile,Apache,Ubuntu,Tomcat,Docker,Dockerfile,我正在用Docker做实验,对它很陌生。很长一段时间以来,我一直被一个问题深深打动,没有办法解决,因此我在这里提出了这个问题 问题陈述: 我试图从包含Apache和lynx安装的docker文件创建一个映像。一旦完成,我将尝试访问容器8080上的tomcat,该容器将被转发到主机的8082。但是在运行映像时,我从未在容器中启动过tomcat Docker文件 FROM ubuntu:16.10 #Install Lynx Run apt-get update Run apt-get instal

我正在用Docker做实验,对它很陌生。很长一段时间以来,我一直被一个问题深深打动,没有办法解决,因此我在这里提出了这个问题

问题陈述: 我试图从包含Apache和lynx安装的docker文件创建一个映像。一旦完成,我将尝试访问容器8080上的tomcat,该容器将被转发到主机的8082。但是在运行映像时,我从未在容器中启动过tomcat

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.out
构建映像时,我尝试通过以下两种方法运行容器

  • docker run-d-p8082:8080 imageid tail-f/dev/null 在使用上述命令时,容器正在运行,但tomcat未在容器内启动,因此无法从localhost:8082访问。此外,如果执行docker logs longcontainerid,我也看不到任何内容

  • docker run-d-p8082:8080 imageid/path/to/catalina.sh start tail-f/dev/null 当我做docker日志LongConataInId时,我看到tomcat启动了 在使用上述方法时,容器会立即启动和停止,并且没有运行,正如我从docker ps看到的那样,因此无法从localhost:8082访问

  • 谁能告诉我哪里出了问题

    另外,我在网上搜索了很多东西,但都没有找到正确的答案。可能有一些概念我没有弄清楚。

    查看,文档声明传递给
    运行的任何命令都将覆盖
    Dockerfile
    中的原始CMD:

    作为操作员(从图像中运行容器的人员),您只需指定一个新的
    命令

    1/然后当您运行时:

    docker run -d -p 8082:8080 imageid tail -f /dev/null
    
    容器运行时使用
    命令
    tail-f/dev/null
    ,启动tomcat的原始命令被覆盖

    要解决问题,请尝试运行:

    docker run -d -p 8082:8080 imageid
    

    查看tomcat是否正确启动

    2/您不应将
    start
    参数与
    catalina.sh
    一起使用。看看这个,团队使用:

    CMD ["catalina.sh", "run"]
    
    要启动tomcat(当您使用
    start
    时,docker在shell脚本的末尾结束容器,tomcat将启动,但维护一个正在运行的进程)

    3/最后,为什么不使用tomcat官方映像来构建容器?您可以使用以下命令:

    FROM tomcat:latest
    

    指令,并将所需元素(新文件、webapps war、设置)添加到docker映像。

    为什么不使用来自的引用Tomcat?顺便说一句(这不是你的问题),你应该在你的Dockerfile中对你的跑步进行分组,见多谢François Maturel的详细回复。1.我错过了这个概念,它解决了我的问题。2.我知道第二点,但在使用命令语句运行时忽略了它。3.我本可以使用Tomcat的官方镜像,但当时我正在尝试使用Tomcat安装lynx。因此,我可以理解,在dockerfile的帮助下可以安装多个应用程序,尽管这可能不是最佳做法。因此,我需要更多地研究多个DockerFile安装应用程序和准备我的环境。再次感谢:)@Arindam,不客气。如果你不想在docker周围玩,也不想在tomcat周围添加更多的软件/调整,你仍然可以使用官方图片,添加你自己的东西。有时,从stratch创建容器图像以真正理解过程也是很好的;)@Françoisstremel@Arindam,当我们使用
    start
    时,您能提供关于第2点的更多见解吗。Tomcat将启动但不维护正在运行的进程。这是什么意思?我们的容器会死吗?@JoshiYogesh当
    catalina.sh start
    过程结束时,您的容器确实会停止运行。您将无法建立任何tcp/udp连接。使用
    run
    时,容器内的
    catalina.sh
    进程将一直有效,直到您告诉docker容器停止。您将能够建立tcp/udp连接。@François,谢谢,现在明白了。
    FROM tomcat:latest