Docker-컨테이너가 실행되고 있지 않습니다.


88

나는 완전히 도커의 초보자입니다. 다음과 같이 종료 된 컨테이너를 시작하려고했습니다.

  1. 을 사용하여 사용 가능한 모든 컨테이너를 나열했습니다 docker ps -a. 다음과 같이 나열되었습니다.

    docker 모든 이미지 나열

  2. 종료 단계에있는 컨테이너를 시작하고 해당 이미지의 터미널로 들어가기 위해 다음 명령을 입력했습니다.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. 다음 오류가 발생합니다.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

하지만 docker start 79b3fa70b51d. 모든 것이 정상적으로 작동하면 정상적인 출력으로 컨테이너 ID를 던집니다. 이 오류의 원인이 무엇인지 잘 모르겠습니다. 이에 대한 원인과 제안에 대한 아이디어는 저에게 큰 도움이 될 것입니다. 미리 감사드립니다.


7
안녕하세요.이 문제를 어떻게 해결했는지 설명해 주시겠습니까? 나는 아래의 대답은 감각을 많이하지 않습니다 두려워
JayPex

4
@ApexFred, Docker 컨테이너는 VM과 다릅니다. 그들은 응용 프로그램을 실행하도록 설계되었습니다. 애플리케이션이 종료되면 컨테이너도 종료됩니다. 이 경우 사용자는 컨테이너의 "application"을 "echo"명령으로 설정했습니다. "echo"명령이 에코를 수행 한 다음 종료되기 때문에 컨테이너도 명령으로 종료됩니다. 컨테이너를 다시 시작하면 에코를 수행하고 다시 종료합니다. EXEC 명령에는 실행중인 컨테이너가 필요합니다. 컨테이너가 종료되었으므로 추가 명령을 실행하는 데 사용할 수 없습니다.
duct_tape_coder

답변:


30

컨테이너 79b3fa70b51decho.

즉, 시작, 에코 및 즉시 종료됩니다.

다음 docker exec명령 은 컨테이너에 자신을 연결하고 명령을 실행하기 위해 실행중인 것을 찾지 못합니다. 너무 늦었습니다. 컨테이너가 이미 종료되었습니다.

docker exec명령은 실행중인 컨테이너에서 새 명령을 실행합니다.

사용하여 시작된 명령 docker exec은 컨테이너의 기본 프로세스 (PID 1)가 실행되는 동안에 만 실행됩니다.


1
안녕하세요 VonC, 귀하의 의견에 감사드립니다. 이미지의 터미널에 들어가려면 어떻게해야합니까?
Stranger

3
@Udhayakumar docker run -it --rm udhayakumar/busyboxwithtouch세션을 열려면 간단한 것으로 충분해야합니다. 기본 진입 점은 / bin / sh 여야하지만 Dockerfile에 따라 다릅니다. 다른 진입 점 및 / 또는 다른 CMD를 정의했을 수 있습니다.
VonC 2015

50
안녕하세요.이 문제를 어떻게 해결했는지 설명해 주시겠습니까? 나는이 대답은 감각을 많이하지 않습니다 두려워
JayPex

2
@Jawad 매개 변수없이 busyboxwithtouch를 실행하면 기본적으로 대화 형 셸 (즉시 종료되지 않음)이 설정됩니다. 즉, 나중에 ( docker exec) 첨부 할 수 있습니다.
VonC

61

기본적으로 Docker 컨테이너는 컨테이너에서 실행중인 작업이없는 경우 즉시 종료됩니다.

컨테이너를 백그라운드에서 계속 실행하려면 다음을 사용하여 실행하십시오 --detach(또는-d ) 인수를 .

예를 들어:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

22

기본 프로세스를 다시 시작할 수없는 경우 (충분히 오래) commit컨테이너가 새 이미지로 이동하고이 이미지에서 새 컨테이너를 실행할 가능성도 있습니다 . 이것이 일반적인 모범 사례 워크 플로 는 아니지만 실패한 스크립트를 가끔 디버그하는 것이 정말 유용하다는 것을 알게되었습니다.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

동일한 단계를 따랐지만 이전에 액세스 할 수 있었던 브라우저에서 액세스 할 수없는 새로 만든 컨테이너
Muhammad Muazzam

1
이 명령은 bash컨테이너에서 프로세스를 시작합니다 . 이전에 웹 서버가 실행 중이었을 것이므로 서버를 백업하는 데 어떤 명령을 사용해야하는지 확인해야합니다.
Matthias Kuhn

10

먼저 도커 컨테이너를 시작해야합니다.

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

그 후 도커 컨테이너를 확인하십시오.

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

그런 다음 아래 명령을 사용하여 실행하십시오.

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

답변을 설명하는 텍스트를 추가하면 도움이 될 것입니다.
Lauren Van Sloun

9

이는 스크립트 가 요청을 기다리는 서비스를 시작하지 않는 이미지에서 발생 하므로 컨테이너는 스크립트의 끝에서 종료됩니다.

이는 일반적으로 대부분의 기본 OS 이미지 (centos, debian 등) 또는 노드 이미지의 경우입니다.

가장 좋은 방법은 이미지 를 대화 형 모드 로 실행하는 것입니다. 입니다. 노드 이미지를 사용한 아래 예 :

docker run -it node /bin/bash

출력은

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

여기에 저에게 효과적이었습니다.

컨테이너 ID를 얻고 다시 시작하십시오.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

