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

我正在用docker文件构builddocker Image,基本镜像已经安装了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的服务,因为端口绑定exception而失败。

我想杀了P-ID并启动tomcat服务,但是netstat输出没有给出进程的P-ID。

请build议如何在这个容器上启动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以复制run.sh并为其授予执行权限。 然后更改CMS行以执行run.sh(您可以在其中添加命令来启动sshd)。

 COPY run.sh /root/run.sh RUN chmod +x /root/run.sh CMD ["/root/run.sh"]