Docker蜂拥而至。无法 运行 对 docker 堆栈的容器执行,因为 "docker container list" 没有找到容器
Docker swarm. Unable to run exec against a container of a docker stack, because "docker container list" does not find the container
第 1 部分
我正在尝试对堆栈或服务中的其中一个容器执行“exec”。我遵循了此处提供的答案 execute a command within docker swarm service as well as on the official Docker documentation here 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
- 下面的两个命令return为“redis”清零记录
docker ps --filter name=redis -q
docker container list
下面的两个命令return没有“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 游,我能够成功重现示例 https://docs.docker.com/engine/swarm/secrets/.
的行为
在第二个环境中 docker ps 能够找到(列出)作为服务启动的 redis 容器。
下面的命令return是一条记录。
docker ps --filter name=redis -q
3de724329171
我能够通过运行以下命令
在此容器上成功运行“执行”
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
已解决(感谢 Chris Becke)
我需要尝试从节点访问服务的容器,容器是 运行ning。
我将此信息归功于 Chris Becke。
第 1 节 中的群设置是多节点设置,而第 2 节 中的群设置是单个节点(manager/worker) 设置。
第 1 部分中的容器被分派到工作节点,而不是我试图向其提供 exec 命令的节点。
一旦我登录到工作节点,我就能够成功地 运行 在服务容器上执行“exec”命令。
要使用 docker 访问多节点 swarm 中的容器,以避免必须单独登录每个 vm / docker 主机,您需要确保您的 docker swarm节点设置为远程访问。
docker 守护进程有参数来公开一个 public 套接字:2375 用于不安全的,或 :2376 用于 mtls 保护的通信。除了大多数沙盒实验室环境外,建议使用 mtls。
或者,无密码 ssh 访问(在每个服务器上注册本地 .ssh_id)允许您使用 ssh urls 远程访问 docker,这是推荐的选项。
一旦启用了对 docker 的 ssh 或 tcp 访问,您就可以将远程节点 url 传递给 docker,将其设置在环境变量中,或通过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
第 1 部分
我正在尝试对堆栈或服务中的其中一个容器执行“exec”。我遵循了此处提供的答案 execute a command within docker swarm service as well as on the official Docker documentation here 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
- 下面的两个命令return为“redis”清零记录
docker ps --filter name=redis -q
docker container list
下面的两个命令return没有“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 游,我能够成功重现示例 https://docs.docker.com/engine/swarm/secrets/.
的行为在第二个环境中 docker ps 能够找到(列出)作为服务启动的 redis 容器。 下面的命令return是一条记录。
docker ps --filter name=redis -q
3de724329171
我能够通过运行以下命令
在此容器上成功运行“执行”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
已解决(感谢 Chris Becke)
我需要尝试从节点访问服务的容器,容器是 运行ning。
我将此信息归功于 Chris Becke。
第 1 节 中的群设置是多节点设置,而第 2 节 中的群设置是单个节点(manager/worker) 设置。
第 1 部分中的容器被分派到工作节点,而不是我试图向其提供 exec 命令的节点。
一旦我登录到工作节点,我就能够成功地 运行 在服务容器上执行“exec”命令。
要使用 docker 访问多节点 swarm 中的容器,以避免必须单独登录每个 vm / docker 主机,您需要确保您的 docker swarm节点设置为远程访问。
docker 守护进程有参数来公开一个 public 套接字:2375 用于不安全的,或 :2376 用于 mtls 保护的通信。除了大多数沙盒实验室环境外,建议使用 mtls。 或者,无密码 ssh 访问(在每个服务器上注册本地 .ssh_id)允许您使用 ssh urls 远程访问 docker,这是推荐的选项。
一旦启用了对 docker 的 ssh 或 tcp 访问,您就可以将远程节点 url 传递给 docker,将其设置在环境变量中,或通过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