Docker ssh,返回容器显示意外结果

Docker ssh, back to container showing unexpected results

我正在研究 Docker 文档,但我很难理解创建容器、ssh 和 ssh 返回的概念。

我创建了一个容器 docker run -ti ubuntu /bin/bash

然后,它启动容器,我可以 运行 命令。 docker ps 给我

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
0e37da213a37        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       keen_sammet

问题是我退出容器后无法通过 ssh 返回。 我试过 docker attach 给我 Error: No such container 我试过 docker exec -ti <container>/bin/bash 给我同样的信息 Error: No such container

如何 运行 和 ssh 返回容器?

当你exit bash 进程时,容器退出(一般情况下,当前台进程退出时,容器也会退出)。您看到的错误消息准确地描述了这种情况(容器不再是 运行ning)。

如果您希望能够 docker exec 进入容器,您将需要 运行 某种持久命令。例如,如果您要 运行:

docker run -ti -d --name mycontainer ubuntu bash

这将启动一个 "detached" 容器。这意味着您已经开始 bash,但它只是闲逛,无所事事。您可以使用 docker exec 在此容器中启动一个新进程:

$ docker exec -it mycontainer ps -fe
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 16:28 pts/0    00:00:00 bash
root        17     0  0 16:28 pts/1    00:00:00 ps -fe

或:

$ docker exec -it mycontainer bash

在这种情况下,确实没有理由将 bash 作为主要进程启动,因为您没有与它进行交互。您可以轻松 运行...

docker run -ti -d --name mycontainer ubuntu sleep inf

...并且行为是相同的。

所有这些最常见的用例是当您的 docker run 命令启动某种持久服务(如 Web 服务器或数据库服务器等)时,然后您使用 docker exec 执行诊断或维护任务。

docker attach 命令将重新连接您与分离容器的主控制台。换句话说,如果我们 return 初始示例:

docker run -ti -d --name mycontainer ubuntu bash

您可以通过 运行ning:

连接到 那个 bash 进程(而不是启动一个新进程)
docker attach mycontainer

此时,exit会导致容器退出。

首先,您不会通过 ssh 连接到 docker 容器(除非您在该容器中有一个 sshd 进程)。但是您可以使用 docker exec -ti mycontainer bash -l

执行命令

但是您只能在 运行ning 容器上执行命令。如果容器已经退出,您必须使用另一种方法:从容器创建一个图像,然后 运行 一个新的。

这是一个例子。首先,我创建一个容器并在其中创建一个文件,然后退出它。

$ docker run -ti debian:9-slim  bash -l
root@09f889e80153:/# echo aaaaaaaaaa > /zzz
root@09f889e80153:/# cat /zzz 
aaaaaaaaaa
root@09f889e80153:/# exit
logout

如您所见,容器已退出(Exited (0) 24 秒前)

$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
09f889e80153        debian:9-slim         "bash -l"                45 seconds ago      Exited (0) 24 seconds ago                            thirsty_hodgkin

所以我用 docker commit

创建了一个新图像
$ docker commit 09f889e80153 bla
sha256:6ceb88470326d2da4741099c144a11a00e7eb1f86310cfa745e8d3441ac9639e

所以我可以 运行 一个包含以前容器内容的新容器。

$ docker run -ti bla bash -l
root@479a0af3d197:/# cat zzz 
aaaaaaaaaa