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

时间:2016-12-13 08:11:28

标签: docker tomcat7

我正在使用以下docker文件构建一个docker 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的服务 它因端口绑定异常而失败。

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

请建议如何在此容器上启动tomcat服务

1 个答案:

答案 0 :(得分:1)

所以问题是由于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"]
相关问题