Docker容器未以ubuntu映像开始(Docker启动)



如果我使用docker container run ubuntu直接从Ubuntu映像运行容器,我可以使用docker start <CONTAINER ID>轻松地重新启动它。然而,我通过docker run <ID IMAGE>使用映像运行容器,一旦我退出伪终端,它就完全丢失了。

我注意到,每次我试图重新启动它时,状态都会更新,这意味着主进程开始并立即停止。知道吗?

portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d70eaf7277ea        8 days ago          72.9MB
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 3 hours ago                          heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Exited (0) 23 seconds ago                       sleepy_pike
portaivan@training-vm:~$ docker start 3b1b521d62aa
3b1b521d62aa
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 3 hours ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 2 seconds                                 sleepy_pike
portaivan@training-vm:~$ docker container start 4004895feff9
4004895feff9
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 2 seconds ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 17 seconds                                  sleepy_pike
portaivan@training-vm:~$ docker container start -i 4004895feff9
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4004895feff9        d70eaf7277ea        "/bin/bash"         3 hours ago         Exited (0) 2 seconds ago                       heuristic_lovelace
3b1b521d62aa        ubuntu              "/bin/bash"         3 hours ago         Up 28 seconds                                  sleepy_pike

Docker容器在命令运行时存在
您的命令是"/bin/bash"

这就是

伪终端

因此,当您关闭终端命令(也称为容器入口点(时,容器将停止。

  • 第1版。Nuances解释

如果您在没有-it参数的情况下运行容器,则启动bash时不会创建会话(伪tty(。

例如,您可以运行:

bash -c "echo 'blabla'"

bash只运行echo命令并结束进程
因此,容器未退出的原因有两个:

  1. 如果你跑步
docker container run -t --name u_container ubuntu

您将无法在容器中输入任何命令。因为未连接STDIN。但是您可以通过-t参数创建伪tty,并且docker容器可以在不退出的情况下启动。

  1. 只有-i参数bash时,不要创建tty,希望尽快死亡。但是docker保持容器运行并尝试无限地传递输入,即使您没有连接到容器(请参阅帮助(。虽然我们可以停止bash插入exit
-i, --interactive Keep STDIN open even if not attached

所以,简单的解释是:这取决于您如何运行shell。作为循环和侦听的伪终端或只是作为命令解释器。你可以将它与python进行比较
如果您运行python,它将是python shell。如果运行python /script/script.py,python只执行script.py并停止。

一个小时又一个小时后,我得到了!问题是STDIN在容器运行时关闭。我使用选项-I运行容器1和容器2。我在没有选项-I的情况下运行了Container 3。如下图所示,我可以启动容器1和容器2,但不能启动容器3。

===原因====

每个进程都有三个数据流(STDIN/STDOUT/STDERR(。当进程在容器中运行时,默认情况下,终端与容器中运行的进程的STDOUT流连接。因此,当在终端中运行dockerrun命令时,所有输出流都是可见的。但是,如果您想为容器中正在运行的进程提供输入,那么您必须连接到进程的STDIN通道,这在默认情况下不是通过docker run-i命令完成的。

portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
portaivan@training-vm:~$ docker container run -it --name container01 ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6a5697faee43: Pull complete
ba13d3bc422b: Pull complete
a254829d9e55: Pull complete
Digest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Status: Downloaded newer image for ubuntu:latest
root@03b44b790cfa:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@03b44b790cfa:/# exit
exit
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
03b44b790cfa        ubuntu              "/bin/bash"         14 seconds ago      Exited (0) 5 seconds ago                       container01
portaivan@training-vm:~$ docker container start 03b44b790cfa
03b44b790cfa
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
03b44b790cfa        ubuntu              "/bin/bash"         28 seconds ago      Up 2 seconds                            container01
portaivan@training-vm:~$ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d70eaf7277ea        8 days ago          72.9MB
portaivan@training-vm:~$ docker container run -it --name container02 d70eaf7277ea
root@e6123c0bbe81:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e6123c0bbe81:/# exit
exit
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         10 seconds ago       Exited (0) 3 seconds ago                       container02
03b44b790cfa        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                              container01
portaivan@training-vm:~$ docker container start e6123c0bbe81
e6123c0bbe81
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         22 seconds ago       Up 2 seconds                            container02
03b44b790cfa        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       container01
portaivan@training-vm:~$ docker container run --name container03 d70eaf7277ea
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7adbb0089b56        d70eaf7277ea        "/bin/bash"         3 seconds ago       Exited (0) 2 seconds ago                       container03
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         2 minutes ago       Up About a minute                              container02
03b44b790cfa        ubuntu              "/bin/bash"         3 minutes ago       Up 2 minutes                                   container01
portaivan@training-vm:~$ docker container start 7adbb0089b56
7adbb0089b56
portaivan@training-vm:~$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7adbb0089b56        d70eaf7277ea        "/bin/bash"         15 seconds ago      Exited (0) 2 seconds ago                       container03
e6123c0bbe81        d70eaf7277ea        "/bin/bash"         2 minutes ago       Up About a minute                              container02
03b44b790cfa        ubuntu              "/bin/bash"         3 minutes ago       Up 3 minutes                                   container01
portaivan@training-vm:~$

参考

https://docs-stage.docker.com/engine/reference/commandline/container_run/https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/

最新更新