如果我使用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
答案 0 :(得分:1)
Docker容器在命令运行时仍然存在。
您的命令是"/bin/bash"
。
那是
伪终端
因此,当您关闭终端命令(又称容器入口点)时,容器停止。
如果运行不带-it
参数的容器,则会启动bash而不创建会话(pseudo-tty)。
例如,您可以运行:
bash -c "echo 'blabla'"
bash仅运行echo
命令并结束进程。
因此,这是容器未退出的两个原因:
docker container run -t --name u_container ubuntu
您将无法在容器内输入任何命令。由于未附加STDIN。但!您可以通过-t
参数创建伪tty,而无需退出即可启动docker容器。
-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
并停止。
答案 1 :(得分:1)
几个小时后,我明白了!问题是STDIN在容器运行时关闭。 我使用选项-i运行了容器1和容器2。 我运行了没有选项-i的Container 3。 如您在下图中所看到的,我能够启动Container 1和Container 2,但不能启动Container 3。
====原因! ====
每个进程都有三个数据流(STDIN / STDOUT / STDERR)。当容器中正在运行进程时,默认情况下,终端将与容器中正在运行的进程的STDOUT流连接。因此,在终端中运行docker run命令时,所有输出流都是可见的。但是,如果要向容器中正在运行的进程提供输入,则必须连接进程的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/