【问题标题】:Docker swarm. Unable to run exec against a container of a docker stack, because "docker container list" does not find the container码头工人群。无法对 docker 堆栈的容器运行 exec,因为“docker 容器列表”找不到容器
【发布时间】:2021-09-13 18:45:16
【问题描述】:

第 1 节

我正在尝试在堆栈或服务中的一个容器上执行“exec”。我已按照此处提供的答案execute a command within docker swarm service 以及此处的官方 Docker 文档https://docs.docker.com/engine/swarm/secrets/ 进行操作,但似乎“docker 容器列表”及其变体(“docker ps”)似乎没有找到“docker”中列出的任何容器服务列表”。

请参阅下面来自https://docs.docker.com/engine/swarm/secrets/ 的示例,该示例旨在在服务容器上使用“exec”。

1)

printf "This is a secret" | docker secret create my_secret_data -
docker service  create --name redis --secret my_secret_data redis:alpine
docker service ps redis

收益ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 75olesuh9n4h redis.1 redis:alpine virt-05 Running Running 16 minutes ago

  1. 以下两个命令为“redis”返回零记录
docker ps --filter name=redis -q
docker container list

下面的两个命令没有返回“redis”的记录,因此下面的命令一定不起作用。

docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

在我的环境中可能有什么不同,导致无法重现上面示例中的结果 (https://docs.docker.com/engine/swarm/secrets/)

我的环境如下

$ uname -r
4.18.0-338.el8.x86_64
$ docker version
Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:53:39 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:52:00 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
 runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

第 2 节

我刚刚在另一个节点上初始化了一个 docker swam,我能够成功地重现示例 https://docs.docker.com/engine/swarm/secrets/ 的行为。

在第二个环境中,docker ps 能够找到(列出)作为服务启动的 redis 容器。 下面的命令返回一条记录。

docker ps --filter name=redis -q
3de724329171

通过运行以下命令,我能够在此容器上成功运行“exec”

docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

如果下面给出第二个环境的 docker 版本

$ uname -r
3.10.0-1160.36.2.el7.x86_64
docker version
Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:55:49 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:54:13 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
 runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


【问题讨论】:

  • 从您的问题中不清楚您是在集群模式下运行单节点,还是在运行多节点 docker swarm。在多节点 docker swarm 的情况下,可以将容器安排在与您所在的节点不同的节点上,您需要更改为它或远程访问它
  • @Chris Becke 谢谢你的建议。 Section 1 中的 swarm 设置是多节点设置,而 Section 2 中的 swarm 设置是单节点(manager/worker)设置。第 1 节中的容器被分派到一个工作节点,而不是我试图向其发出 exec 命令的那个。一旦我登录到工作节点,我就能够在服务容器上成功运行“exec”命令。

标签: docker docker-swarm


【解决方案1】:

要使用 docker 访问多节点集群中的容器,为了避免必须单独登录每个 vm / docker 主机,您需要确保您的 docker swarm 节点已设置为远程访问。

docker 守护进程具有公开公共套接字的参数:2375 表示不安全,或 :2376 表示 mtls 受保护的通信。建议将 mtls 用于除沙盒化程度最高的实验室环境之外的任何环境。 或者,无密码 ssh 访问(您在每台服务器上注册本地 .ssh_id)允许您使用 ssh url 远程访问 docker,这是推荐的选项。

一旦您启用了对 docker 的 ssh 或 tcp 访问,您就可以将远程节点 url 传递给 docker,将其设置在 env 变量中,或通过 docker 上下文使用它:

# using DOCKER_HOST
export DOCKER_HOST=tcp://lab-node1:2375
docker container ls
# Passing a url directly
docker -H ssh://user@lab-node2 container ls
# Using a docker context
docker context create node1 --docker "host=ssh://user@node1"
docker context use node1
docker container ls

一旦您拥有多 docker 访问权限,请确保 docker 指向管理器节点并获取服务的相关详细信息:

在这种情况下,我们需要知道服务任务正在运行的节点,以及任务的容器名称,它是名称和id的组合。

docker service ps your-service --format '{{.Node}} {{.Name}}.{{.ID}}' --no-trunc --filter desired-state=running

现在您已经有了远程节点,假设您已经为每个节点创建了上下文,然后是这样的命令(其中 $containername 是 '{{.Name}}.{{.ID}}' 字符串。

docker -c $node exec $containername cmdline

【讨论】:

    【解决方案2】:

    已解决(感谢 Chris Becke)

    我需要尝试从容器正在运行的节点访问服务的容器。

    我将这些信息归功于 Chris Becke。

    Section 1 中的 swarm 设置是多节点设置,而 Section 2 中的 swarm 设置是单节点(manager/worker)设置。 第 1 节中的容器被分派到一个工作节点,而不是我试图向其发出 exec 命令的那个。
    一旦我登录到工作节点,我就能够在服务容器上成功运行“exec”命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多