"docker run -d"후에 Docker 컨테이너가 자동으로 중지됩니다


333

지금까지 읽은 튜토리얼에 따르면 " docker run -d"를 사용 하면 이미지에서 컨테이너가 시작되고 컨테이너가 백그라운드에서 실행됩니다. 이것이 어떻게 보이는지, 우리는 이미 컨테이너 ID를 가지고 있음을 알 수 있습니다.

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

그러나 " docker ps"를 실행하면 아무 것도 반환되지 않았습니다.

" docker ps -a"를 시도했는데 컨테이너가 이미 종료 된 것을 볼 수 있습니다.

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

내가 잘못한 게 있습니까? 이 문제를 어떻게 해결할 수 있습니까?


1
"docker run hello-world"<== 완벽하게 작동하지만 "docker run -d hello-world"를 실행하면 여전히 실행중인 컨테이너를 얻을 수 없습니다.
J John

5
비슷한 문제가 있었지만 docker run -it -d <image> /bin/bash대화식으로 bash 셸을 시작하고 셸 프로세스가 활성화되어 컨테이너를 닫지 않습니다.
Rtsne42

답변:


495

CentOS는 dockerfile은 기본 명령이 있습니다 bash.

즉, 백그라운드 ( -d) 에서 실행 하면 셸이 즉시 종료됩니다.

2017 업데이트

고정 표시기의 권한 부여의 최신 버전은 모두 컨테이너를 실행하는 분리 모드 전경 모드 ( -t, -i또는 -it)

이 경우 추가 명령이 필요하지 않으며 이것으로 충분합니다.

docker run -t -d centos

배쉬는 백그라운드에서 기다립니다.
즉 처음에보고 하기 Kalyani - 차우대답 과에 설명 저지 콩대답 .

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

참고 것을 찾는 고산 , 마리노스는 보고 코멘트에 :

docker run -t -d alpine/git프로세스를 유지하지 않습니다.
해야했다 :docker run --entrypoint "/bin/sh" -it alpine/git


원래 답변 (2015)

이 기사 에서 언급했듯이 :

로 실행하는 대신 하나의 명령으로 컨테이너를 실행할 수 있으며 + +를 눌러 컨테이너의 터미널을 분리 할 필요가 없으므로 docker run -i -t image your-command사용하는 -d것이 좋습니다 .CtrlPQ

그러나 -d옵션에 문제가 있습니다. 명령이 포 그라운드에서 실행되고 있지 않으면 컨테이너가 즉시 중지됩니다 .
Docker를 사용하려면 포 그라운드에서 계속 실행해야합니다. 그렇지 않으면 응용 프로그램이 컨테이너를 중지했다가 종료한다고 생각합니다.

문제는 일부 응용 프로그램이 포 그라운드에서 실행되지 않는다는 것입니다. 어떻게 더 쉽게 만들 수 있습니까?

이 상황에서 tail -f /dev/null명령에 추가 할 수 있습니다 .
이렇게하면 기본 명령이 백그라운드에서 실행 되더라도 테일이 전경에서 계속 실행되므로 컨테이너가 중지되지 않습니다.

그래서 이것은 작동합니다 :

docker run -d centos tail -f /dev/null

A docker ps는 centos 컨테이너가 여전히 실행 중임을 나타냅니다.

여기에서 첨부하거나 분리 할 수 있습니다 (또는 docker exec일부 명령).


죄송합니다, 한 가지 더 질문입니다. 시작시 스크립트를 실행해야합니다 ./etc/rc.d/rc.local이 더 이상 작동하지 않는 것 같습니다 (내 마음가짐은 여전히 ​​OS와 같은 도커를 처리합니다). 도커 파일이 더 나은 옵션이라고 가정합니다 케이스?
J John

5
@GuruprasadGV 예상됩니다. docker attach를 사용하는 대신을 사용하십시오 docker exec -it <yourContainer> bash.
VonC

3
진입 점 파일 끝에 tail 명령을 추가 한 경우에도 작동합니다.
yara

2
sshd를 마지막 (장기 실행) 명령으로 사용했습니다. 그런 다음 VM에서와 마찬가지로 컨테이너에서도 ssh를 수행 할 수 있습니다 (.ssh / authorized_keys 등을 설정 한 후). 또한 ansible을 사용하여 컨테이너를 구성 할 수도 있습니다.
앤드류 페이트

1
내 명령과 위에 나열된 이전 수정 프로그램을 실행하기 위해이 작업을 수행했습니다. docker run image_name / bin / bash -c "my / command && tail -f / dev / null"
Geordie

58

이 답변 에 따르면 -t플래그를 추가 하면 백그라운드에서 실행될 때 컨테이너가 종료되지 않습니다. 그런 다음을 사용 docker exec -i -t <image> /bin/bash하여 쉘 프롬프트로 들어갈 수 있습니다 .

docker run -t -d <image> <command>

도움말에 "의사 TTY 할당"이라는 말이 있지만 -t 옵션 이 잘 설명되어 있지 않은 것 같습니다 .


10
좋은. 추기보다 해키 보인다tail -f /dev/null
Scarysize

