进入Swarm容器的Shell

19

我无法连接到运行在swarm上的容器。似乎以下方法不起作用:

docker exec -it <container_ID> bash

这里是一些输出:

>$ docker service ls
ID            NAME          REPLICAS  IMAGE                              COMMAND
4rliefwe74o5  login         1/1       login-arm64:1.0


>$ docker service ps login
ID                         NAME     IMAGE                       NODE               DESIRED STATE  CURRENT STATE          ERROR
2jk3s2xs7ce62piunbkiptypz  login.1  login-arm64:1.0  odroid64-cluster4  Running        Running 5 minutes ago

那我就会执行:

$ docker exec -it 2jk3s2xs7ce62piunbkiptypz bash
$ docker exec -it login.1 bash

并查看以下错误

守护进程的错误响应: 没有这个容器: 2jk3s2xs7ce62piunbkiptypz

守护进程的错误响应: 没有这个容器: login.1


发布错误信息,我猜想是 bash 而不是 bash" - user2915097
更新了原始帖子。基本上,Docker看不到这些容器。 - Andi Jay
2个回答

23

使用 docker ps 命令查找可用的名称。在 CONTAINER IDNAMES 下面查看,任何一个都可以。

>$ docker ps
CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS               NAMES
e53bff8bebfc        login-arm64:1.0   "/bin/sh -c 'node ser"   27 seconds ago      Up 25 seconds                           login.1.cg7fltcu3wfe7ixtnqzg8myy1

>$ docker exec -it e53bff8bebfc bash
root@e53bff8bebfc:/#

长名称的格式为$SERVICE_NAME.$REPLICA_NUMBER.$ID_FROM_SERVICE_PS

>$ docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 bash
root@e53bff8bebfc:/#

在我这种情况下,长名称不能使用,但“容器 ID”可以使用。 - TGarrett
这对每个人可能都很明显,只有我不知道。但是,如果有人以同样的方式被弄糊涂了,那么请注意:docker ps 命令必须在 swarm 的 worker 节点上运行,否则在 master 上运行 docker ps 命令将无法显示任何正在运行的容器。 - Aliaksei Kaniaveha
1
一个小补充:如果你在 docker ps 中找不到想要的容器,但在 docker service ps 中看到了,那么请检查 docker service ps 列出的 NODE,并登录到 那个 主机上,而不是你最初启动的主节点。从那里,你可以像 @sam-myers 描述的那样使用 docker exec - Sarah Messer

11

这是一个比较老的问题,但我想提供我的两分意见:我经常运行以下命令:

docker exec -it $(docker ps -q -f name="login*") sh

-q 只返回容器ID

-f name="login*"基于容器名称应用过滤器,使用正则表达式

这很方便,因为启动新容器会更改容器名称并添加一些随机字符。重要的是您的过滤器只返回一个容器,所以请指定名称以获得唯一结果。例如:如果您有一个名为"monster"和一个名为"monitor"的容器,则需要使用 -f name="moni*"来排除“monster”容器。

该命令将产生类似以下内容的结果:

docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 sh


“*”真的有用吗?我不使用它也可以获取容器ID。 - AymDev
也许 Docker 二进制文件在基于正则表达式进行过滤时会做一些聪明的事情,我不知道这一点。这只是我使用它的方式 :)。 - Kenny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接