2016-12-13 29 views
0

我正在構建一個docker圖片,下面的docker文件中,基本圖片已經安裝了tomcat。當tomcat服務停止時,Docker不會釋放容器內的端口

#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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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 

然而,當我嘗試運行此容器失敗下面的錯誤

[email protected]:~/docker-work$ sudo docker run -p 2222:22 -p 443:443 -p 80:80 d7d7f93692d7 

* Starting Tomcat servlet engine tomcat7 
    ...fail! 

上已使用的容器內的檢查中發現的端口。

[email protected]:/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服務

+0

1)netstat列出了22,80和443,因爲它們是容器公開的端口,就像Dockerfile一樣。 2)檢查你的原始圖像沒有啓動Tomcat本身的入口點。 3)查看日誌文件以瞭解哪些端口已被使用。 4)讓容器運行sshd和服務不是最佳實踐。我更喜歡通過CMD [「catalina.sh」,「run」]啓動Tomcat作爲Docker集線器中的Dockerfiles https://hub.docker.com/_/tomcat/ – gile

+0

1.)是的,端口由Docker文件公開, netstat輸出是容器而不是docker主機。 2.)原始圖像已安裝tomcat,但不啓動它。 3.)端口80和443正在使用 –

+0

共享有關錯誤的日誌消息。 – gile

回答

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"] 
+0

然而,這確實能夠啓動tomcat。如果我進入容器內停止服務,並再次啓動它同樣的問題。 –

+0

root @ 92dab1962c1e:/ home/ubuntu/ansible#/ etc/init。d/tomcat7停止 *停止Tomcat servlet引擎tomcat7 ...完成。 root @ 92dab1962c1e:/ home/ubuntu/ansible#/etc/init.d/tomcat7 start *啓動Tomcat servlet引擎tomcat7 ...失敗! 看起來像concatiner一旦tomcat服務停止不釋放端口 –

+0

我的猜測是,真正的「/etc/init.d/tomcat7 stop」不會阻止tomcat,儘管它寫入「完成」。嘗試在容器停止運行後在容器中運行「ps -ef」,我確信你的tomcat仍在運行,所以端口已經被使用了。我認爲「/etc/init.d/tomcat7 stop」不起作用,因爲它找不到具有tomcat pid的「/var/run/tomcat7.pid」。無論如何,在我看來,你不應該使用容器作爲虛擬機,所以你應該運行一個新的容器,而不是重新啓動容器內的服務。 – gile