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

지금까지 읽은 튜토리얼에 따르면 ” 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

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



답변

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일부 명령).


답변

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

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

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


답변

배경

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 % 확실하지 않습니다 . 그렇다면 아래에 의견을 남겨주십시오.


답변

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

-d

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

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

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

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

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

모두 제일 좋다


답변

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

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


답변

이 코드 스 니펫은 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


답변

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

docker run -t -d <image-name>

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

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

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

docker ps