2016-12-13 1 views
0

아래의 도커 파일로 도커 이미지를 만들고 있는데 기본 이미지에 이미 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  - 

이 포트가 어떻게 사용되고 있는지 잘 모르겠습니다.

컨테이너 안에도 톰캣의 서비스를 다시 시작할 수 없습니다. 포트 바인딩 예외로 인해 실패합니다.

나는 P-ID를 죽이고 Tomcat 서비스를 시작하지만 netstat 출력이 프로세스의 P-ID를 제공하지 않는다고 생각했습니다. 친절

나는이 컨테이너에 바람둥이 서비스를 시작할 수있는 방법을 제안는

+0

1) netstat은 Dockerfile과 마찬가지로 컨테이너에 의해 노출 된 포트이기 때문에 22, 80 및 443을 나열합니다. 2) 원본 이미지가 Tomcat 자체를 시작하는 진입 점이 아닌지 확인하십시오. 3) 로그 파일을보고 이미 사용중인 포트를 이해하십시오. 4) 컨테이너가 sshd 및 서비스를 실행하는 것이 모범 사례가 아닙니다. Docker 허브 https://hub.docker.com/_/tomcat/ – gile

+0

에서 Dockerfiles로 CMD [ "catalina.sh", "run"]로 Tomcat을 시작하는 것이 더 낫습니다. 1) 포트는 Docker 파일에 의해 노출됩니다. netstat 출력은 docker 호스트가 아닌 컨테이너입니다. 2) 원본 이미지에 Tomcat이 설치되어 있지만 시작되지 않습니다. 3) 포트 80 및 443이 사용 중입니다. –

+0

오류에 대한 로그 메시지를 공유합니다. – gile

답변

1

그래서 문제는 Dockerfile 그냥 마지막 CMD 당신을에 실행하는 것이, 그런데 (서비스로 바람둥이 시작 조심 CMD 시도 때문이다 예를 들어 두 개의 CMD 행이 있음). 어쨌든,이 내용을 가진 run.sh 스크립트를

#!/bin/bash 
/etc/init.d/tomcat7 start 
exec tail -f /var/lib/tomcat7/logs/catalina.out 

를 추가하려고 run.sh를 복사하고 그것을 실행 권한을 부여하기 위해 Dockerfile을 변경합니다. 그런 다음 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/우분투/책임감 #/etc/init.d/tomcat7 stop * Tomcat 서블릿 엔진 tomcat7 중지 ... 완료. root @ 92dab1962c1e :/home/우분투/책임자 # /etc/init.d/tomcat7 시작 * Tomcat 서블릿 엔진 시작 tomcat7 ... 실패! Tomcat 서비스가 중지되면 conatiner가 포트를 해제하지 않는 것처럼 보입니다. –

+0

"done"이라고 쓰지만 실제로 "/etc/init.d/tomcat7 stop"은 tomcat을 중지하지 않습니다. 컨테이너를 정지 한 후에 컨테이너 안에 "ps -ef"를 실행 해보십시오. 아직 바람둥이가 계속있을 것이므로 포트는 이미 사용 중입니다. 나는 "/etc/init.d/tomcat7 stop"이 바람둥이 pid를 갖는 "/var/run/tomcat7.pid"를 찾지 않기 때문에 작동하지 않는다고 생각한다. 어쨌든, 제 생각에는 컨테이너를 가상 머신으로 사용해서는 안되므로 컨테이너 내부의 서비스를 다시 시작하는 대신 새 컨테이너를 실행해야합니다. – gile

관련 문제