当tomcat服务停止时,Docker不会释放容器内的端口

当tomcat服务停止时,Docker不会释放容器内的端口,docker,tomcat7,Docker,Tomcat7,我正在用下面的docker文件构建docker映像,基本映像已经安装了tomcat #RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:temp1234' | chpasswd RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/ss

我正在用下面的docker文件构建docker映像,基本映像已经安装了tomcat

#RUN apt-get update && apt-get install -y openssh-server
 RUN mkdir /var/run/sshd
 RUN echo 'root:temp1234' | chpasswd
 RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

 # SSH login fix. Otherwise user is kicked off after login
 RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

 ENV NOTVISIBLE "in users profile"
 RUN echo "export VISIBLE=now" >> /etc/profile

 EXPOSE 22
 EXPOSE 80
 EXPOSE 443

 CMD ["/usr/sbin/sshd", "-D"]
 CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
但是,当我尝试运行这个容器时,它失败了,出现以下错误

    ubuntu@ip-172-16-27-205:~/docker-work$ sudo docker run -p 2222:22 -p 443:443 -p 80:80 d7d7f93692d7

 * Starting Tomcat servlet engine tomcat7
  ...fail!
在检查容器内部时,发现其端口已在使用中

root@xxxxbd879:/var/log/tomcat7# sudo netstat -plntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State           PID/Program name
 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1/sshd
 tcp6       0      0 :::1024                 :::*                    LISTEN      -
 tcp6       0      0 :::44546                :::*                    LISTEN      -
 tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      -
 tcp6       0      0 :::47342                :::*                    LISTEN      -
 tcp6       0      0 :::80                   :::*                    LISTEN      -
 tcp6       0      0 :::22                   :::*                    LISTEN       1/sshd
 tcp6       0      0 :::443                  :::*                    LISTEN      -
我不确定这些港口是如何被占用的

在容器内部,我也无法重新启动tomcat的服务 它因端口绑定异常而失败

我本想终止p-ID并启动tomcat服务,但是netstat输出没有给出进程的p-ID


请建议如何在此容器上启动tomcat服务,因此问题是由于CMD试图将tomcat作为服务启动(顺便说一句,请注意Dockerfile只运行最后一个CMD,在您的示例中,您有两行CMD)。 无论如何,请尝试添加包含此内容的脚本run.sh

#!/bin/bash
/etc/init.d/tomcat7 start
exec tail -f /var/lib/tomcat7/logs/catalina.out
并将Dockerfile更改为copy run.sh,并授予其执行权限。然后更改CMS行以执行run.sh(在其中您也可以添加启动sshd的命令)


1) netstat列出了22、80和443,因为它们是容器公开的端口,就像Dockerfile一样。2) 检查您的原始图像是否没有起始于Tomcat本身的入口点。3) 查看日志文件以了解已在使用的端口。4) 让容器运行sshd和服务不是最佳实践。我更愿意通过CMD[“catalina.sh”,“run”]作为Docker hub 1中的Docker文件启动Tomcat。)是的,端口由Docker文件公开,netstat输出是容器而不是Docker主机的。2.)原始映像已安装tomcat,但未启动它。3.)端口80和443正在使用共享有关错误的日志消息。2016年12月13日下午4:37:24 org.apache.coyote.AbstractProtocol初始化信息:初始化ProtocolHandler[“http-nio-443”]2016年12月13日下午4:37:25 org.apache.coyote.AbstractProtocol初始化严重:未能初始化与ProtocolHandler[“http-nio-443”]java.net.BindException:地址已在sun.nio.ch.net.bind0(本机方法)中使用,位于sun.nio.ch.net.bind(net.java:463)和端口80上的类似位置。您能否确认有关容器的网络设置<代码>docker inspect-f'{.NetworkSettings.Networks}'$container_id可能足够了,但是复制/粘贴一个未格式化的inspect的NewworkSettings部分会有所帮助。但是,这可以启动tomcat。如果我进入容器内,停止服务并再次启动,则会出现相同的问题。root@92dab1962c1e:/home/ubuntu/ansible#/etc/init.d/tomcat7 stop*停止Tomcat servlet引擎tomcat7…完成。root@92dab1962c1e:/home/ubuntu/ansible#/etc/init.d/tomcat7 start*启动Tomcat servlet引擎tomcat7…失败!看起来一旦tomcat服务停止,conatiner就不会释放端口我猜“/etc/init.d/tomcat7 stop”不会停止tomcat,尽管它写了“完成”。在停止容器后,尝试在容器内运行“ps-ef”,我很确定tomcat仍在运行,因此端口已经被使用。我认为“/etc/init.d/tomcat7 stop”不起作用,因为它没有发现“/var/run/tomcat7.pid”具有tomcat pid。无论如何,在我看来,您不应该将容器用作虚拟机,所以您应该运行一个新的容器,而不是在容器中重新启动服务。
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh
CMD ["/root/run.sh"]