감사! 슬림 기회에 이것은 누군가를 도울 수 있지만, Emacs Eshell에서는 잘 작동하지 않습니다.
Peter Becich

2
docker run -t -d --name mysql -p 3306:3306 mysql-작동하지 않습니다 (우분투 14.04.5) : STATUS = 종료 (1) 4 초 전
Putnik

원하는 경우가 아니라면 여기서 <명령>이 필요하지 않다는 것을 알았습니다. 이상하게도 -t를 -i (대화식)로 대체합니다. 이 문서는 -t를 사용하는 것을 언급하고 -i를 결합하면 쉘처럼 작동합니다.
저지 빈

43

배경

Docker 컨테이너는 프로세스를 실행하는 프로세스 ( "명령"또는 "입력 지점")를 실행합니다. 명령이 계속 실행되는 한 컨테이너는 계속 실행됩니다.

귀하의 경우 명령 ( /bin/bash기본적으로 on centos:latest)은 즉시 종료됩니다 (bash는 터미널에 연결되어 있지 않고 실행할 것이 없을 때 bash처럼).

일반적으로 컨테이너를 데몬 모드 ( -d)로 실행하면 컨테이너는 일종의 데몬 프로세스 (예 :)를 실행 httpd합니다. 이 경우 httpd 데몬이 실행되는 동안 컨테이너는 활성 상태로 유지됩니다.

컨테이너 내부에서 데몬 프로세스를 실행하지 않고 컨테이너를 활성 상태로 유지하려고합니다. 이것은 다소 이상합니다 (컨테이너가와 상호 작용할 때까지 유용한 작업을 수행하지 않기 때문에 docker exec), 그러나 이와 같은 작업을 수행하는 것이 합리적 일 수 있습니다.

(컨테이너 내부에 bash 프롬프트가 표시 되었습니까? 쉽습니다. docker run -it centos:latest)

해결책

컨테이너를 데몬 모드에서 무기한으로 유지하는 간단한 방법 sleep infinity은 컨테이너의 명령으로 실행하는 것입니다. 이것은 데몬 모드에서 TTY 할당과 같은 이상한 일을하지 않습니다. sleep기본 명령으로 사용하는 것과 같은 이상한 일에 의존하지만 .

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

대체 솔루션

cjsimon이 나타내는 것처럼이 -t옵션은 "의사 -tty "를 할당합니다. 이것은 bash가 대화 형 TTY에 연결되어 있다고 생각하기 때문에 bash가 계속 무한대로 실행되도록합니다 (통과하지 않으면 특정 TTY와 상호 작용할 방법이 없지만 -i). 어쨌든,이 트릭도 수행해야합니다.

$ docker run -t -d centos:latest

-t다른 이상한 상호 작용을 일으킬 지 100 % 확실하지 않습니다 . 그렇다면 아래에 의견을 남겨주십시오.


BusyBox의 수면이 허용하지 않으므로 알파인에서는 작동하지 않습니다 infinity.
John Kugelman

이 날, 감사 아마존 - 리눅스 이미지 문제를 해결하는 데 도움
유입

18

안녕하세요.이 문제는 컨테이너에 실행중인 응용 프로그램이 없으면 도커 컨테이너가 종료되기 때문입니다.

-d 

옵션은 단지 데몬 모드에서 컨테이너를 실행하는 것입니다.

따라서 컨테이너를 지속적으로 실행하는 트릭은 응용 프로그램을 계속 실행하는 docker의 셸 파일을 가리 킵니다 .start.sh 파일을 사용해 볼 수 있습니다

Eg: docker run -d centos sh /yourlocation/start.sh

이 start.sh는 끝없는 응용 프로그램을 가리켜 야합니다.

응용 프로그램을 실행하지 않으려는 경우 monit도커 컨테이너를 계속 실행하는 설치 할 수 있습니다 . 컨테이너를 계속 작동시키는 데이 두 가지 사례가 효과가 있는지 알려주십시오.

모두 제일 좋다


12

다음 중 하나를 사용하여 원하는 것을 달성 할 수 있습니다.

docker run -t -d <image-name>

또는

docker run -i -d <image-name>

또는

docker run -it -d <image-name>

다른 답변 (예 : tail -f / dev / null)에서 제안한 명령 매개 변수는 완전히 선택 사항이므로 컨테이너가 백그라운드에서 계속 실행되도록 할 필요는 없습니다.

또한 Docker 설명서에는 -i 및 -t 옵션을 결합하면 셸처럼 작동한다고 제안합니다.

보다:

https://docs.docker.com/engine/reference/run/#foreground


9

이 코드 스 니펫은 ENTRYPOINTdocker 파일에서 실행 됩니다.

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

빌드 된 도커 이미지를 다음과 같이 실행하십시오.

docker run -td <image name>

컨테이너 쉘에 로그인하십시오.

docker exec -it <container id> /bin/bash

이것이 당신이 이것에 대한 무한 루프를 만든 솔루션입니까? : D
Muhammad SaLman

8

다음과 같이 명령을 실행하십시오.

docker run -t -d <image-name>

포트를 지정하려면 다음과 같이 명령하십시오.

