如果我使用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
命令并结束进程
因此,容器未退出的原因有两个:
- 如果你跑步
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
并停止。
一个小时又一个小时后,我得到了!问题是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/