나는 완전히 도커의 초보자입니다. 다음과 같이 종료 된 컨테이너를 시작하려고했습니다.
-
을 사용하여 사용 가능한 모든 컨테이너를 나열했습니다
docker ps -a. 다음과 같이 나열되었습니다. -
종료 단계에있는 컨테이너를 시작하고 해당 이미지의 터미널로 들어가기 위해 다음 명령을 입력했습니다.
docker start 79b3fa70b51d docker exec -it 79b3fa70b51d /bin/sh -
다음 오류가 발생합니다.
FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running
하지만 docker start 79b3fa70b51d. 모든 것이 정상적으로 작동하면 정상적인 출력으로 컨테이너 ID를 던집니다. 이 오류의 원인이 무엇인지 잘 모르겠습니다. 이에 대한 원인과 제안에 대한 아이디어는 저에게 큰 도움이 될 것입니다. 미리 감사드립니다.
답변
컨테이너 79b3fa70b51d는 echo.
즉, 시작, 에코 및 즉시 종료됩니다.
다음 docker exec명령 은 컨테이너에 자신을 연결하고 명령을 실행하기 위해 실행중인 것을 찾지 못합니다. 너무 늦었습니다. 컨테이너가 이미 종료되었습니다.
이
docker exec명령은 실행중인 컨테이너에서 새 명령을 실행합니다.사용하여 시작된 명령
docker exec은 컨테이너의 기본 프로세스 (PID 1)가 실행되는 동안에 만 실행됩니다.
답변
기본적으로 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:/#
답변
기본 프로세스를 다시 시작할 수없는 경우 (충분히 오래) 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:/#
답변
먼저 도커 컨테이너를 시작해야합니다.
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:/#
답변
이는 스크립트 가 요청을 기다리는 서비스를 시작하지 않는 이미지에서 발생 하므로 컨테이너는 스크립트의 끝에서 종료됩니다.
이는 일반적으로 대부분의 기본 OS 이미지 (centos, debian 등) 또는 노드 이미지의 경우입니다.
가장 좋은 방법은 이미지 를 대화 형 모드 로 실행하는 것입니다. 입니다. 노드 이미지를 사용한 아래 예 :
docker run -it node /bin/bash
출력은
root@cacc7897a20c:/# echo $SHELL
/bin/bash
답변
여기에 저에게 효과적이었습니다.
컨테이너 ID를 얻고 다시 시작하십시오.
docker ps -a --no-trunc
ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
답변
그 이유는 받아 들여진 대답이 말한 것입니다. 이 문제에 대한 이해를 돕기 위해 몇 가지 추가 정보를 추가합니다.
- 컨테이너의 상태를 포함
Created,Running,Stopped,
Exited,Dead등 나는 알고있다. - 실행
docker create하면 docker 데몬은 상태가Created. - 때
docker startdocker 데몬은 상태가Created또는 인 기존 컨테이너를 시작합니다Stopped. - 우리가 실행되면
docker run, 고정 표시기 데몬은 두 단계를 완료합니다 :docker create와docker start. - 때
docker stop, 분명히 고정 표시기 데몬은 컨테이너를 중지합니다. 따라서 컨테이너는Stopped상태가됩니다. - 가장 중요한 것은 컨테이너가 실제로 오랜 시간 프로세스를 보유하고 있다고 상상합니다. 프로세스가 종료되면 컨테이너 보유 프로세스도 종료됩니다. 따라서이 컨테이너의 상태는
Exited.
프로세스는 언제 종료됩니까? 다시 말해, 프로세스는 무엇이며 어떻게 시작 했습니까?
대답은 CMDdockerfile 또는 command다음 표현식에 있으며 bash일부 이미지에는 기본적으로 ubutu : 18.04가 있습니다.
docker run ubuntu:18.04 [command]