docker run -t -d -p <port-no> <image-name>

다음 명령을 사용하여 실행중인 컨테이너를 확인하십시오.

docker ps

가장 많이 사용되는 답변은 명령 (예 : tail -f / dev / null)이 필요하다는 것을 나타내므로 실제로이 답변이 가장 좋습니다. 명령은 완전히 선택적입니다. 여기서 핵심은 -t를 사용하는 것입니다. 또한 -i 대신 -i가 작동한다는 것을 알았거나 둘 다 결합하여 사용할 수 있습니다 (문서에서 쉘로 실행 됨).
저지 빈

-t -dvs 를 사용하면 어떤 이점이 -i -d있습니까? 둘 다 컨테이너를 계속 실행합니다.
wisbucky

5

Docker를 사용하려면 포 그라운드에서 계속 실행해야합니다. 그렇지 않으면 응용 프로그램이 컨테이너를 중지했다가 종료한다고 생각합니다.

도커 입력 스크립트가 다음과 같은 백그라운드 프로세스 인 경우 :

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

'&'는 나중에 트리거 된 다른 포 그라운드 프로세스가없는 경우 컨테이너를 중지하고 종료합니다. 따라서 솔루션은 '&'를 제거하거나 다음 과 같이 다른 전경 CMD를 실행합니다 .

tail -f server.log

touch로그 파일을 찾을 수없는 경우 먼저 해당 파일을 원할 수 있습니다.
Samuel Elh

일반적으로 로그 파일 I tail은 현재 서버 로그 또는 리디렉션 출력이며 프로세스가 시작된 후에 이미 있어야합니다.
Peiming Hu 2019

4

내부 작업이 완료되면 Docker 컨테이너가 종료되므로 작업이 없거나 이미 완료된 경우에도 활성 상태로 유지하려면 할 수 있습니다 docker run -di image. 당신이 후에 docker container ls당신은 그것을 실행 볼 수 있습니다.


3

어쩌면 그것은 저 뿐이지 만 CentOS 7.3.1611과 Docker 1.12.6에 있지만 @VonC & @Christopher Simon이 게시 한 답변을 조합하여 안정적으로 작동시켜야했습니다. CMD를 성공적으로 실행 한 후에 컨테이너가 종료되는 것을 막기 전에 내가 한 일은 없습니다. oracle-xe-11Gr2 및 sshd를 시작하고 있습니다.

도커 파일

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

그런 다음 -d -t 및 -i를 추가하여 실행하십시오.

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

마침내 벽에 머리를 부딪친 몇 시간 후

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

어떤 이유로 든 tail -f가 제거되거나 -t -d -i 옵션이 생략되면 CMD를 실행 한 후 위의 내용이 종료됩니다.



1

나는 bash로 다른 터미널을 열면 같은 문제가 발생했습니다.

컨테이너 만들기 :

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

컨테이너 시작 :

docker start 52bbc9b30557

컨테이너를 계속 실행하려면 bash를 시작하십시오.

docker exec -it 52bbc9b30557 bash

필요한 프로세스를 시작하십시오.

docker exec -it 52bbc9b30557 /path_to_cool_your_app

1

Dockerfile의 끝에 CMD를 사용하는 경우 끝에 코드를 추가하면됩니다. 도 커가 우분투 또는 bash를 사용할 수있는 모든 OS에 구축 된 경우에만 작동합니다.

&& /bin/bash

Dockerfile의 끝은 다음과 같습니다.

...

CMD ls && ... && /bin/bash

따라서 docker 이미지를 실행 한 후 자동으로 실행되는 것이 있고 작업이 완료되면 bash 터미널이 docker 내부에서 활성화됩니다. 따라서 쉘 명령을 입력 할 수 있습니다.


1

대화식 모드로 도커를 실행하면 문제가 해결 될 수 있습니다.

대화식 모드 유무에 관계없이 이미지를 실행하는 예는 다음과 같습니다.

chaitra @ RSK-IND-BLR-L06 : ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

chaitra @ RSK-IND-BLR-L06 : ~ / dockers $ sudo 도커 ps

컨테이너 ID 이미지 명령 생성 상태 포트 이름

chaitra @ RSK-IND-BLR-L06 : ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra @ RSK-IND-BLR-L06 : ~ / dockers $ sudo 도커 ps

컨테이너 ID 이미지 명령 생성 상태 포트 이름 c3d6a9529fd7 test_again1.0 "bash"2 초 전 Up 1 초 awesome_haibt


0

컨테이너에서 작업하려면 컨테이너를 살아있는 상태로 유지하기 위해 포 그라운드에서 실행해야합니다.


-1

인수 순서 문제

Jersey Beans 답변 (3 가지 예 모두)이 저에게 효과적이었습니다. 약간의 시행 착오 끝에 나는 논쟁의 순서가 중요하다는 것을 깨달았습니다.

컨테이너를 백그라운드에서 계속 실행합니다. docker run -t -d <image-name>

컨테이너를 포 그라운드에서 계속 실행합니다. docker run <image-name> -t -d

Powershell 배경에서 오는 것은 분명하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.