그 이유는 받아 들여진 대답이 말한 것입니다. 이 문제에 대한 이해를 돕기 위해 몇 가지 추가 정보를 추가합니다.

  1. 컨테이너의 상태를 포함 Created, Running, Stopped, Exited, Dead등 나는 알고있다.
  2. 실행 docker create하면 docker 데몬은 상태가 Created.
  3. docker startdocker 데몬은 상태가 Created또는 인 기존 컨테이너를 시작합니다 Stopped.
  4. 우리가 실행되면 docker run, 고정 표시기 데몬은 두 단계를 완료합니다 : docker createdocker start.
  5. docker stop, 분명히 고정 표시기 데몬은 컨테이너를 중지합니다. 따라서 컨테이너는 Stopped상태가됩니다.
  6. 가장 중요한 것은 컨테이너가 실제로 오랜 시간 프로세스를 보유하고 있다고 상상합니다. 프로세스가 종료되면 컨테이너 보유 프로세스도 종료됩니다. 따라서이 컨테이너의 상태는 Exited.

프로세스는 언제 종료됩니까? 다시 말해, 프로세스는 무엇이며 어떻게 시작 했습니까?
대답은 CMDdockerfile 또는 command다음 표현식에 있으며 bash일부 이미지에는 기본적으로 ubutu : 18.04가 있습니다.

docker run ubuntu:18.04 [command]


2

Dockerfile을 사용하여 비슷한 것을 시도하는 사람을 위해 ...

분리 모드로 실행하면 도움이되지 않습니다. 명령이 차단되지 않는 경우 컨테이너는 항상 종료 (실행 중지)됩니다. 이것은 bash의 경우입니다.

이 경우 해결 방법은 다음과 같습니다. 1. 결과 이미지를 커밋합니다. (container_name = 이미지를 기반으로 할 컨테이너 이름, image_name = 생성 할 이미지 이름 docker commit container_name image_name 2. 사용 docker run은 새 이미지를 사용하여 새 컨테이너를 만들고 실행할 명령을 지정합니다. 여기서는 "bash"를 실행합니다. docker run -it image_name bash

이것은 당신이 찾고있는 대화 형 로그인을 얻을 것입니다.


2

docker run -it <image_id> /bin/bash

대화 형 모드에서 실행 한 다음 bash 셸을 실행합니다.


1
-d여기에 깃발이 오타 라고 생각 합니까?
Ian Buss

1

다음은 Docker 컨테이너가 정상적으로 종료되고 Dockerfile을 편집 할 수있는 솔루션입니다.

일반적으로 Docker 컨테이너가 실행되면 명령을 실행하여 애플리케이션이 제공됩니다. 로부터 Dockerfile 참조 ,

CMD 및 ENTRYPOINT 명령어는 모두 컨테이너를 실행할 때 실행되는 명령을 정의합니다. ... Dockerfile은 CMD 또는 ENTRYPOINT 명령 중 하나 이상을 지정해야합니다.

이미지를 빌드하고 CMD 또는 ENTRYPOINT로 명령을 지정하지 않으면 기본 이미지의 CMD 또는 ENTRYPOINT 명령이 실행됩니다.

예를 들어 공식 Ubuntu Dockerfile에는 CMD ["/bin/bash"] ( https://hub.docker.com/_/ubuntu )가 있습니다. 이제 bin/bash/명령은 입력을 수락하고docker run -it IMAGE_ID STDIN을 컨테이너에 연결합니다. 그 결과 대화 형 터미널이 생기고 컨테이너가 계속 실행됩니다.

CMD 또는 ENTRYPOINT가있는 명령이 Dockerfile에 지정되면 컨테이너를 실행할 때이 명령이 실행됩니다. 이제이 명령이 입력없이 완료 될 수 있으면 완료되고 컨테이너가 종료됩니다. docker run -it IMAGE_ID의지 NOT 이 경우 대화 형 터미널을 제공합니다. 예는 아래의 Dockerfile에서 빌드 된 도커 이미지입니다.

FROM ubuntu
ENTRYPOINT echo hello 

이 이미지의 터미널로 이동해야하는 경우 진입 점 명령을 수정하여 컨테이너를 계속 실행해야합니다.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

를 사용하여 컨테이너를 정상적으로 실행 한 후 docker run IMAGE_ID다른 터미널로 이동하여을 사용 docker exec -it CONTAINER_ID bash하여 컨테이너의 터미널을 가져올 수 있습니다.


"그리고 Dockerfile을 편집 할 수 있습니다.": 여기에 핵심 포인트가 있습니다. 찬성.
VonC

0

제 경우에는 Dockerfile의 상위 디렉토리의 특정 파일 이름과 디렉토리 이름을 변경했습니다. 컨테이너가 다시 시작하는 데 필요한 매개 변수를 찾지 못하기 때문입니다.

원래 이름으로 다시 이름을 바꾼 후 용기는 버터처럼 시작되었습니다.


0

나는 이것에 대해 다른 견해를 가지고 있습니다. 나는 docker ps도커 컨테이너가 실행중인 것을 볼 수 있었고 다시 시작하려고 시도했지만 세션을 얻으려고하자마자 New-PSSession -ContainerId $containerId -RunAsAdministrator오류가 발생했습니다.

## [error] New-PSSession : 입력 ContainerId xxx가 존재하지 않거나 ## [error] 해당 컨테이너가 실행되고 있지 않습니다.

내 문제는 내가 네트워크 서비스로 실행 중이었고 Docker 명령을 실행할 수있는 권한을 부여했지만 컨테이너를 볼 수있는 충분한 권한이 없었습니다 (도커 보안 그룹 구성 사용).

컨테이너 작업을 활성화하는 방법을 몰랐기 때문에 대신 관리자 권한으로 실행하도록 되돌려 야했습니다.

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